![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
VBA初心者です。
下記のような作業フローのVBAを作製しております。
1.VBAを搭載しているexcelファイルにシートを追加し、
シート名に"VF"と名付ける。
2.任意のアドレスのフォルダを開き、
フォルダ内のCSVファイルが複数選択できる状態になる
3.複数のCSVファイルを選択
4.CSVファイルを1つ開く
5.CSV中のB13~B39セルをコピー
6.1で追加したシート"VF"のB3~B29セルにペースト
※2サイクル目ではC3~C29セルにペースト
3サイクル目ではD3~D29セルにペースト
と、1列ずつペースト先が右にずれていく
7.CSVを閉じる
8.次のCSVファイルを1つ開く
9.5から繰り返し
このうち、作業フロー5,6にあたる
Worksheets("DataSheet").Range(Cells(13, 2), Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1)
で「インデックスが有効範囲にありません」というエラーが表示され、
動作が停止してしまいます。
このコードの修正方法をご教示頂けないでしょうか。
よろしくお願いいたします。
以下に、作成したコードを記載いたします。
___________________________________
Sub csvcpy()
Dim PathGet As Variant
Dim DataSheet As Worksheet 'DataSheet = コピー元のファイル(csvファイル)
Dim NewSheet As Worksheet 'NewSheet = ペースト先のシート(シート"VF")
Dim SheetName As String
'CSVファイルの選択
PathGet = Application.GetOpenFilename( _
FileFilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイルの選択", MultiSelect:=True)
'ファイルパスが取得できない場合
If IsArray(PathGet) = False Then
Exit Sub
End If
'ファイルパスが取得できた場合
Set NewSheet = Worksheets.Add() '新しいワークシートを生成
NewSheet.Name = "VF" 'ワークシート名にVFと記入
C1 = 2
If IsArray(PathGet) Then
For Each Filename In PathGet
SheetName = Dir(Filename)
Workbooks.Open Filename:=Filename 'CSVファイルを開く
Set DataSheet = ActiveSheet
Worksheets("DataSheet").Range(Cells(13, 2), Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1) '範囲指定&コピーペースト
C1 = C1 + 1
ActiveWorkbook.Close SaveChanges:=False 'CSVを閉じる
Next
End Sub
___________________________________
No.2ベストアンサー
- 回答日時:
こんにちは
>Set DataSheet = ActiveSheet DataSheet は As Worksheet
>Worksheets("DataSheet")
DataSheet はAs Stringとして使われている、、正しくありません
"DataSheet"と言う名前のシートがあれば良いのですが、、、
あと、シートがあった場合、、#1様の指摘の通りです。、、まあ無いですよね。配列で開いているので同じ訳もなく、、、、シート名はファイル名になっているでしょうから、、
With DataSheet
.Range(.Cells(13, 2), .Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1)
End With
または、
他にDataSheet を使用しないなら
Set DataSheet = ActiveSheet なので
DataSheetは不要で
Range(Cells(13, 2), Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1) '範囲指定&コピーペースト
でも動くかと、、、動くことが前提で
CSVファイルをExcelで開くと当然1シートなのでActiveSheetが対象になります。よって開く時Withなどで括る書き方もあるかな
With Workbooks.Open(Filename:=Filename)
他にも好みによって書き方は色々あるりますが
ご回答ありがとうございます。ご記載頂いた通り、
原因はWorksheets(”DataSheet”)の一文で DataSheet が
Stringとして扱われ、冒頭の定義区分と異なってしまう所にありました。
ご記載頂いた修正文を反映させ、下記のコードで
望みの動作をさせることが出来ました。
ご教示頂きまして誠にありがとうございました。
Sub csvcpy()
Dim PathGet As Variant
Dim DataSheet As Worksheet 'DataSheet = コピー元のファイル(csvファイル)
Dim NewSheet As Worksheet 'NewSheet = ペースト先のシート(シート”VF”)
Dim SheetName As String
'CSVファイルの選択
PathGet = Application.GetOpenFilename( _
FileFilter:=”CSVファイル(*.csv),*.csv”, _
Title:=”CSVファイルの選択”, MultiSelect:=True)
'ファイルパスが取得できない場合
If IsArray(PathGet) = False Then
Exit Sub
End If
'ファイルパスが取得できた場合
Set NewSheet = Worksheets.Add() '新しいワークシートを生成
NewSheet.Name = ”VF” 'ワークシート名にVFと記入
C1 = 2
If IsArray(PathGet) Then
For Each Filename In PathGet
SheetName = Dir(Filename)
Workbooks.Open Filename:=Filename 'CSVファイルを開く
Set DataSheet = ActiveSheet
DataSheet.Range(Cells(13, 2), Cells(39, 2)).Copy Destination:=NewSheet.Cells(3, C1) '範囲指定&コピーペースト
C1 = C1 + 1
ActiveWorkbook.Close SaveChanges:=False 'CSVを閉じる
Next
End If
End Sub
No.1
- 回答日時:
ありがちな回答ですけど。
Worksheets("DataSheet").Range(Cells(13, 2), Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1)
↓
With Worksheets("DataSheet")
.Range(.Cells(13, 2), .Cells(39, 2)).Copy _
Destination:=NewSheet.Cells(3, C1)
End With
ご回答ありがとうございます。ご記載いただいた様に、
私の作製したコードでは、With~End Withの構文や、
Range内の範囲指定方法が正確に記載できておりませんでした。
またその後、Qchan1962様にご記載頂きましたように、
私のコードでは DataSheet という名称のシートが生成される機会がなく、
Worksheets("DataSheet")の記述にも不具合の要因があることが
わかりました。
以上2点を修正し、望むフローの動作が確認できました。
改めてご教示頂きましてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
Excel VBAを使った複数のCSVファイルの読み込みについて教えてください。
Excel(エクセル)
-
CSVファイルの指定列だけを読み込んでEXCELに表示したい
Excel(エクセル)
-
エクセルの固定範囲にCSVを貼り付ける。
Visual Basic(VBA)
-
-
4
VBAでフォルダ内の全てのcsvファイルからコピペ
その他(ビジネス・キャリア)
-
5
VBAでcsvファイルもシートもあるのに「インデックスが有効範囲にありません」と表示される2
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
HTMLテキストリンクでExcelファ...
-
0バイトのテキストファイル
-
IMEのモードを強制的に変えるには
-
VBAで、JPG写真の撮影日時を読...
-
main関数のコマンドライン引数...
-
openglで音楽を再生する
-
ファイルのアクセス権限について
-
C++によるファイル送受信プログ...
-
2GB以上のファイルを扱う方法
-
タイムスタンプの取得
-
インタープリンタとファイルコ...
-
月々の更新回数を調べるには?
-
Eclipseで検索ができなくなった
-
ファイル更新日取得
-
VBAでフォルダ内の全てのcsv...
-
ファイル内容を比較する方法
-
MPEG1とMPEG2を見分ける
-
C# ファイルサイズの取得(ファ...
-
<input type="file" で初期値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
HTMLまたはJavaScriptでフ...
-
【VBA】複数CSVの特定範囲を1つ...
-
ディレクトリのサイズの取得
-
サイトマップにサブドメインを...
-
Javaのファイルダウンロードに...
-
リソースファイルを認識してく...
-
VBS ファイルマージ処理
-
C++.NET 2003 「空のドキュメ...
-
VB6.0のメモリリークについて
-
C++によるファイル送受信プログ...
-
RPGでメッセージファイル利用
-
Perlで2GBを超える大きいファイ...
-
VB6でTIFF図のプロパティを...
-
BASP21のファイルアップロード...
-
VB2008 iniファイルの全セクシ...
おすすめ情報