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