
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0バイトのテキストファイル
-
【Excel VBA】取り込んだファイ...
-
<input type="file" で初期値...
-
HTMLまたはJavaScriptでフ...
-
VBAで、JPG写真の撮影日時を読...
-
msgget()で指定するkey値について
-
VB6.0のメモリリークについて
-
ファイルの排他について
-
VB2008 iniファイルの全セクシ...
-
RPGでメッセージファイル利用
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
ATTファイルってどうやって開け...
-
メールの添付ファイル
-
こんな場合はどうすればいいの?
-
テキストファイル固定長データ...
-
テキストファイルの一部分を抽...
-
Thunderbird 受信メールからの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0バイトのテキストファイル
-
Eclipseで検索ができなくなった
-
【Excel VBA】取り込んだファイ...
-
C++.NET 2003 「空のドキュメ...
-
HTMLまたはJavaScriptでフ...
-
VBAで、JPG写真の撮影日時を読...
-
main関数のコマンドライン引数...
-
HTMLテキストリンクでExcelファ...
-
ファイル作成日時と更新日時を...
-
リソースファイルを認識してく...
-
Javaのファイルダウンロードに...
-
2GB以上のファイルを扱う方法
-
C#について質問【複数の.datフ...
-
ディレクトリのサイズの取得
-
PHPからベーシック認証のかかっ...
-
<input type="file" で初期値...
-
VB2008 iniファイルの全セクシ...
-
教えて下さい。
-
サイトマップにサブドメインを...
-
vbaの構文の修正相談(xmlファ...
おすすめ情報