verkeerd wegschrijven gegevens via userform

Status
Niet open voor verdere reacties.

bloemenman

Gebruiker
Lid geworden
18 jun 2012
Berichten
118
hallo helpers,


onlangs heeft MDN111 mij super geholpen met een schitterende code voor het wegschrijven van gegevens in een ander bestand via userform. Inmiddels heb ik deze userform in gebruik genomen en valt me nu pas op dat de datum die ingevuld wordt in de userform verkeerd wordt weggeschreven.
9 maart 2015 wordt weggeschreven als 03-09-2015

De code werkt perfect maar omdat ik nog maar pas bezig ben met het gebruik van userform heb ik geen idee hoe ik dit moet aanpassen.
Wie kan mij helpen. Ik hoop dat MDN111 deze vraag ook leest:)

Bekijk bijlage Urenregistratie.xls
 
Er zijn meerdere plaatsen waar dit aangepast zou kunnen worden. staat de datum notatie in je "sjabloon" wel goed? die wordt namelijk gecopieerd, maar mogelijk is de format niet goed overgenomen?

Volgens de remarks in je code wordt de data namelijk wel in het juiste formaat intern opgeslagen voordat het wordt weggeschreven.
 
Bedankt voor je reactie Wampier, hier heb ik naar gekeken maar ik kan het niet vinden.
 
Code:
myArray(4) = cdate(Me.txtDatum.Value)
 
Dag bloemenman,

Inderdaad, het weergeven van de datums in het ander bestand is niet koosjer. :o M'n excuses daarvoor.

De oplossing van HSV is logisch want dan heb je een echte datumwaarde in plaats van een string om naar het bestand weg te schrijven. Ik heb dat toch maar eens getest en ben daarbij op een ander probleem gestuit. De in de textbox ingevoerde datum wordt gebruikt voor het bepalen van de bestandsnaam met de regel:
Code:
cWB = cPath & "\" & "Uren-van-de-maand-" & Right(a(4), 4) & Mid(a(4), 4, 2) & ".xls"
Als we een datum hebben waarvan de dag groter is dan of gelijk aan 10, dan is er geen probleem. Bijvoorbeeld een datum van 15/02/2015 levert "Uren-van-de-maand-201502.xls" als bestandsnaam op.

Als we echter een datum hebben waarvan de dag kleiner is dan 10, dan is er wel een probleem. Bijvoorbeeld een datum van 09/02/2015 levert dan "Uren-van-de-maand-20152/.xls" als bestandsnaam op, en dat gaat fout.

De reden daarvan is dat de hogergenoemde code gebruik maakt van de Right()- en Mid()-functies. Dat zijn functies om toe te passen op een string, maar de waarde van het array-element a(4) is nu een datumwaarde (vartype = 7) geworden, en string-functies toepassen op datumwaarden is volgens mij liefst te vermijden.

Er is dus nog een extra wijziging nodig om de bestandsnaam te bepalen aan de hand van een string. Hierna de gewijzigde code aan het begin van de functie:
Code:
Function SaveDataToFile(a) As Boolean
Dim oWB As Workbook, oSh As Worksheet
Dim cWB As String, cPath As String, cName As String
Dim nRow As Long, i As Integer
[COLOR="#FF0000"]Dim cDatum As String  'Wijziging 11/03/2015.[/COLOR]

'Eerst het workbook bepalen waarin we de gegevens moeten opslaan.
'De datum staat in het 4de array-element.
[COLOR="#FF0000"]'Die moeten we eerst omvormen tot een string om de bestandsnaam te bepalen.[/COLOR]
cPath = IIf(Destination_Path = "", ThisWorkbook.Path, Destination_Path)
[COLOR="#FF0000"]cDatum = Format(a(4), "dd/mm/yyyy")  'Wijziging 11/03/2015.[/COLOR]
cWB = cPath & "\" & "Uren-van-de-maand-" & Right([COLOR="#FF0000"]cDatum[/COLOR], 4) & Mid([COLOR="#FF0000"]cDatum[/COLOR], 4, 2) & ".xls"

Hopelijk nu geen problemen meer :thumb:

Grtz,
MDN111.
 
Ik vind de rest van je code erg netjes, maar als het een echte datum is, waarom nu niet "DAY" en "MONTH" functies gebruiken in plaats van een cast naar een string stringfuncties om vervolgens die informatie te krijgen?
 
Dag wampier ,

Inderdaad, het is mogelijk om de Day()- en Month()-functies te gebruiken.

De bedoeling is om een bestandsnaam te vormen aan de hand van een datum. Die bestandsnaam is een string, dus dacht ik de Format()-functie te gebruiken om direct een string te verkrijgen. Day() en Month() geven een integer wat dus één of twee cijfers kan zijn. Een bestandsnamen van de maanden vóór oktober zijn dan korter als die van vanaf oktober, zoals bijvoorbeeld:
"Uren-van-de-maand-20152.xls"
"Uren-van-de-maand-201510.xls"

