• ベストアンサー

エクセルVBAで65536レコードを超えるCSVファイルの読み込み

エクセル2000です。 現在CSV形式のファイルをもらい、エクセルVBAで1行づつエクセルに取り込み、加工しています。(CODEは、かなり省略していますが下記の通り) データは将来的には何万件におよぶことも考えられます。 ためしに65536を超えるデータを読み込ませたところ65536を超えたところでやはりエラーになりました。Workbooks.Openでエクセル形式で開いているので65536を超える部分は無視されるからだと思います。 このような場合には、どうやってCSVファイルからデータを読み込めばよいのでしょうか?(なお、エクセルは当分2007にはなりそうもありません。アクセスはまったく使えません。) Sub TEST01() Set cf = Workbooks.Open(Filename:=ThisWorkbook.Path & "\test.csv") Set zerro = cf.Sheets(1).Range("A1:AX1") ThisWorkbook.Sheets("Sheet1").Activate Do Until zerro.Cells(1).Value = "" ThisWorkbook.Sheets("Sheet1").Range("A1:AX1").Value = zerro.Value '処理マクロ省略 Set zerro = zerro.Offset(1) Loop End Sub

質問者が選んだベストアンサー

  • ベストアンサー
noname#62235
noname#62235
回答No.1

一括で読み込もうとするからダメなのであって、1行ずつ読み込むようにすれば何行にでも対応できると思います。 こんなページを見つけました: http://www.k1simplify.com/vba/tipsleaf/leaf291.html 上記ページのプログラムは全行読み込んでいますが、ループのところをちょっと加工すれば(行数をカウントして65536を超えたら新しいシートを作ってそっちに書き込むなど)、長大なレコード数に対応できると思います。 ただ、処理の内容にもよりますがExcelでは65536行を超えるデータを1枚のワークシートに保持できませんから、たとえばピボットテーブルなどを作りたい場合はどうしようもありません。 合計を集計するだけとかなら問題ないですけど。 やはり最終的にはAccessを導入すべきかと思います。

merlionXX
質問者

お礼

ありがとうございます。 やりたいことは、いわば差込印刷に毛の生えたようなものなので、1行ずつ読みこみ、その分の処理が終われば消去して、また次の行を読み込んでくればいいのです。 ご教示のページ、参考にしてみます。

merlionXX
質問者

補足

ご教示のページ、参考にしてなんとか出来ました。 有難うございました。 Sub CSV_Read3() Dim FileNamePath As String Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long MsgBox "作業開始後、中断したい場合には、Ctrlキー+Breakキーを押してください。" _ , vbInformation, " (´^∇^)σ" FileNamePath = ThisWorkbook.Path & "\test.csv" ch1 = FreeFile '空いているファイル番号を取得 Open FileNamePath For Input As #ch1 'FileNamePath のファイルをオープン On Error GoTo erLine 'エラーが発生したらファイルを閉じる Application.EnableCancelKey = xlErrorHandler Do While Not EOF(ch1) 'ファイルの終端かどうかを確認 Line Input #ch1, textline '1行読み込み textline = Replace(textline, """", "") 'ダブルクォーテーションを削除 csvline() = Split(textline, ",") 'カンマで分離 Range(Cells(1, 1), _ Cells(1, UBound(csvline()) + 1)) = csvline() '配列渡しでセルに代入 'VBA処理省略 Application.StatusBar = Cells(1, 1) Loop erLine: If Err.Number = 18 Then MsgBox "中断キーが押されました。" & Chr(10) & _ "終了します。" _ & Chr(10) & "バイバイ。", vbCritical, " ( ; ゜Д゜)" ElseIf Err.Number <> 0 Then MsgBox Err.Number & ":" & Err.Description End If Close #ch1 'ファイルを閉じる Application.StatusBar = "" Application.EnableCancelKey = xlInterrupt End Sub

その他の回答 (9)

noname#79209
noname#79209
回答No.10

こうなると、もうACCESSの世界では?

merlionXX
質問者

お礼

そうですよね。 ただわたしはまだアクセスは皆目分からないんです。 有難うございました。 お礼が遅くなり済みませんでした。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

#2 です。 >だから65,536行よりも大きいCSVをまるごとインポートすることではありません。 サイトを紹介しただけで、そのものズバリではありません。 細かな事情は分かりませんが、それをヒントにして、インポートして、Excelに表示しなくても、そのままOutput を組み合わせて出力してしまえば、ワークシートに出す必要もありませんね。また、外部オートメーションの必要もありませんね。 merlionXX さんなら、インポートが出来れば、エクスポートもお分かりになるかと思います。後は、ご自身でお考えください。

