質問: 上記 Chofuku_chk と同じコードを使って検証してみたところ、やはり金額のセルのところで不一致を 起こしていました。 ※年をまたいでいるので、csv側の日付部分も勝手に「2017/12/15」など、今年の日付に されてしまい不一致判定でしたが、これは別途対応予定です。 VBA上でcsvファイルを開くとき、ファイルをダブルクリックで開いた時と同じ値になるように 処理することはできますでしょうか?
回答: 「¥300,321」をコピペしても「494640」にはなりません。 特に何も指定せずに元のセルのままコピペしていれば「300321」の通貨型で貼り付くはずです。 494640は「\300,321」の比較対象ではなく、サンプル的に提示いただいた他データの値という認識で大丈夫ですよね? 提示いただいた内容のCSVファイル(1行のみ)を作成し、手元の環境で確認してみてみました。 まずファイルのダブルクリック、及び「ファイル」メニューからファイル名を指定して開いた場合には、「¥300,321」の項目は`通貨型`として取り込まれ、値は「300321」となっていました。 これに対し、 ``` Workbooks.Open Filename:="C:\Test\Test.csv" ``` というマクロで同ファイルを開いてみたところ、同項目は`標準`で取り込まれ、値も「¥300,321」となりました。 比較結果が一致しないのはこのためだと思われます。 対応方法 問題の回避方法は大きく2つあると思います。 1比較時に一致するように、セルの内容を修正する。 2比較時に一致するように、比較の判定方法を変更する。 案1(取込結果を修正する) 簡単に言うと、ファイルをオープンした後で目的に金額のセルを通過型の「300321」という値に変更してあげる方法です。 ``` Dim wb As Workbook Set wb = Workbooks.Open("C:\Test\Test.csv") Dim ws As Worksheet Set ws = wb.Sheets(1) 'データのある範囲をループ処理 Dim iRow As Long For iRow = 1 To ws.Cells(Rows.Count, "F").End(xlUp).Row '書式設定 ws ws.Cells(iRow, "F").NumberFormatLocal = "\#,##0_);赤" '値の変更(¥とカンマを除去) Dim sVal As String sVal = ws.Cells(iRow, "F").Value ws.Cells(iRow, "F").Value = Replace(Replace(sVal, ",", ""), "\", "") Next ``` 案2(比較判定を変更する) これも簡単に言うと、「\300,321」と「300321」は同じだという判定に修正するということです。 ``` Function Chofuku_chk(ByVal SheetName As String, TargetBook As String, LastCol As Long, i As Long, r As Long) As Boolean Dim p As Long, Chofuku As Boolean Chofuku = False For p = 1 To LastCol '左の列から順にチェック 'Excel側の左1列はチェック欄のため、p + 1で1列ずらす 'If Workbooks(TargetBook).Sheets(1).Cells(i, p).Value = _ ' ThisWorkbook.Worksheets(SheetName).Cells(r, p + 1).Value Then If ChkVal(Workbooks(TargetBook).Sheets(1).Cells(i, p), ThisWorkbook.Worksheets(SheetName).Cells(r, p + 1)) = True Then Chofuku = True Else Chofuku = False Exit For End If Next p Chofuku_chk = Chofuku '左の列から右の最後の列まで、すべて一致したときのみTrueを返す End Function '判定を行う関数 Function ChkVal(rng1 As Range, rng2 As Range) As Boolean 'ファイル側の参照列によって判定を変更 If rng1.Column = 6 Then '参照列がF列(金額)の場合 Dim dVal1 As Double Dim dVal2 As Double '\とカンマを除去してDouble型に変換 dVal1 = CDbl(Replace(Replace(rng1.Value,",",""),"\","") dVal2 = CDbl(Replace(Replace(rng2.Value,",",""),"\","") If dVal1 = dVal2 Then ChkVal = True Else ChkVal = False End If Else '参照列がF列(金額)以外の場合 If rng1.Value = rng2.Value Then ChkVal = True Else ChkVal = False End If End If End Function ``` まとめ どちらでも目的の結果が得られると思います。 単純に「思ったような比較できていない」という問題に対して考えると、元データに手を加えて今までの判定を行う案1よりも、判定方法自体を見直す案2の方がよさそうに思います。 ただし今回は開いた時点で現行とは異なる状態になっているので、最終的な貼り付け結果も既存に合わせて出力したいのであれば、案2だとペースト時に金額列の加工が必要となってしまいます。 どうせ加工するのなら案1のように最初に加工してしまった方が、後続処理に手を加える必要もなくなります。 今回は金額についてのみ加工するサンプルを提示させていただきましたが、日付など他にも型や値の考慮が必要な列があればそれぞれ対応が必要になると思います。 がんばってみてください。