Dat is misschien (of waarschijnlijk) niet belangrijk, maar
"Uren-van-de-maand-201502.xls"
"Uren-van-de-maand-201510.xls"
vind ik gewoon iets netter, en als je de bestanden nadien in de Windows-explorer rangschikt op bestandsnaam, dan volgen ze ook chronologisch op elkaar.

Dat is zowat de reden waarom ik geen Day()- en Month()-functies gebruikt heb. Eerlijk gezegd was het ook niet bij mij opgekomen. Kwestie van gewoonte, denk ik.

Grtz,
MDN111.
 
Hallo MDN111,

bij het opslaan van het bestand ging het inderdaad niet goed. Ben weer erg blij jouw oplossing! Veel dank hiervoor.

Ik heb nog een vraag die eigenlijk voort komt uit wat je vorige keer schreef dat mensen fouten kunnen maken bij het invullen van de userform. Ik heb bij het in gebruik nemen inderdaad ervaren dat mensen, telkens als ze het formulier invullen, hun naam anders schrijven, bijvoorbeeld met of zonder hoofdletter of soms een spatie achter hun voornaam voordat ze bij het volgende vakje hun achternaam invullen.

Ik hoop dat ik deze als aanvullende vraag hier mag stellen en of je me hiermee kunt helpen?

alvast bedankt
MVG
Bloemenman

Dag bloemenman,

Inderdaad, het weergeven van de datums in het ander bestand is niet koosjer. :o M'n excuses daarvoor.

De oplossing van HSV is logisch want dan heb je een echte datumwaarde in plaats van een string om naar het bestand weg te schrijven. Ik heb dat toch maar eens getest en ben daarbij op een ander probleem gestuit. De in de textbox ingevoerde datum wordt gebruikt voor het bepalen van de bestandsnaam met de regel:
Code:
cWB = cPath & "\" & "Uren-van-de-maand-" & Right(a(4), 4) & Mid(a(4), 4, 2) & ".xls"
Als we een datum hebben waarvan de dag groter is dan of gelijk aan 10, dan is er geen probleem. Bijvoorbeeld een datum van 15/02/2015 levert "Uren-van-de-maand-201502.xls" als bestandsnaam op.

Als we echter een datum hebben waarvan de dag kleiner is dan 10, dan is er wel een probleem. Bijvoorbeeld een datum van 09/02/2015 levert dan "Uren-van-de-maand-20152/.xls" als bestandsnaam op, en dat gaat fout.

De reden daarvan is dat de hogergenoemde code gebruik maakt van de Right()- en Mid()-functies. Dat zijn functies om toe te passen op een string, maar de waarde van het array-element a(4) is nu een datumwaarde (vartype = 7) geworden, en string-functies toepassen op datumwaarden is volgens mij liefst te vermijden.

Er is dus nog een extra wijziging nodig om de bestandsnaam te bepalen aan de hand van een string. Hierna de gewijzigde code aan het begin van de functie:
Code:
Function SaveDataToFile(a) As Boolean
Dim oWB As Workbook, oSh As Worksheet
Dim cWB As String, cPath As String, cName As String
Dim nRow As Long, i As Integer
[COLOR="#FF0000"]Dim cDatum As String  'Wijziging 11/03/2015.[/COLOR]

'Eerst het workbook bepalen waarin we de gegevens moeten opslaan.
'De datum staat in het 4de array-element.
[COLOR="#FF0000"]'Die moeten we eerst omvormen tot een string om de bestandsnaam te bepalen.[/COLOR]
cPath = IIf(Destination_Path = "", ThisWorkbook.Path, Destination_Path)
[COLOR="#FF0000"]cDatum = Format(a(4), "dd/mm/yyyy")  'Wijziging 11/03/2015.[/COLOR]
cWB = cPath & "\" & "Uren-van-de-maand-" & Right([COLOR="#FF0000"]cDatum[/COLOR], 4) & Mid([COLOR="#FF0000"]cDatum[/COLOR], 4, 2) & ".xls"

Hopelijk nu geen problemen meer :thumb:

Grtz,
MDN111.
 
Dag wampier ,

Inderdaad, het is mogelijk om de Day()- en Month()-functies te gebruiken.
...
Dat is zowat de reden waarom ik geen Day()- en Month()-functies gebruikt heb. Eerlijk gezegd was het ook niet bij mij opgekomen. Kwestie van gewoonte, denk ik.

FORMAT, werkt ook op integers ;) je kunt 1 dus prima als 01 forceren. stuk leesbaarder en is ook veilig te gebruiken op computers met andere datum/taalinstellingen.
 