merlionXX
質問者

お礼

いつもお世話になり、有難うございます。 お礼が遅くなり済みませんでした。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.8

merlionXXさまのことですのでご存じとは思いますが、FileSystemObjectを利用する方法もありますね。 UNICODEなら OpenAsTextStream(1, 0) だったと思います Sub TextImport()  Dim FSO, buf As String  Dim idx As Long  Set FSO = CreateObject("Scripting.FileSystemObject")  With FSO.GetFile("z:\OnDemandScanLog.txt").OpenAsTextStream(1, -2)   Do    buf = .ReadLine    Cells(1, 1).Value = buf '    差し込み印刷(?)処理 挿入   Loop Until .AtEndOfStream   .Close  End With  Set FSO = Nothing End Sub

merlionXX
質問者

お礼

FileSystemObjectですか? 初めて聞きました。 有難うございました。 お礼が遅くなり済みませんでした。

noname#140971
noname#140971
回答No.7

補足: 中途で読み込みを強制終了したい場合は、 FileRead "", True でOKです。

merlionXX
質問者

お礼

補足まで有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

エクセルの根本的制約事項として、不可能とはっきりしていることを、いまさら聞いても無駄でしょう。 >2007にはなりそうもありません 上司でも相談したの。新製品も出て、2万円前後の金で解決することではないの。ただ今のパソコンのスペックは問題だが。それに設計思想が100万行になっただけで、処理反応時間が快適かどうかはべつですが。 情報処理に、コストがかかることは認識されているのでしょうかね。 ーーー もうひとつ (1)6万の続きを、同一シート別列に読み込むと、後の処理の重大な障害になるか。 (2)6万の続きを、別シートに読み込むと、重大な障害になるか。 そういうことが、言及されてないが。 (1)(2)をやる場合、VBAでCSVファイルをよむプログラムを探すか作らないといけないが、旧BASICのころから行われている簡単なコードなので、WEBを照会すれば、沢山転がっている。

merlionXX
質問者

お礼

有難うございました。 お礼が遅くなり済みませんでした。

noname#140971
noname#140971
回答No.5

<Book2.csv> 1,A 2,B 3,C 4,D 5,E 6,F 7,G このような csv ファイルを1行づつ読み込んで、Sheet(1)、Sheet(2)、Sheet(3)等に2行づつ転記。 Private Sub CommandButton1_Click()   Dim I      As Integer   Dim N      As Integer   Dim R      As Integer   Dim intCount   As Integer   Dim intSheet_New As Integer   Dim intSheet_Now As Integer   Dim Datas    As String   Dim strValues() As String      Do     Datas = FileRead("C:\temp\Book2.csv")  ' 1行だけ読み込む     If Len(Datas) > 2 Then             ' 終端の判断       intCount = intCount + 1          ' カウントアップ       intSheet_New = (intCount + 1) \ 2    ' シートインデックス確定       If intSheet_New <> intSheet_Now Then ' ニューシート移行時の行インデックス(R)の初期化         R = 0         intSheet_Now = intSheet_New       End If       strValues() = Split(Datas, ",")       ' 各セルデータに分割       R = R + 1                   ' 行カウントアップ       N = UBound(strValues())          ' 列数取得       For I = 0 To N         Worksheets(intSheet_Now).Activate     ' シートアクティブ         ActiveSheet.Cells(R, I + 1) = strValues(I)  ' データ転記       Next I     Else       Exit Do     End If   Loop Until (0) End Sub ポイントは、1行づつ順次に読み込む FileRead関数を利用していることです。 <標準モジュール> Option Explicit Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso  As FileSystemObject   Static fil  As File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = New FileSystemObject     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = txs.ReadLine Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function ※Microsoft scripting runtime 参照設定が必要。

merlionXX
質問者

お礼

FileRead関数ですか、勉強になります。 有難うございました。 お礼が遅くなり済みませんでした。

  • WWolf
  • ベストアンサー率26% (51/192)
回答No.4

基本的な考え方は#3さんと同意見です(OPENなど) ただ、方法として次の方法も考えられます。 1.1行ずつ処理(加工)しているならその都度csvへ格納する。 2.フォームを作りリストボックスなどにAddして選んだものをシートへ返し加工する。リストボックスなどでは65536の制限はありません。 現在の内容が明確ではないのでハッキリと言えませんが、将来を見込んだロジックであるなら考えてみてください。

merlionXX
質問者

お礼

有難うございました。 お礼が遅くなり済みませんでした。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

