●やりたいこと:
Excel2010、および2016の環境でVBAを組んでいます。
地方銀行の取引明細やカードの使用履歴など、様々なcsvファイルを
Excelのシートごとに分けて手動でコピー&ペーストしていましたが、
これをVBAで自動化しようとしています。
●問題点:
すでにExcel側に存在する情報については、重複しないようコピペせずに飛ばし、
まだコピペしていない行のみコピペするようにしていますが、下記フォーマットの
csvがうまく処理できません。
"001","","12月15日","","","\300,321","","振込","マルバツグループ(カ"
※機密情報のため、社名や金額は仮のものに変換しています。
※金額欄の\は円マーク
実際にはすでにExcel側に記入済みの行にもかかわらず、重複していない行と
判定されてコピペされてしまいます。
●確認したこと:
セルの内容を数式バーで確認してみると、今まで手動でコピペしていた部分は金額欄が
下記のように数字になっており、形式は「通貨」になっています。
該当csvをダブルクリックでExcelから開いても同様です。
494640
今回VBAで開いたcsvファイルは、「Workbooks.Open Filename:=」コマンドで開いた時点で、
下記のように数式バーでバックスラッシュ記号とカンマ付きの文字列として扱われています。
\300,321 ←\はバックスラッシュ
おそらくExcelの仕様だと思うのですが、ダブルクリックでcsvファイルを開いた時と、
「Workbooks.Open Filename:=」コマンドでcsvファイルを開いた時とで
金額部分のセルの表示が変わってしまっているようです。
これが原因で、過去に手動でコピペしたセルとVBAで開いたcsvのセルが一致しないと判定されてしまうようです。
●実際のコード:
コピペは下記のコードで実施しました。
各変数
TargetBook → csvのファイル名
CP_FirestRow → 範囲選択でコピーする際の最初の行(csv側)
LastRow_target → 範囲選択でコピーする際の最後の行(csv側)
LastCol → コピー元(csv)の列数
LastRow_this → 貼り付け先のシートの最後の行(Excel側)
============
Workbooks(TargetBook).Activate
Workbooks(TargetBook).Sheets(1).Range(Cells(CP_FirestRow, 1), Cells(LastRow_target, LastCol)).Copy
ThisWorkbook.Activate
.Cells(LastRow_this + 1, 2).PasteSpecial Paste:=xlPasteAll
============
貼り付け先Excel側と元のcsv側の行が重複しているか
確認する関数。
============
'CSVの該当行とExcelシートの行との重複をチェックする関数
'SheetNameはExcel側シート名、TargetBookがCSV名、LastColが列数、iはcsv側の抽出する行、rはExcel側で抽出する行
Function Chofuku_chk(ByVal SheetName As String, TargetBook As String, LastCol As Long, i As Long, r As Long)
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 Chofuku = True Else Chofuku = False Exit For End If Next p Chofuku_chk = Chofuku '左の列から右の最後の列まで、すべて一致したときのみTrueを返す
End Function
============
上記 Chofuku_chk と同じコードを使って検証してみたところ、やはり金額のセルのところで不一致を
起こしていました。
※年をまたいでいるので、csv側の日付部分も勝手に「2017/12/15」など、今年の日付に
されてしまい不一致判定でしたが、これは別途対応予定です。
VBA上でcsvファイルを開くとき、ファイルをダブルクリックで開いた時と同じ値になるように
処理することはできますでしょうか?

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/09 02:09