Als je je houdt aan internationale (ISO) afspraken (waar de VS zich ten onrechte aan onttrekt), gaat het ook immer goed:

Code:
format (date,"yyyy-mm-dd")

Dit is een 'small-endian' waarin de kleinste eenheden (de dagen) rechts aan het einde komen te staan.
Dit in tegenstelling tot de 'big-endian' vorm die we gebruiken bij 28-02-2015 (met de jaren rechts aan het einde).
Excel interpreteert de 'small-endian' vorm van een tekenreeks altijd correct, in tegenstelling tot een 'big-endian' tekenreeks.
 
Ok,oplossing: Vlgens je eigen onderwerptititel: Schrijf je gegevens goed weg!
 
Dag wampier,

Je hebt ons op een dwaalspoor gebracht door de Day()-functie te vermelden. :confused: Het gaat over een maandelijks bestand, dus die functie komt er niet aan te pas. Daar had ik niet mogen intrappen. :mad:

Betreft het gebruik van de datumwaarde, is het zoiets wat je bedoelt?
Code:
cWB = cPath & "\" & "Uren-van-de-maand-" & Year(a(4)) & Format(Month(a(4)), "00") & ".xls"

Grtz,
MDN111.
 
Dag bloemenman !

De controle van de gebruikersinvoer is meer een kwestie van functionele analyse. Hierna de elementen die in eerste instantie bij mij opkomen:

  • Voornaam trimmen.
  • Achternaam trimmen.
  • Fouten in de voor- of achternaam. Controleren slechts mogelijk als er een referentiesheet met de namen bestaat.
  • Filiaalnummer moet numeriek zijn.
  • Filiaalnummer moet bestaan. Controleren slechts mogelijk als er een referentiesheet met de filialen bestaat.
  • Datum mag niet in de toekomst liggen.
  • Hoe ver mag de datum in 't verleden liggen?
  • Datuminvoer beperken tot wat in dropdown staat?
  • Mogen er meerdere registraties bestaan voor dezelfde persoon op dezelfde datum?
  • Kan een persoon in meerdere filialen werken op dezelfde datum?
  • Mag de eindtijd vroeger liggen dan de begintijd (bijvoorbeeld shiftwerk)? (gedeelte van de uren liggen dan een dag later).
  • Invoer van de uren beperken tot wat in dropdown staat?
  • ...


Grtz,
MDN111.
 
Hallo MDN111

Ik heb een bestand met alle voor en achternamen van alle medewerkers. Kun je me helpen om die controle toe te passen. In het bestand staan de voor en achternaam in een aparte kolom.
Het probleem zit vooral in het invullen van de naam, dit gebeurd telkens op een andere manier. Bijvoorbeeld met of zonder hoofdletter of het gebruik van een of meerdere spaties. Het programma maakt zo meerdere urenlijsten aan voor een persoon.

Grtz,
Bloemenman
 
Laatst bewerkt door een moderator:
Dag bloemenman !

Hierbij het bestand met de gewijzigde code die controleert of de ingevoerde combinatie van voor- en achternaam bestaat in de sheet met de namen. Omdat ik niet weet welke wijzigingen jij ondertussen zelf hebt aangebracht, heb ik het bestand van 19 januari aangepast.

Grtz,
MDN111.
 

Bijlagen

Hallo MDN111,

Ook deze code ziet er weer super uit.
Net zo als de vorige keren dat je me geholpen hebt! Ik ga er weer mee aan de slag, je hebt mee weer een flink stuk op weg geholpen!
Weer reuze bedankt!

Grtz,
Bloemenman
 
Laatst bewerkt door een moderator:
Hallo MDN111!

Ik heb de code wat aangepast, omdat voor iedere medewerker ook een afkorting wordt gebruikt, heb ik de codes die verwijzen naar de achternaam aangepast. De afkorting moet ingevuld worden bij de txt voornaam. Het lijkt tot zo ver te werken.
Ik heb in de map waar het urenregistratie programma in staat een bestand gevoegd waarin alle afkortingen staan. Ik weet alleen niet hoe ik de controle voor de in gevulde afkorting moet toepassen aan de hand van dit bestand. In het bestand staat de afkorting in kolom c vanaf regel 2.

kun je me hierbij helpen?

Grtz,
Bloemenman
 
Laatst bewerkt door een moderator:
Beste Bloemenman,

Bij het direct reageren op een andere gebruiker hoeft er geen quote gebruikt te worden :)
Een quote is echt alleen als je specifiek op iemand zijn/haar bericht wil reageren.

Ik heb daarom ook alle onnodige quotes verwijderd :)

Veel succes met de vraag en een prettige dag verder :thumb:
 
Oeps sorry.
bedankt voor je berichtje.

Grtz,
Bloemenman
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan