ITサポーターTsuchida

VBA Stepup8

第8章 CSVファイルの数字の文字取込

CSVファイルの取込で必ず問題になるのが、伝票番号や部門番号などの先頭に0のついた数字が消えることです。列番号が決まっているようでしたら、セルに代入する前に、表示形式を文字列に変えてから値を代入します。値を代入してから表示形式を文字列にしてもうまくいきません。一般的にこの方法で対応します。

ただしどの列かわからないけど先頭に必ず0がついていて文字列にする場合は、ちょっと手を加えることで、数値を文字として取込むこともできるようになります。ただし、これには前提がありまして、数字の先頭が0であること、数字の文字数が4桁以上でカンマが含まれていないことが条件です。1~3桁の数字で先頭が0でないものを、文字として判別しながら取込む方法を今のところ私の頭の中ではまだ思いつきません。

文字として取り込むために、文字か数値の判断を行います。まずは、ダブルクォーテーションで括られて途中にカンマがあれば数値、カンマがなければ文字と判定します。

Dim strFlg As Boolean '数値か文字かの判定の変数

Case "," '「"」が偶数なら区切り、奇数ならただの文字

If lngQuate Mod 2 = 0 Then

'プロシージャの引数に数値・文字判定を追加

Call PutCell(i, j, strCell, lngQuate, strFlg)

Else

strCell = strCell & Mid(strRec, k, 1)

'カンマ付きは数値判定

strFlg = False

End If

Case """" '「"」のカウントをとる

lngQuate = lngQuate + 1

strCell = strCell & Mid(strRec, k, 1)

If lngQuate = 1 Then

'クォーテーション付は文字判定

strFlg = True

End If

Case Else

strCell = strCell & Mid(strRec, k, 1)

|

 

PutCellプロシージャに数値文字判定の引数を追加します。 変数をセルに代入する前に、文字か数値の判断をします。ただし、3桁以下の数字は数値であっても文字判定されますので、先頭が0の場合は文字・それ以外は数値とします。

Sub PutCell(ByRef i As Long, ByRef j As Long, _

ByRef strCell As String, ByRef lngQuate As Integer, _

ByRef strFlg As Boolean)

|

'文字判定で、先頭の文字が0であれば文字、文字判定で文字の長さが3以上なら文字

If (strFlg = True And Left(strCell, 1) = "0") Or _

(strFlg = True And Len(strCell) > 3) Then

Cells(i, j).NumberFormatLocal = "@"

Cells(i, j) = strCell

Else

Cells(i, j) = strCell

If IsNumeric(Cells(i, j)) Then

Cells(i, j) = Format(Cells(i, j), "#,###")

End If

End If

|

このように手を加えるとダブルクォーテーションで括られた数字で途中にカンマがなければ文字として扱うことができます。

20年以上前からCSVファイルのExcelへの取込作業はありましたが、最近のインターネットでのデータのやり取りで、以前よりもCSVファイルの取込は増えてきたようです。 CSVファイルは手動での取込も可能ですが、毎回同じ取込操作をして、その後にデータ編集を手作業で行うことは意外に大変です。単純な作業ほど人間はミスする可能性があるのです。

CSVファイルの取込がVBAで出来るようになると、その後のデータ編集を追加すれば、非常に効率的です。