Excel VBA 質問スレッド №1960 (解決済)
お手柔らかにお願いします。
投稿者 : 初心者 投稿日時 : 2024/07/10(Wed) 14:15:16 OS : 未指定 EXCEL : 未指定
--------------------------------
--------------------------------
上記はCSVデータを転記するコードで、今1行ずつ読み取って転記する形になっています。
これを2次元配列という、もう少し高速なコードに修正したいのですが(データが多くなってしまうため)
どなたかご教示いただけませんでしょうかm(__)m 初心者のため、厳しいお言葉はお控えください。
--------------------------------
Sub CSV読み込み練習() Dim Int_csvFileNum As Integer Dim Str_csvLine As String Dim Str_dataArray() As String Dim var_selectedFile As Variant Dim baseSheet As Worksheet Dim lastRow As Long Dim colNum As Long ' ベースシートを設定 Set baseSheet = ThisWorkbook.Sheets("ベース") ' CSVファイルを選択するダイアログを表示し、選択されたファイルのパスを取得 var_selectedFile = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , "CSVファイルを選択してください", , False) ' ユーザーがキャンセルボタンを押した場合は処理を終了 If VarType(var_selectedFile) = vbBoolean And var_selectedFile = False Then Exit Sub End If ' 選択されたファイルを開く Int_csvFileNum = FreeFile Open var_selectedFile For Input As #Int_csvFileNum ' 最終行を取得(既存データの下に追記するため) lastRow = baseSheet.Cells(baseSheet.Rows.Count, 1).End(xlUp).Row + 1 ' 1行目を読み飛ばす Line Input #Int_csvFileNum, Str_csvLine ' 残りの行を読み取り、シートに書き込む Do Until EOF(Int_csvFileNum) ' 行を読み取り、配列に格納 Line Input #Int_csvFileNum, Str_csvLine Str_dataArray = Split(Str_csvLine, ",") ' CSVデータをカンマで分割して配列に格納 ' 配列のデータをシートに書き込む For colNum = LBound(Str_dataArray) To UBound(Str_dataArray) ' 日付の場合は、書式を設定してから値を代入する If colNum = 2 Then ' C列の場合(0から始まるインデックスなので、2は実際の3列目に相当) baseSheet.Cells(lastRow, colNum + 1).NumberFormat = "yyyy/mm/dd;@" ' 「短い日付形式」に設定 baseSheet.Cells(lastRow, colNum + 1).Value = CDate(Str_dataArray(colNum)) ' 日付を設定 Else baseSheet.Cells(lastRow, colNum + 1).Value = Str_dataArray(colNum) End If Next colNum ' 次の行へ移動 lastRow = lastRow + 1 Loop ' ファイルを閉じる Close #Int_csvFileNum ' 列の幅を調整 baseSheet.Cells.EntireColumn.AutoFit ' ベースシートをアクティブにする baseSheet.Activate End Sub
--------------------------------
上記はCSVデータを転記するコードで、今1行ずつ読み取って転記する形になっています。
これを2次元配列という、もう少し高速なコードに修正したいのですが(データが多くなってしまうため)
どなたかご教示いただけませんでしょうかm(__)m 初心者のため、厳しいお言葉はお控えください。
スポンサーリンク
[返信 1] Re : お手柔らかにお願いします。
投稿者 : ごんぼほり 投稿日時 : 2024/07/10(Wed) 17:07:17
質問タイトルは、質問内容が端的にわかるようにしてください。
「お願いします」とか「質問です」みたいなタイトルばかりになると、不都合なので。
2次元配列を使うためには、行数・列数が分かってないと面倒です
質問タイトルは、質問内容が端的にわかるようにしてください。
「お願いします」とか「質問です」みたいなタイトルばかりになると、不都合なので。
2次元配列を使うためには、行数・列数が分かってないと面倒です
Sub sample() Dim FSO As Object Dim sBuf As Variant, NR As Long, NC As Long Dim buf() As Variant, linebuf() As String Set FSO = CreateObject("Scripting.FileSystemObject") sBuf = FSO.OpenTextFile("D:\test.csv", ForReading, False, TristateTrue).ReadAll sBuf = Split(sBuf, vbLf) NR = UBound(sBuf) - 1 NC = UBound(Split(sBuf(0), ",")) ReDim buf(1 To UBound(sBuf), 0 To NC) For i = 1 To NR linebuf = Split(sBuf(i), ",") For j = 0 To NC buf(i, j) = linebuf(j) Next Next Stop Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(NR, NC + 1).Value = buf End Sub
[返信 2] Re : お手柔らかにお願いします。
投稿者 : ごんぼほり 投稿日時 : 2024/07/10(Wed) 17:09:13
ReDim buf(1 To UBound(sBuf), 0 To NC)
は
ReDim buf(1 To NR, 0 To NC)
の間違いでした
ReDim buf(1 To UBound(sBuf), 0 To NC)
は
ReDim buf(1 To NR, 0 To NC)
の間違いでした
[返信 3] Re : お手柔らかにお願いします。
投稿者 : てらてら 投稿日時 : 2024/07/10(Wed) 19:59:15
こんにちは。
ExcelVBAでは、CSVファイルを手元のシートにそのまま読み込む事が出来ます。
お目当てのシートにCSVファイルを読み込めば、配列を用意しなくてもOKです。
後は、読み込んだシートを整形すれば良いでしょう。
https://help-vba.com/readcsv/ より引用
こんにちは。
ExcelVBAでは、CSVファイルを手元のシートにそのまま読み込む事が出来ます。
お目当てのシートにCSVファイルを読み込めば、配列を用意しなくてもOKです。
後は、読み込んだシートを整形すれば良いでしょう。
https://help-vba.com/readcsv/ より引用
Sub FileOpen_Click() Dim FileName As String FileName = Application.GetOpenFilename("CSVファイル,*.CSV") If FileName <> "False" Then Dim ws As Worksheet Set ws = Worksheets("ベース") '読込むシートを指定 Application.ScreenUpdating = False ws.Cells.Clear 'それまでのデータをクリアします。 Workbooks.Open FileName:=fn ActiveSheet.Cells.Copy ws.Cells ActiveWorkbook.Close SaveChanges:=False Application.ScreenUpdating = True Else MsgBox "キャンセルしました。" End If MsgBox "終了しました。" End Sub
[返信 4] Re : お手柔らかにお願いします。
投稿者 : tek 投稿日時 : 2024/07/11(Thu) 11:06:33
たぶん、クエリ テーブルによりテキスト ファイルをインポートする方法が一番早いと思います。
各プロパティはヘルプ(F1キー)で確認ください。
たぶん、クエリ テーブルによりテキスト ファイルをインポートする方法が一番早いと思います。
各プロパティはヘルプ(F1キー)で確認ください。
Sub CSV読み込み練習1() Dim var_selectedFile As String Dim baseSheet As Worksheet Dim lastR As Range ' ベースシートを設定 Set baseSheet = ThisWorkbook.Sheets("ベース") ' CSVファイルを選択するダイアログを表示し、選択されたファイルのパスを取得 var_selectedFile = Application.GetOpenFilename("CSVファイル , *.csv", , "CSVファイルを選択してください", , False) ' ユーザーがキャンセルボタンを押した場合は処理を終了 If var_selectedFile = "False" Then Exit Sub With baseSheet ' 既存データの下セルを取得 Set lastR = .Cells(.Rows.Count, 1).End(xlUp).Offset(1) ' 選択されたファイルをインポートする With .QueryTables.Add("TEXT;" & var_selectedFile, lastR) .AdjustColumnWidth = True ' 列の幅を調整 .TextFilePlatform = 932 ' テキスト形式要変更 932(S-JIS) .TextFileStartRow = 2 ' 1行目を読み飛ばす .TextFileTextQualifier = xlTextQualifierDoubleQuote ' 引用符:" .TextFileCommaDelimiter = True ' カンマ区切り .TextFileColumnDataTypes = Array(1, 1, 5) ' C列:YMD,他:標準 .Refresh BackgroundQuery:=False .Delete End With .Range(lastR, lastR.End(xlDown)).Offset(, 2).NumberFormat = "yyyy/mm/dd;@" ' 「短い日付形式」に設定 ' ベースシートをアクティブにする .Activate End With End Sub
[返信 5] Re : お手柔らかにお願いします。
投稿者 : 初心者 投稿日時 : 2024/07/12(Fri) 12:09:56
■[返信 4] tekさん(2024-07-11 11:06:33)の記事
> たぶん、クエリ テーブルによりテキスト ファイルをインポートする方法が一番早いと思います。
> 各プロパティはヘルプ(F1キー)で確認ください。
> Sub CSV読み込み練習1()
> Dim var_selectedFile As String
> Dim baseSheet As Worksheet
> Dim lastR As Range
>
> ' ベースシートを設定
> Set baseSheet = ThisWorkbook.Sheets("ベース")
>
> ' CSVファイルを選択するダイアログを表示し、選択されたファイルのパスを取得
> var_selectedFile = Application.GetOpenFilename("CSVファイル , *.csv", , "CSVファイルを選択してください", , False)
>
> ' ユーザーがキャンセルボタンを押した場合は処理を終了
> If var_selectedFile = "False" Then Exit Sub
>
> With baseSheet
> ' 既存データの下セルを取得
> Set lastR = .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
>
> ' 選択されたファイルをインポートする
> With .QueryTables.Add("TEXT;" & var_selectedFile, lastR)
> .AdjustColumnWidth = True ' 列の幅を調整
> .TextFilePlatform = 932 ' テキスト形式要変更 932(S-JIS)
> .TextFileStartRow = 2 ' 1行目を読み飛ばす
> .TextFileTextQualifier = xlTextQualifierDoubleQuote ' 引用符:"
> .TextFileCommaDelimiter = True ' カンマ区切り
> .TextFileColumnDataTypes = Array(1, 1, 5) ' C列:YMD,他:標準
> .Refresh BackgroundQuery:=False
> .Delete
> End With
>
> .Range(lastR, lastR.End(xlDown)).Offset(, 2).NumberFormat = "yyyy/mm/dd;@" ' 「短い日付形式」に設定
> ' ベースシートをアクティブにする
> .Activate
> End With
>
> End Sub
>
>
ご回答いただきありがとうございます。
内容を確認し、実施してみます。
お時間いただきありがとうございました。
■[返信 4] tekさん(2024-07-11 11:06:33)の記事
> たぶん、クエリ テーブルによりテキスト ファイルをインポートする方法が一番早いと思います。
> 各プロパティはヘルプ(F1キー)で確認ください。
> Sub CSV読み込み練習1()
> Dim var_selectedFile As String
> Dim baseSheet As Worksheet
> Dim lastR As Range
>
> ' ベースシートを設定
> Set baseSheet = ThisWorkbook.Sheets("ベース")
>
> ' CSVファイルを選択するダイアログを表示し、選択されたファイルのパスを取得
> var_selectedFile = Application.GetOpenFilename("CSVファイル , *.csv", , "CSVファイルを選択してください", , False)
>
> ' ユーザーがキャンセルボタンを押した場合は処理を終了
> If var_selectedFile = "False" Then Exit Sub
>
> With baseSheet
> ' 既存データの下セルを取得
> Set lastR = .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
>
> ' 選択されたファイルをインポートする
> With .QueryTables.Add("TEXT;" & var_selectedFile, lastR)
> .AdjustColumnWidth = True ' 列の幅を調整
> .TextFilePlatform = 932 ' テキスト形式要変更 932(S-JIS)
> .TextFileStartRow = 2 ' 1行目を読み飛ばす
> .TextFileTextQualifier = xlTextQualifierDoubleQuote ' 引用符:"
> .TextFileCommaDelimiter = True ' カンマ区切り
> .TextFileColumnDataTypes = Array(1, 1, 5) ' C列:YMD,他:標準
> .Refresh BackgroundQuery:=False
> .Delete
> End With
>
> .Range(lastR, lastR.End(xlDown)).Offset(, 2).NumberFormat = "yyyy/mm/dd;@" ' 「短い日付形式」に設定
> ' ベースシートをアクティブにする
> .Activate
> End With
>
> End Sub
>
>
ご回答いただきありがとうございます。
内容を確認し、実施してみます。
お時間いただきありがとうございました。
[返信 6] Re : お手柔らかにお願いします。
投稿者 : 通りすがり 投稿日時 : 2024/07/13(Sat) 12:40:47
今後のために書きます。
>内容を確認し、実施してみます。
確認してから解決済みにしてください。
また、回答いただいた方には、もれなく返事してください。
無視はヒドイね。初心者かどうかは関係なく、礼を欠いています。
あなたのために時間を費やしています。(むろん幾分かはご自分のためという部分はあるにせよ)
トライした結果をキチンと返すのが礼儀です。
それとタイトルは指摘が既にあったとおりです。
きちんと要約を書くようにしてください。
また必要も無いのに、全文引用はスペースの無駄です。
>初心者のため、厳しいお言葉はお控えください。
初心者などという甘えたHNはやめたほうがいいですよ。
今後のために書きます。
>内容を確認し、実施してみます。
確認してから解決済みにしてください。
また、回答いただいた方には、もれなく返事してください。
無視はヒドイね。初心者かどうかは関係なく、礼を欠いています。
あなたのために時間を費やしています。(むろん幾分かはご自分のためという部分はあるにせよ)
トライした結果をキチンと返すのが礼儀です。
それとタイトルは指摘が既にあったとおりです。
きちんと要約を書くようにしてください。
また必要も無いのに、全文引用はスペースの無駄です。
>初心者のため、厳しいお言葉はお控えください。
初心者などという甘えたHNはやめたほうがいいですよ。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2025-07-03 16:44:48 )