こんにちは
同じ様式のcsvファイルが幾つかあり、同じシートに取り込んでいきます。
csvファイルを簡単に取り込めるようにVBAを設定しておきたいと思います。
まず、A1セルをダブルクリックすると、
c:\document\sample1.csvを開き、$A$1を起点に取り込みます。
項目行を含め、99行まであり、次のcsvを取り込むために、
A100セルをダブルクリックすると、c:\document\sample2.csvを開き、
$A$100を起点に、項目行を除く2行目から取り込みたいのです。
取り込むファイルは、その都度「テキストファイルをインポート」のウインドーより指定し
A1セルの場合は、csvの1行目(項目行)から、A2以下のセルの場合はcsvの2行目(項目行を除く)から
取り込むようにしたいのですが、どのようなVBAになるか教えて下さい。
Excel 2013です。
よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
Googleあたりで「excel マクロ csvファイル読み込み」とか「excel vba csvファイル読み込み」といった適当なキーワードで検索すると解説サイトがたくさんヒットしますので、その中からご自身が「わかりやすい」と感じるページで学習されるとよいでしょう。
また、Excelマクロの入門書などにも例をあげて説明されていますので、そういったものを1冊入手して手元に置いておかれるのもよいでしょう。
ちなみに「シート上にボタンを設け、それをクリックすると動作する」というのがスマートなように思います。
参考まで。
No.3
- 回答日時:
こんにちは。
まず回答から、
>取り込むファイルは、その都度「テキストファイルをインポート」のウインドーより指定し
Application.Dialogs(xlDialogOpenText)
という意味は、ファイルオープンダイアログのことですね。それは、いろいろありますから、それは、こちらで選ばせていただきます。
それと、
>$A$100を起点に、項目行を除く2行目から取り込みたいのです。
ということは、1~99行目と100~199行目では、最初の方がデータ量が1行少ないということになりますね。まずは、試してみてください。
'シートモジュール
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Target.Value <> "" Then
MsgBox "データがあります", vbExclamation
Exit Sub
End If
Call ImportCSV
Cells(Rows.Count, 1).End(xlUp).Select
End Sub
'標準モジュールがベスト(シートモジュールでも可能)
Sub ImportCSV()
Dim Filenames As Variant
Dim fn As Variant
Dim FNo As Integer
Dim arBuf As Variant
Dim TextLine As String
Dim i As Long
Dim g As Long, cnt As Long
Dim limt As Long
Filenames = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", MultiSelect:=True)
If VarType(Filenames) = vbBoolean Then Exit Sub
Application.ScreenUpdating = False
For Each fn In Filenames
g = Cells(Rows.Count, 1).End(xlUp).Row
If g > 1 Then
cnt = Int((g + 100) / 100)
g = cnt * 100
End If
FNo = FreeFile()
Open fn For Input As #FNo
i = 0
Do While Not EOF(FNo)
Line Input #FNo, TextLine
If TextLine <> "" Then
arBuf = Split(TextLine, ",")
If g < 99 And i = 0 Then
Cells(g + i, 1).Resize(, UBound(arBuf) + 1).Value = arBuf
ElseIf i >= 0 And i < 100 Then
Cells(g + i, 1).Resize(, UBound(arBuf) + 1).Value = arBuf
End If
i = i + 1
Erase arBuf
If (g + i) Mod 100 = 0 And i > 0 Then Exit Do
End If
Loop
Close #FNo
Application.ScreenUpdating = True
Next fn
End Sub
'こういうマクロを書いてみて感じるのは、私は、能力的にひどく落ちたなって気がします。すぐに書けなくなってしまいました。一応、トラアイアルでは、郵政省から出ている郵便番号のCSVを使ってやってみました。
'Excel 2013は、とても使いにくいです。やっと、オフラインでExcel 2010 のVBAヘルプを開くマクロを作ったのですが、ショートカットの割当がなくて、あまり思うように動いてくれません。オンラインですと、ヒットしないことが多いです。やはり、Excel VBAマクロは、追い出しに掛けられているような気がします。
No.4
- 回答日時:
>A1をダブルクリックして、100行目まで取り込めましたが、
>それ以降のデータが取り込めませんでした。
こちらの解釈とはかなりのズレがあるような気がします。
そのように作りましたから、そうなるはずです。
そもそもの受け取り方の意味が大きく違っていたようです。
>sample1.csv、sample2.csv、sample3.csv・・・です。
>それぞれ行数が決まっておらず、数万行の場合もあり、
>数百行の場合もあります。
それだけでは、よく理解できないのです。だから、こちらは混乱しています。
最後尾をどのようなスタイルにするかということです。
全体的な結果のイメージがついていないのですが、データを隙間なく入れることでしょうか。それとも、ダブルクリックした場所から、データを最後まで入れていくということでしょうか。
例えば、100,123行あれば、それを全部インポートして、その後、どこをダブルクックしようとも、100,124行から項目を抜いて入れていくことですか?
私は、てっきり、100行ずつ区切るものだから、最初の項目行の部分だけ、1行減ってしまうものだと思いました。
>A10001を起点に11200行まで取り込みたいのです。
こうしたピンきりの数字で収まるとも思えません。
>A101をダブルクリックすると、項目行から取り込まれました。
ここは何度も確認した事項でしたが、今コードを読むと、
If g < 99 And i = 0 Then
Cells(g + i, 1).Resize(, UBound(arBuf) + 1).Value = arBuf
'ElseIf i >= 0 And i < 100 Then '← 0を読むように書いていますから、0を読まないようにすればよいのですが……
ElseIf i > 0 And i < 100 Then
Cells(g + i, 1).Resize(, UBound(arBuf) + 1).Value = arBuf
End If
となるように思うのですが、そもそも、100行しか読まないように作られていますから、意味がありませんし、全体的に変えなくてはならないようです。
前のデータと次データの境目をどのようにするのか、分かりません。
なお、
・項目行とデータ行は、人間の目視では区別はつくでしょうけれども、明らかに、データ行と項目行に違いはありますか。同じ文字型ですと、今度は、その区別はプログラムで分けなくてはなりません。
ここを読んでいる他の方で勘の良い方なら、すぐに、解決するでしょうけれども、私は、Excel系では、徐々に、質問で読み取れないものが増えてきているような気がします。もちろん、記録マクロで解決するレベルではなさそうです。
>今回用意されているcsvはカンマを区切り文字とされているため、
>データの前後に「"」がついてきてしまうのですが、これは、
>どこで修正したらよいでしょうか。
それは、おそらく、(こちらの想像の範囲ですが、)
TextLine = Replace(TextLine, """", "")
arBuf =Split(TextLine, ",")
とすれば、問題なく通るはずです。
とりあえず、本日はここまでです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) PowerQueryで行数の指定はできますか? 2 2022/08/26 11:13
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Excel(エクセル) Excelについて教えてください。 帳票データがあります。 アクセスに取り込むため、 データ形式にし 1 2022/06/08 19:59
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの有効化するダイヤログ...
-
エクセルで「-0.0」と表示さ...
-
excel で二つのどちらかを選ぶ
-
【マクロ】シート名を取得する...
-
VBA Private Sub Worksheet_Cha...
-
文字列になっている時間をVBAで...
-
Excel 2019 のピボットテーブル...
-
【マクロ】毎回、ファイル名が...
-
エクセルの条件付き書式につい...
-
【マクロ】フォルダからエクセ...
-
Excelでの時間帯の入力
-
エクセルで 例えば 伊藤と名前...
-
写真のコピー
-
行数が不規則な一週間ごとの合...
-
エクセルの順位別一覧表の自動...
-
シートAで横に並んだ項目→シー...
-
ある列、或いは、ある行のセル...
-
エクセル 価格表から単価を呼び...
-
Excel元に戻す方法を教えてくだ...
-
Excelはなんで先頭の0を消すん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報
とても詳しくご回答くださり、ありがとうございます。
ファイルオープンダイアログは、上手く行きました。
すでにデータがあるセルでダブルクリックすると、
「データが有ります」のアラートが出てきて親切ですね。
完璧だと思ったのですが、
私のcsvファイルの説明が悪く申し訳ございません。
項目が同じcsvファイルが幾つかあります。
sample1.csv、sample2.csv、sample3.csv・・・です。
それぞれ行数が決まっておらず、数万行の場合もあり、
数百行の場合もあります。
例えば・・・
sample1.csvは、先頭の項目行を含め10000行(データ行は9999行)あり、
A1を起点に10000行まで取り込んだあと、
次にA10001を起点にsample2.csvを取り込みます。
sample2.csvは、先頭の項目行を含め1200行(データ行は1199行)あります。
sample2.csvの項目行は不要ですので、csvの2行目から1199行まで
A10001を起点に11200行まで取り込みたいのです。
sample3.csvも同様に、A11201を起点に取り込みたいです。
A1をダブルクリックして、100行目まで取り込めましたが、
それ以降のデータが取り込めませんでした。
A101をダブルクリックすると、項目行から取り込まれました。
あと、今回用意されているcsvはカンマを区切り文字とされているため、
データの前後に「"」がついてきてしまうのですが、これは、
どこで修正したらよいでしょうか。
>Excel 2013は、とても使いにくいです。
VBAの方も仕様が変わっているのですね。
>Excel VBAマクロは、追い出しに掛けられているような気がします。
わからないなりに便利に使っているので、これは困りました。