Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5800 / 76732 ←次へ | 前へ→

【76539】Re:コードを短くしたい
発言  β  - 14/12/29(月) 15:08 -

引用なし
パスワード
   ▼ゆーあ さん:

γさんから、貴重なアドバイスがでています。
紹介されたOfficeTANAKAサイトの記載もよく読んでみてください。

私も、具体的なテーマからちょっと離れて。

「SampleBを使って・・・改良してみました。」
「SampleCを使っての改良もしてみました。」

と書いておられますが、実際に示していただいた「改良コード」は
もともとの、ゆーあさんのコーディングスタイルのままです。
ゆーあさんのコードは値の転記を、Copy-->PasteSpecial(xlValue) で行っていましたね。
それを実現するためにSheetのSelectや、セルのSelectも記述してあったわけです。

で、SampleA は、それを、

転記先セル.Value = 転記元セル.Value

という、ある意味、VBAスタンダードの記述方式に変えたものです。

次に、SampleB は 1項目ごとの転記(つまり転記すべきセル数だけ、転記コードが必要)
から、「連続した領域」を一挙に転記(コードは1行ですみます)するために

転記先セル【群】.Value = 転記元セル【群】.Value

に変更して、コード数を少なくし、コード数が少ないということは、実行回数も少ないので
処理効率のアップも図ったものです。

最後に、SampleC は、短くなったとはいえ、SampleB で、同じような規則性で処理されている
部分を変数を使ったループ処理として記述。コード数を減少させえています。

別のポイントで。

VBAでセルを特定する場合、「このブック」の「このシート」の「このセル」と書きます。
「このブック」が省略されれば、今アクティブなブックというようになります。
「このシート」が省略されれば、今アクティブなシートとみなされます。
(いずれも標準モジュールでの話ですが)
なので、ゆーあさんは「このセル」という表現だけで処理ができるように
処理対象のブックをアクティブにし、処理対象のシートをアクティブにしているわけですね。

でも、私が提示したコードでは、ブックのアクティブもシートのアクティブも行っていない。
だけど、処理はできたはずです。そこのところを、じっくりと考えてみてください。

あるセルの値を、別シートのセルに転記する操作をマクロ記録しますと

Sub Macro1()
  Sheets("Sheet1").Select
  Range("A1").Select
  Selection.Copy
  Sheets("Sheet3").Select
  Range("E9").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

こんなコードが生成されますね。

で、これと同じことをしようと以下のコードを書いたとします。

Sub TestNG1()
  Range("A1").Select
  Selection.Copy
  Range("E9").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

シートのSelectをなくしたものでエス。
でも、これでは最初のA1がどこのシートのA1なのか、ちょっと心細い記述ですね。
何よりも、E9 は、A1と同じシートになってしまいますね。具合悪いですね。

ということで

Sub TestNG2()
  Sheets("Sheet1").Range("A1").Select   '★シートを特定
  Selection.Copy
  Sheets("Sheet3").Range("E9").Select   '★でも、ここでエラー
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

こんなように、セルがどのシートなのかを特定しました。
でも、E9 の Select でエラーになります。
セル.Select は、そのセルがアクティブシートにある場合のみOKで、そうでなければエラー。

なんとかしたいということで

Sub TestOK1() '★シートとセルを特定してコピーペースト
  Sheets("Sheet1").Range("A1").Copy
  Sheets("Sheet3").Range("E9").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

あぁ、これでうまくいきました。
でも、Copy->PasteSpecialですから22のコードが必要ですね。

Sub TestOK2()
  Sheets("Sheet1").Range("A1").Copy Sheets("Sheet3").Range("E9")
End Sub

あぁ、これで1行でできました。
でも、仮にA1に書式設定があればあそれごとコピーされます。値の転記であれば

Sub TestOK3()
  Sheets("Sheet3").Range("E9").Value = Sheets("Sheet1").Range("A1").Value
End Sub

一般にはこのように書くわけです。

消化不良になるかも?なので、これぐらいでやめます。
ここでコメントしたことを念頭に、もう一度、SampleA,SampleB,SampleC を眺めてください。
0 hits

【76525】コードを短くしたい ゆーあ 14/12/26(金) 15:42 発言[未読]
【76526】Re:コードを短くしたい β 14/12/26(金) 17:54 発言[未読]
【76527】Re:コードを短くしたい ゆーあ 14/12/26(金) 21:10 発言[未読]
【76528】Re:コードを短くしたい β 14/12/26(金) 22:33 発言[未読]
【76529】Re:コードを短くしたい β 14/12/26(金) 22:38 発言[未読]
【76530】Re:コードを短くしたい ゆーあ 14/12/27(土) 11:37 発言[未読]
【76531】Re:コードを短くしたい β 14/12/27(土) 12:34 発言[未読]
【76532】Re:コードを短くしたい ゆーあ 14/12/27(土) 13:35 発言[未読]
【76533】Re:コードを短くしたい β 14/12/27(土) 16:22 発言[未読]
【76534】Re:コードを短くしたい ゆーあ 14/12/27(土) 17:57 発言[未読]
【76535】Re:コードを短くしたい ゆーあ 14/12/29(月) 11:07 発言[未読]
【76536】Re:コードを短くしたい ゆーあ 14/12/29(月) 11:30 発言[未読]
【76537】Re:コードを短くしたい γ 14/12/29(月) 12:03 発言[未読]
【76538】Re:コードを短くしたい ゆーあ 14/12/29(月) 13:19 発言[未読]
【76539】Re:コードを短くしたい β 14/12/29(月) 15:08 発言[未読]
【76541】Re:コードを短くしたい ゆーあ 14/12/29(月) 18:19 発言[未読]
【76542】Re:コードを短くしたい β 14/12/29(月) 19:41 発言[未読]
【76543】Re:コードを短くしたい ゆーあ 14/12/30(火) 9:00 お礼[未読]
【76540】Re:コードを短くしたい γ 14/12/29(月) 15:18 発言[未読]

5800 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free