[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAを使ってxlsxファイルを読み込みたい』(Y)
VBAを使って「.xlsxファイル同士の差分を表示する」というマクロを組んでいます。
テキストファイルや.csvファイルは上手くいくのですが、拡張子を変えると上手くいきません。
また、文字コードを指定するのですが、Excelの標準の文字コードである「Shit-JIS」や「UniCode」では文字化けをしたり、表示されなくたったりします。
コードは下記サイトを参考にしています。
https://qiita.com/tsuando_c/items/670a7b37f75e97e8f75c
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
うまくいかないだけだと取り付く島もないので、 コードを提示されたらいかがですか?
(xyz) 2025/02/13(木) 15:07:22
xlsxファイルをテキストファイル(含むCSV)と同じ開き方をすることはできません。 Workbooks.Openで開いて下さい。 また文字コードを気にすることは不要です。 (xyz) 2025/02/13(木) 15:15:06
Public Sub Main1()
'変数の宣言 Dim filepath_1 As String, filepath_2 As String Dim wb As Workbook Dim ws_result As Worksheet, ws_csv_1 As Worksheet, ws_csv_2 As Worksheet Dim code_1 As String, code_2 As String
'ワークブック、シートオブジェクトをセット Set wb = ThisWorkbook Set ws_result = wb.Worksheets("result") Set ws_csv_1 = wb.Worksheets("csv_1") Set ws_csv_2 = wb.Worksheets("csv_2")
'csvファイルのパスと文字コードを設定 filepath_1 = ws_result.Cells(3, 3) code_1 = "-8" filepath_2 = ws_result.Cells(4, 3) code_2 = "UTF-8"
'csvファイルの読み込み LoadCSV filepath_1, ws_csv_1, code_1 LoadCSV filepath_2, ws_csv_2, code_2
End Sub
ファイル2を読み込むコード
Public Sub Main2()
'変数の宣言 Dim wb As Workbook Dim ws_result As Worksheet, ws_csv_1 As Worksheet, ws_csv_2 As Worksheet
'ワークブック、シートオブジェクトをセット Set wb = ThisWorkbook Set ws_result = wb.Worksheets("result") Set ws_csv_1 = wb.Worksheets("csv_1") Set ws_csv_2 = wb.Worksheets("csv_2")
'シートを比較 CompareSheets ws_result, ws_csv_1, ws_csv_2 End Sub
'filepathのcsvファイルをシートwsに出力
Private Function LoadCSV(FilePath As String, ws As Worksheet, code As String)
'変数の宣言 Dim buf As String Dim i As Long, j As Long Dim rows As Variant, row As Variant Dim num_rows As Variant, num_cols As Variant Dim data_array As Variant
'シート初期化 ws.UsedRange.Delete
With CreateObject("ADODB.Stream") .Charset = code .Open .LoadFromFile FilePath buf = .ReadText .Close End With 'Windos環境とLinux環境の改行コードの違いを解消 buf = Replace(buf, vbCrLf, vbLf) buf = Replace(buf, vbLf, vbCrLf)
'Cells(14, 5).Value = buf '改行で分割して配列化 rows = Split(buf, vbCrLf)
'行取得 '配列.Length+1 num_rows = UBound(rows) + 1 '列数取得 '配列.Length+1 num_cols = UBound(Split(rows(0), ",")) + 1
'csvの行数x列数の2次元配列で再宣言 ReDim data_array(1 To num_rows, 1 To num_cols) 'すべての要素をdata_arrayに格納、要素数に注意 For i = 1 To num_rows: row = Split(rows(i - 1), ",") If UBound(row) > 1 Then For j = 1 To num_cols 'ファイルの中身が配列の有効範囲を超える? 'csvファイルはテーブルの記入やデータベースを使うファイルである data_array(i, j) = row(j - 1) Next j End If Next i
'csvの全要素をシートに出力 ws.Range("A1").Resize(num_rows, num_cols).Value = data_array
End Function
Private Function CompareSheets(ws_result As Worksheet, ws_csv_1 As Worksheet, ws_csv_2 As Worksheet)
'変数の宣言 Dim cells_1 As Variant, cells_2 As Variant Dim num_rows_1 As Long, num_cols_1 As Long Dim num_rows_2 As Long, num_cols_2 As Long Dim i As Long, j As Long Dim index As Long, res As Long
'結果一覧をクリア 'ws_result.Range("A12", Range("A12").SpecialCells(xlLastCell)).Clear 'ws_result.Range("B12", Range("B12").SpecialCells(xlLastCell)).Clear 'ws_result.Range("A12", Range("C12").SpecialCells(xlLastCell)).Clear
'csvデータを配列に格納 cells_1 = ws_csv_1.UsedRange 'csvファイル1 cells_2 = ws_csv_2.UsedRange 'csvファイル2
'大きさを確認 'A1,B1,A2,B2に表示された比較対象の行、列の大きさを比較する num_rows_1 = UBound(cells_1, 1) num_cols_1 = UBound(cells_1, 2) num_rows_2 = UBound(cells_2, 1) num_cols_2 = UBound(cells_2, 2)
'シート1とシート2の行、列の数 Cells(7, 2).Value = num_rows_1 Cells(8, 2).Value = num_cols_1 Cells(7, 3).Value = num_rows_2 Cells(8, 3).Value = num_cols_2
If num_rows_1 <> num_rows_2 Then MsgBox "行数が一致しません、終了します。" Exit Function End If 'If num_cols_1 <> num_cols_2 Then ' MsgBox "列数が一致しません、終了します" ' Exit Function 'End If
'結果一覧の準備 ws_result.Cells(11, 1) = "No." ws_result.Cells(11, 2) = "File1内容" ws_result.Cells(11, 7) = "File2内容"
'2つのシートを比較して、一致していないセルを黄色に塗り、対象セルの一覧を出力する index = 0 For i = 1 To num_cols_1 For j = 1 To num_rows_1 '等しくなければ色を変更 If cells_1(j, i) <> cells_2(j, i) Then '対象のセルの色を黄色に変更 ws_csv_1.Cells(j, i).Interior.ColorIndex = 6 ws_csv_2.Cells(j, i).Interior.ColorIndex = 6 '比較するファイル名を出力 ws_result.Cells(12 + index, 1) = index + 1 ws_result.Cells(12 + index, 2) = ws_csv_1.Cells(j, i) ws_result.Cells(12 + index, 7) = ws_csv_2.Cells(j, i) index = index + 1 If index Mod 1000 = 0 Then res = MsgBox("不一致が" & index & "/" & i * j & "件見つかっています。処理を続けますか?", vbYesNo) If res = vbNo Then Exit Function End If End If End If Next j Next i
If index = 1 Then MsgBox "全要素が一致しました!" End If End Function
同ファイルにあるcsv_1シートとcsv_2シートに複製して、2シートのセルの差分を結果として表示したいです。
(Y) 2025/02/13(木) 15:57:49
https://yone.synapse-site.jp/excel2016/excel2016_file_hikaku.html
(ふぐ食べたい) 2025/02/13(木) 16:46:45
再掲します。 > xlsxファイルをテキストファイル(含むCSV)と同じ開き方をすることはできません。 > Workbooks.Openで開いて下さい。 > また文字コードを気にすることは不要です。 >(xyz) 2025/02/13(木) 15:15:06 (xyz) 2025/02/13(木) 18:21:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.