VBA – datum vid kolumnuppdelning
Om du försöker att automatisera kolumnuppdelning via ett makro i Excel VBA, kan du stöta på flera problem. I det här tipset skall vi titta på en typ av datum-problematik som du kan råka ut för.
Problemet med datum vid kolumnuppdelning
Vi tar ett enkelt exempel, en importerad textsträng som vi delar upp i kolumner. I det här fallet baseras uppdelningen på “fasta positioner”.
Sist i textsträngen har vi datumet, vilket i det här fallet kan ställa till vissa problem om vi har otur. För resultatet kan nämligen bli följande:
Som du kan se så konverterade Excel datumet “12 juni 2008” till “6 december 2008”, dvs att Excel bytte plats på dag och månad. Och till ytterligare irritation kan tilläggas att denna konvertering inte sker konsekvent, utan det kan tyvärr bli både det ena och det andra beroende på vilken dator du sätter dig vid. Så enligt mig så rör det sig om en bugg i Excel, dvs ett fel från Microsoft.
En förklaring till buggen har antagligen med det nordamerikanska datumsystemet att göra. I USA skrivs ju datum enligt formeln “månad-dag-år” medan i Europa tillämpas vanligen “dag-månad-år” förutom i Sverige där vi av okänd anledning skriver “år-månad-dag”. Fast konstigast är väl egentligen just den amerikanska datum-versionen.
Lösning på datumproblematiken vid TextToColumns
Som tur är så finns det lösningar som du kan tillämpa, efter det att du stångats med det här datumproblemet ett tag (om du överhuvudtaget upptäcker det innan någon annan gör det åt dig…).
Vi spelar in ett enkelt makro som sköter kolumnuppdelningen
När vi kommer till datumkolumnen så gäller det att vi talar om för Excel exakt hur det importerade datumet skall läsas in. I det aktuella fallet så har vi ett datum av formatet “dag-månad-år”. Markera därför kolumnhuvudet i datumkolumnen och indikera sedan “Column data format”.
Vi tittar närmare på VBA-koden
Nedan ser vi koden som Excel spelade in.
Selection.TextToColumns Destination:=Range("A26"), _ DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), _ Array(7, 1), Array(16, 1), Array(35, 1), Array(57, 4)), _ TrailingMinusNumbers:=True |
Varje ny kolumn specificeras enligt
Array(7, 1) |
Där 7 = teckenposition för kolumnuppdelningen, och 1 = tolka innehållet som text. Just den sistnämnda ettan är vad som orsakar problemet. Excel läser in som text och gör sedan om till datum. Istället vill vi tvinga Excel att läsa in strängen som ett datum redan från början. Och det gör vi genom att ändra xlColumnDataType till
Array(7, xlYMDFormat) |
eller
Array(7, 4) |
för de kolumner som innehåller datum. Det är det vi kan se i koden ovan för den kolumnuppdelning som börjar vid position 57.
Excel ger följande alternativ för xlColumnDataType:
1 | xlGeneralFormat | [General] |
2 | xlTextFormat | [Text] |
3 | xlMDYFormat | [MDY Date] |
4 | xlDMYFormat | [DMY Date] |
5 | xlYMDFormat | [YMD Date] |
6 | xlMYDFormat | [MYD Date] |
7 | xlDYMFormat | [DYM Date] |
8 | xlYDMFormat | [YDM Date] |
9 | xlEMDFormat | [EMD Date] |
10 | xlSkipColumn | [Skip Column] |
Slutsats: Felande datum vid kolumnuppdelning av textfiler
Jag rekommenderar att du gör omfattande tester av dina makron ifall dessa importerar datum till Excel. Om du inte är observant på detta så kan det rsultera i att vissa datum blir rätt medan andra kastar om dag och månad.
Om du implementerar tricket ovan så tvingar du Excel att läsa in ett datum och du kan sova lugnt när dina makron snurrar runt på diverse företag dygnet runt.