プロが教える店舗&オフィスのセキュリティ対策術

こんにちは

同じ様式の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です。
よろしくお願いいたします。

質問者からの補足コメント

  • とても詳しくご回答くださり、ありがとうございます。

    ファイルオープンダイアログは、上手く行きました。
    すでにデータがあるセルでダブルクリックすると、
    「データが有ります」のアラートが出てきて親切ですね。

    完璧だと思ったのですが、
    私のcsvファイルの説明が悪く申し訳ございません。

    項目が同じcsvファイルが幾つかあります。
    sample1.csv、sample2.csv、sample3.csv・・・です。
    それぞれ行数が決まっておらず、数万行の場合もあり、
    数百行の場合もあります。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/07/26 19:17
  • 例えば・・・
    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をダブルクリックすると、項目行から取り込まれました。

      補足日時:2016/07/26 19:17
  • あと、今回用意されているcsvはカンマを区切り文字とされているため、
    データの前後に「"」がついてきてしまうのですが、これは、
    どこで修正したらよいでしょうか。

    >Excel 2013は、とても使いにくいです。
    VBAの方も仕様が変わっているのですね。

    >Excel VBAマクロは、追い出しに掛けられているような気がします。
    わからないなりに便利に使っているので、これは困りました。

      補足日時:2016/07/26 19:18

A 回答 (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, ",")

とすれば、問題なく通るはずです。

とりあえず、本日はここまでです。
    • good
    • 0

こんにちは。



まず回答から、
>取り込むファイルは、その都度「テキストファイルをインポート」のウインドーより指定し

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マクロは、追い出しに掛けられているような気がします。
この回答への補足あり
    • good
    • 0

マクロの自動記録がオススメ

    • good
    • 0

Googleあたりで「excel マクロ csvファイル読み込み」とか「excel vba csvファイル読み込み」といった適当なキーワードで検索すると解説サイトがたくさんヒットしますので、その中からご自身が「わかりやすい」と感じるページで学習されるとよいでしょう。


 また、Excelマクロの入門書などにも例をあげて説明されていますので、そういったものを1冊入手して手元に置いておかれるのもよいでしょう。

 ちなみに「シート上にボタンを設け、それをクリックすると動作する」というのがスマートなように思います。

参考まで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!