質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

別のブックにシートをコピーするする際のインデックス有効範囲エラー)¥について

SugiuraY
SugiuraY

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

2回答

0評価

0クリップ

5537閲覧

投稿2019/02/27 00:40

編集2022/01/12 10:58

現在ブックがA.xlsmとB.xlsxがあります。
A.xlsmがマクロ実行用のエクセルです。

  1. A.xlsmのCells(r,1)の文字列のブックB.xlsxを開く(B.xlsxには(r,2)のシート名が存在します)
  2. A.xlsmのCells(r,2)の文字列の新しいブックC.xlsxを作成する
  3. B.xlsxのシートをC.xlsxの同じシート名にコピーする

*具体的にわかりやすく申し上げれば
A.xlsm (r,1) 天気 (r,2)20190227
B.xlsxには20190227というシートが存在しており、(1,1)に晴れと記載されている
C.xlsxに晴れというブック名を付して、B.xlsxの同じシート名の晴れという内容を
コピーしてきたい

ということになります。ループになっているの少しわかりづらいのですが
上記を意図したコードが"インデックス有効範囲エラー"がでてしまうのですが
原因と解決方法を教えてください。

宜しくお願い申し上げます。

vba

Sub fileOpenAndCreate() Dim fileName As String Dim r As Long Dim wb As Workbook Dim oldPath As String Dim newPath As String r = 2 While Cells(r, 1) <> "" oldPath = "C:\Users\hoge\Desktop\TEST_SSE\record\" & Cells(r, 1).Value newPath = "C:\Users\hoge\Desktop\TEST_SSE\create\" & Cells(r, 2).Value Workbooks.Open (oldPath) '既にWBをOpenでも動作する仕様を確認 Worksheets(Cells(r, 2).Value).Activate Set wb = Workbooks.Add wb.SaveAs (newPath) Worksheets(1).Name = Cells(r, 2).Value Workbooks(oldPath).Worksheets(Cells(r, 1).Value).Copy After:=Workbooks(newPath).Worksheets(Cells(r, 1).Value) r = r + 1 Wend End Sub

修正後のコード

vba

Sub fileOpenAndCreate() Dim fileName As String Dim r As Long Dim oldPath As String Dim newPath As String Dim nWb As Workbook Dim oWb As Workbook Dim oWs As Worksheet Dim tWs As Worksheet Dim nWs As Worksheet Set tWs = Worksheets("実行シート") r = 2 While Cells(r, 1) <> "" oldPath = "C:\Users\hoge\Desktop\TEST_SSE\record\" & tWs.Cells(r, 1).Value newPath = "C:\Users\hoge\Desktop\TEST_SSE\create\" & tWs.Cells(r, 2).Value 'old------------ Set oWb = Workbooks.Open(oldPath) '既にWBをOpenでも動作する仕様を確認 Set oWs = oWb.Worksheets(tWs.Cells(r, 2).Value) 'new------------ Set nWb = Workbooks.Add nWb.SaveAs (newPath) Set nWs = nWb.Worksheets(1) nWs.Name = tWs.Cells(r, 2).Value oWs.Copy After:=nWs(tWs.Cells(r, 2).Value) r = r + 1 Wend End Sub

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

stdio
stdio

2019/02/27 00:56

すみません、全体的に処理が重い印象を受けます。 もう少し考えて質問して頂けると幸いです。
SugiuraY
SugiuraY

2019/02/27 01:41

申し訳ございません。。あまりvbaに明るくないため、どのようにすれば処理が軽くなるのかが速やかにはわからないため少し調べるお時間をください。 コメントお寄せいただきありがとうございます。
stdio
stdio

2019/02/27 01:47

まずどの辺で止まっているのかを教えて下さい。 ここで止まる等のコメントを入力した方が、良いアドバイスをもらえますよ。 全体的に処理に無駄が多いように見えるのが気になりますが、今回は良いとしましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。