[easy_youtube_gallery id=uMK0prafzw0,8Uee_mcxvrw,HcXNPI-IPPM,JvMXVHVr72A,AIXUgtNC4Kc,K8nrF5aXPlQ,cegdR0GiJl4,L-wpS49KN00,KbW9JqM7vho ar=16_9 cols=3 thumbnail=hqdefault controls=0 playsinline=1 privacy=1 title=top wall=1 class=mySuperClass]
Först publicerad: 2009-05-18

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”.

text-to-columns

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:

text-to-columns2

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”.

text-to-columns3

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.