|
▼ゆーあ さん:
γさんから、貴重なアドバイスがでています。
紹介された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 を眺めてください。
|
|