エクセルにお任せで読み込む方法は無いので、全てをVBAで制御する必要があります。 ファイルの OPEN 文を使って指定ファイルを開き、 INPUT/LINEINPUT 文を使って1行ずつ読み込みます。 65536行を超える場合は、カウンターを使って設定した読込範囲をチェックしながら読み込む必要があります。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_020.html

merlionXX
質問者

お礼

ありがとうございました。 勉強になります。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 以下でお分かりになると思いますが、 65,536行よりも大きいテキストファイルは、Excel97,Excel2000, Excel2002, Excel2003 では、インポートできません。 http://support.microsoft.com/default.aspx?scid=kb;ja;120596 Open FileName For Input As #FileNum で、65,536行を越えたら、Worksheets.Add して、再びインポートしていきます。

merlionXX
質問者

お礼

ありがとうございます。 やりたいことは、いわば差込印刷に毛の生えたようなものなので、1行ずつ読みこみ、その分の処理が終われば消去して、また次の行を読み込んでくればいいのです。 だから65,536行よりも大きいCSVをまるごとインポートすることではありません。

関連するQ&A

  • excel 2003でCSVファイルを読み込むVBA

    現在CSVファイルを読み込むマクロを作成してますが、レベルが低く下記載のコードで作業を行ってます。 皆様の技術をお借りしたいので、ご教授宜しくお願い致します。 ※現在のコードです。 CommandButton1でフォルダーを開いてcsvファイルを選択し、toolをsheetに追加してます。それから、CommandButton3で追加されたtoolからB14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付けています。 結構手間が係り作業に時間がかかってしまいます。 そこで、改良をしたいと思いますのでご教授お願い致します。 ※改良したいポイント (1)同じフォルダー内のTOOL.CSVをフォルダーを開かず直接commandButton1でSheetに追加する。 (2)Sheet2にコピーされたデーターから(B14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付ける。 (commandButton3はなくしたいと思ってます) 以上です。 宜しくお願い致します。 --------------------------------------------------------- Private Sub CommandButton1_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Myname = ActiveWorkbook.Name CSV_Filename = Application.GetOpenFilename("CSVファイル(*.CSV;*.prn),*.CSV;*.prn", , "CSVファイルを開く") If CSV_Filename = False Then Exit Sub Workbooks.Open CSV_Filename CSV_SheetName = Worksheets(1).Name Sheets(CSV_SheetName).Move after:=Workbooks(Myname).Sheets(Sheets.Count + 1) Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub ---------------------------------------------------------------- Private Sub CommandButton3_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("(TOOL)").Select Sheets("(TOOL)").Range("B14:C14").Select Sheets("(TOOL)").Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("CSV Road").Select Sheets("CSV Road").Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub -------------------------------------------------------------

  • CSVファイルのエクセル取込(VBA)で小数三位が消える!?

    エクセルにCSVファイルから読み取りをするVBAで下記のように記述しています。 Sub CSV読取り Dim FName As Variant FName = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") Open FName For Input As #1 For i = 1 To 400 Input #1, Columni ThisWorkbook.Sheets("CSV取得").Cells(i, "E").Value = Columni Next i Close #1 End Sub これでほとんどのデータ(数値や文字列の400件)をうまく読み取るのですが、どういう訳かデータが小数点以下第三位まである数値の場合、エクセルに取り込まれた段階で小数点以下第二位までに四捨五入されてしまうようです。 そのうえ、エクセルのセルの表示形式がそこだけ通貨(¥マーク付き)になっています。 なぜでしょうか? またどうしたら正しく小数3位まで読み取れるのでしょうか? CSVファイルをエクセル単純にエクセルで開けばちゃんと小数三位まであるのですが、データが横一列にカンマ区切り400件あるので256列しかないエクセルではすべてとりこめません。(だから上記のマクロで縦に変換してとりこんでいるのですが) 非常に困っています。

  • Excel VBA 別ブックへの登録

    お世話になります。 今お仕事でExcelのVBAで同じフォルダ内の別ブックにデータを書き込みたくて いろいろやって見たのですが、上手くできません。 お力を頂ければと・・・・ <詳細> やりたいこと サーバー内に各個人の見積フォルダがあり、そのフォルダの中に見積作成と見積データの各ファイルが2つあります。 見積作成で作成したデータが登録ボタン(VBA)により見積データに登録されるようにしたい。 今までは同じブック内の別シートへデータを登録していました。 今回は同じフォルダ内の別ファイルへのデータ登録です。 ここまではできました・・・・ Sub 見積データ取得() Dim wSheet As ThisWorkbook Dim idx As String 'データ保存用シートを取得 Workbooks.Open Filename:=ThisWorkbook.Path & "見積データ.xls" Set wSheet = ThisWorkbook.Sheets(見積作成.xls) '空白行を取得 idx = CStr(wSheet.UsedRange.Row(wSheet.UsedRange.Rows.Count).Row + 1) '明細を取得 Dim wRange As Range Set wRange = ThisWorkbook.Sheets("見積作成").Range("B7:Q175") Dim i As Integer For i = 1 To wRange.Rows.Count If wRange.Cells(i, 6).Value <> "" Then '作成日 wSheet.Range("A" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("H2").Value '見積NO wSheet.Range("B" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("H5").Value '見積名 wSheet.Range("C" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("C1").Value '提出先NO wSheet.Range("D" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("B3").Value '提出先 wSheet.Range("E" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("C3").Value '提出先フリガナ wSheet.Range("F" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("Y5").Value '担当者 wSheet.Range("G" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("H1").Value '備考欄 wSheet.Range("S" & idx).Value = ThisWorkbook.Sheets("見積作成").Range("C31").Value 'メーカー名 wSheet.Range("H" & idx).Value = wRange.Cells(i, 10).Value '商品NO wSheet.Range("I" & idx).Value = wRange.Cells(i, 1).Value '商品名 wSheet.Range("J" & idx).Value = wRange.Cells(i, 2).Value '入数 wSheet.Range("K" & idx).Value = wRange.Cells(i, 9).Value '数量 wSheet.Range("L" & idx).Value = wRange.Cells(i, 3).Value 'A価 wSheet.Range("M" & idx).Value = wRange.Cells(i, 5).Value '金額 wSheet.Range("N" & idx).Value = wRange.Cells(i, 6).Value 'C価 wSheet.Range("O" & idx).Value = wRange.Cells(i, 14).Value 'D価 wSheet.Range("P" & idx).Value = wRange.Cells(i, 16).Value '数量 'wSheet.Range("K" & idx).Value idx = CStr(CInt(idx) + 1) End If Next でも上手くいきません・・・ よろしくお願いいたしますm(_ _)m

  • VBAを実行するとエクセルが落ちる

    同一フォルダ内にあるCSVデータを一つのエクセルにワークブックにまとめるため CSVデータを開いて、各シートに値を貼り付けるVBAを作成しました デバックモードで1行毎に実行するとエクセルが落ちることはありませんが 普通に実行するとエクセルが閉じてしまいます 原因が分からないためご指摘いただけると幸いです Win7のOffice2013です。 Sub contents() Sheets("01").Select Sheets("01").Cells.Select Selection.ClearContents Dim ShA As Worksheet Dim FileA As String Set ShA = ThisWorkbook.Sheets("01") ChDir "C:\Users\Public\Documents" FileA = "C:\Users\Public\Documents\01.csv" If FileA <> "False" Then Workbooks.OpenText Filename:=FileA, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShA.Range("A1") ActiveWorkbook.Close False End If Set ShA = Nothing Sheets("02").Select Sheets("02").Cells.Select Selection.ClearContents Dim ShB As Worksheet Dim FileB As String Set ShB = ThisWorkbook.Sheets("02") ChDir "C:\Users\Public\Documents" FileB = "C:\Users\Public\Documents\02.csv" If FileB <> "False" Then Workbooks.OpenText Filename:=FileB, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShB.Range("A1") ActiveWorkbook.Close False End If Set ShB = Nothing Sheets("03").Select Sheets("03").Cells.Select Selection.ClearContents Dim ShC As Worksheet Dim FileC As String Set ShC = ThisWorkbook.Sheets("03") ChDir "C:\Users\Public\Documents" FileC = "C:\Users\Public\Documents\03.csv" If FileC <> "False" Then Workbooks.OpenText Filename:=FileC, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShC.Range("A1") ActiveWorkbook.Close False End If Set ShC = Nothing End Sub

  • EXCEL2000 VBA CSVファイルの読み込み

    エクセル2000です。 VBAでCSVファイルを読み込もうとしているのですが、CSVファイルの一部に改行コード[*]が入っています。 そのまま読み込んだ場合、エクセルの中では改行されません。CSVファイル(文字列)を精査していって、[*]があれば、VBでの改行コードChr(10)に変換する方法でいけるのでしょうか。 Workbooks.Open   Filename:="C:\temp\sample.csv" Range("A2:J901").Select このsample.csvの中身を変換したいのですが。 よろしくお願いします。

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • エクセルVBAで不思議な現象が!

    エクセル2010です。 理解できない現象で困っています。 Sheets("DATA")の.Range("B1:S1")には、B1が1、C1が2というように1から18までの数値が連番に入っています。S1には18です。 以下のVBAを走らせると、普通はSheets("test")のRange("B26:S26")にも1から18までの数値が連番に入ります。 Sub TEST() Dim ws As Worksheet Dim lr As Long Set ws = ThisWorkbook.Sheets("DATA") lr = 25 With ThisWorkbook.Sheets("test") .Range("B1:S1").Offset(lr).Value = ws.Range("B1:S1").Value 'データ転記 End With End Sub ところが、このSheets("test")の20行目までデータが入っていて、オートフィルターがかかっているとします。(条件はG列の空白だけ抽出) そして、さらにC列以降のどれかの列が非表示になっていると、その非表示列以降のセルはすべて1になってしまいます! なぜ、このような不思議な結果となるのか理解できません。 やむを得ず、オートフィルタをいったん解除し、列を再表示してから転記するようにしていますが、原因がわかりません。 どなたかご教示いただけませんでしょうか?

  • Setステートメントをまとめて記述する方法 (エクセル2000VBA)

    お世話になります。 Setステートメントで以下のように書いて、シート名を省略して使っています。  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") これをプロシージャ毎に書くとコードが長くなるので、先頭かどこかに1回書くだけで、全てのプロシージャで使えるようにしたいのですがどうしたら良いでしょうか? このようなプロシージャを実行したいのですが、 Private Sub CommandButton1_Click()  a.Range("A2").Value = "データ1"  b.Range("B4").Value = "データ2"  c.Range("C9").Value = "データ3" End Sub (他にもコマンドボタンやチェックボックス用のプロシージャがあります) Setステートメントだけを先頭に書くと、 「プロシージャの外では無効です」というエラーが出ましたので、 Public Sub hensuu()  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") End Sub のようにしたら、「実行時エラー"424":オブジェクトが必要です」というエラーが出てしまいました。 どのようにしたらエラーが出ず正しく動くようになりますでしょうか?よろしくお願いします。

  • ExcelVBAを使用したCSVファイルのデータの取込みについて

    いろんなサイトの情報を見ながら作っていたのですがどうもうまくいかないのでアドバイスなど頂きたいです。 書き方もおかしいと思うのでこう記述するべきとかあったら教えてほしいです。 <やりたいこと> ダイアログボックスより取り込みたいcsvを選択 選択したファイルのパスを一度テキストボックスに書きだす。 新規シートを作成してシート名を変更して 先ほどテキストボックスに書きだした情報を元に CSVファイルのデータを新規作成したシートにコピーを張り付ける 呼び出したCSVファイルを閉じる といったようにしたいのです。 できたら欲しい情報の入った列だけとりだしたかったのですが・・・。 現状記述してあるのは下記になります。 これだととりあえずコピーできてるみたいですが、呼び出したCSVファイルが閉じないのです。 Private Sub CommandButton1_Click() Dim OpenFileName As Variant OpenFileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv") TextBox1.Value = OpenFileName End Sub Private Sub CommandButton2_Click() Worksheets.Add After:=Worksheets("Sheet1"), Count:=1 ActiveSheet.Name = "テスト" Workbooks.Open Filename:=TextBox1 ActiveSheet.Cells.Copy Destination:=ThisWorkbook.Sheets("テスト").Range("A1") Workbooks(TextBox1).Close End Sub

  • エクセルで連続しない範囲のデータ転記

    下記の Sub 転記TEST01() は正しく転記されます。 ただ、これでは何行にもなるので Sub 転記TEST02() のようにまとめてみました。ところが Sheet1のE37以下が#N/Aとなってしまいます。もちろん転記元のデータは#N/Aではなく数値です。なぜこうなるのでしょうか? Sub 転記TEST01() Set ws = ThisWorkbook.Sheets("TEST") With ThisWorkbook.Sheets("Sheet1") .Range("E4:E12").Value = ws.Range("AK4:AK12").Value .Range("E14:E15").Value = ws.Range("AK14:AK15").Value .Range("E20:E23").Value = ws.Range("AK20:AK23").Value .Range("E26").Value = ws.Range("AK26").Value .Range("E28:E50").Value = ws.Range("AK28:AK50").Value End With End Sub Sub 転記TEST02() Set ws = ThisWorkbook.Sheets("TEST") With ThisWorkbook.Sheets("Sheet1") .Range("E4:E12,E14:E15,E20:E23,E26,E28:E50").Value = _ ws.Range("AK4:AK12,AK14:AK15,AK20:AK23,AK26,AK28:AK50").Value End With End Sub

専門家に質問してみよう