回答受付が終了しました

以前、知恵袋でエクセルのマクロ処理ももう少し早く処理するようにしたいと相談したところ、パソコンの性能をあげるよりも前にコードを見直せ的なアドバイスを頂きました。 書いてるのはこんなマクロです

補足

すみませんが、書いているマクロもどこかのブログとかからコピーして一部を変えて使っているだけなので、なにを書いているのかがわかった上で書いている訳ではありません。 なので何故ここでこの宣言を使っているのかと言われても、コピペ元がそうだったとしかわかりません。 すみません。なので元の書いたやつを使用可能なものに変えて頂けると幸いです。 勿論これではいけないと思うのでこれを気に、この宣言はどういう意味があるのか等を勉強していきたいと思います。

Visual Basic | Excel145閲覧

回答(3件)

0

単純に整理すると。。。。 Sub 全期間へ移行改() Dim bk1 As Workbook, bk2 As Workbook Dim rng1 As String, rng2 As String Dim sh1, sh2 Dim i1 As Long, i2 As Long sh1 = Split("りんご,みかん,ぶどう", ",") '★ sh2 = Split("簡易,分析") '★ Application.ScreenUpdating = False With ThisWorkbook.Worksheets("設定") Set bk1 = Workbooks(.Range("h5").Value) Set bk2 = Workbooks(.Range("h7").Value) rng1 = .Range("h6").Value rng2 = .Range("h8").Value End With For i1 = LBound(sh1) To UBound(sh1) '★ For i2 = LBound(sh2) To UBound(sh2) '★ bk1.Worksheets(sh1(i1) & sh2(i2)).Range(rng1).Copy bk2.Worksheets(sh1(i1) & sh2(i2)).Range(rng2).PasteSpecial Paste:=xlPasteValues Next i2 Next i1 Application.ScreenUpdating = True End Sub といった塩梅ですかね。。。 もし、2つのブックのシート構成がわかれば、★の部分が簡略化され、メンテナンスフリーになるかも。

0

こんにちは。 変数eが、突然使っているのですが、それは、わかっているものとして。 コピー元とコピー先の「範囲」が既にわかっているが、 シート名が「わかっているものだけを使いたい という場合、 1) すべてのシートのループをさせて、「転記したくないシートなのか」の 判定だけで処理 2) わかっているシート名のarrayでループ コピーの範囲が、シートによって少しずつ変化 => 都度計算させる。 のでいいのでしたら workbooks(a).activate for each sh in workbooks(a).sheets gyo = sh.range("A" & rows.count).end(xlup).row retsu = sh.range("IV1").end(xltoleft).column sh.Range(sh.cells(1,1),sh.cells(gyo,retsu)).copy workbooks(b).sheets(sh.name).Range("A1").pastespesial value next これで、同じシート名のコピー元の範囲が張り付きます。 ふつうは、コピー先がもっと大きいデータがあった場合、混ざるので 初期化したり、書式の心配したり、とあるので、 1) オリジナルブックをリネームして保存する。 2) リネームしたブックを、値貼り付けで仕上げる ぐらいで、対応しますけどね。 (ブック間コピーは、しない、ということです)

\u003eなので元の書いたやつを使用可能なものに変えて頂けると 実際には、このコード、使ってないのでしょ、 最初のeの話は、 コードの最初で、変数aからdまで使って設定から使うようにしているのに 転記のコードで、range(e)がありますよね、 そのことです。 単純に、変数eのコード、つまり、 e = sheets(\u0022設定\u0022).Range ... の行がないのか、 コードの部分でRange(e)が間違ってるのか、など、 コード全部見ないと、判断できないのですよ。

0

ぱっと見思うのは withをどうして使わないのですか? ソースコードの文字数を劇的に減らす事がインタプリタでは効果的と思うから。何度も同じ事を翻訳させる無駄を意識しましょう。 変数のstring宣言も疑問。 rangeにすれば コピペではなく、 b=d みたいに短く代入で同じ動作を記述出来ます。