• ベストアンサー

エクセルマクロ イコール関数を使いたい その2

https://okwave.jp/qa/q9510142.html で回答を頂きました。 同様にいくつかのコピペをするように記述しましたが、コピペするたびにシート1,シート2の間を行ったり来たりしてパッパッと見た目悪いのです。 シート1 A1 「2018/06/20」の値をそのまま シート2 A1 に「2018/06/20」を表示させる シート1 A2 「2018」の値をそのまま シート2 A2 に「2018」を表示させる シート1 A3 「000」の値をそのまま シート2 A3 に「000」を表示させる そのようにしたいのです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.12

>Sheet1      Sheet2 >"G5"   (単体セル) ⇒ "C1" (単体セル) >"B10:C10" (結合セル) ⇒  "B2:C2" (結合セル) >"D10:E10" (結合セル) ⇒ "D2:E2" (結合セル) >"B18:C18" (結合セル) ⇒ "B3:C3" (結合セル) >"D18:E18" (結合セル) ⇒ "D3:E3" (結合セル) お待たせしました。 Sub Test()   Dim area1 As Variant, area2 As Variant   Dim i As Long   area1 = Array("G5", "B10:C10", "D10:E10", "B18:C18", "D18:E18")   area2 = Array("C1", "B2:C2", "D2:E2", "B3:C3", "D3:E3")   For i = 0 To UBound(area1)     Worksheets("Sheet1").Range(area1(i)).Copy Worksheets("Sheet2").Range(area2(i))   Next End Sub

nkmyr
質問者

お礼

ありがとうごさいました。 おかげさまでうまくいきました。 最後まで付き合って下さって感謝です。

その他の回答 (11)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.11

#9です。 >プロシージャの外では無効です」とエラーになりました。 の原因は、私は「コマンド・ボタン」をシートに設け、ボタンをクリックすると実行する仕組みで書いてしまいました、のが原因だと思います。 この場合は、単純に標準モジュールに回答のコードをコピペして実行しても動きません。 この点の注意書きも、コードを見れば判るだろうと、即断してしまいました。 イベントのコードを使うことは、将来に勉強してください。 質問その1(抹消してしまって、わたしには確認できないですが)では「クリックすると」と書いてあったように思って、クリックイベントの仕組にしました。 初心者でもよくこの仕組みで、発想して、質問する人が居ますが、VBAの学習としては、イベントは、一段後の学習課題です。 ーー 2度も、言い訳がましい記述・追加ですみません。

nkmyr
質問者

お礼

報告ありがとうございます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.10

>For Each c In Worksheets("Sheet1").Range("A10,B10")   >c.MergeArea.Copy Worksheets("Sheet2").Range("A1,B1") コピー元とコピー先がシート名だけではなくアドレスも変わるのですね Sheet1     Sheet2 "A10:B10" ⇒ "A1:B1"   "A10:B10"は結合セルを示す "C10"   ⇒ "H3"    "C10"は単体セル "D5:F10"  ⇒ "A20:C25" と、コピー元とコピー先をし提示してください。

nkmyr
質問者

補足

すみません。 下記になります。Sheet1はコピー元、Sheet2はペースト元です。 Sheet1      Sheet2 "G5"   (単体セル) ⇒ "C1" (単体セル) "B10:C10" (結合セル) ⇒  "B2:C2" (結合セル) "D10:E10" (結合セル) ⇒ "D2:E2" (結合セル) "B18:C18" (結合セル) ⇒ "B3:C3" (結合セル) "D18:E18" (結合セル) ⇒ "D3:E3" (結合セル)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.9

#6です。 >何も反映されませんでした。 解ってもらえるとおもって、注釈を入れなかったのですが、 回答に載せたコードは Set sh1 = Worksheets("Sheet1") のSheet1の部分は、元データある、シート名に変える。 質問では「シート1」?という文字列を入れるべきです。 そのシート名の数字の1は半角か全角か気を付けて。 Set sh2 = Worksheets("Sheet2) のSheet2は代入して結果を置くセルのシート名に変える。 ことを、やって、実行してもらえましたか。 これをやってもうまく行かない場合は、回答を降ります。 解答前にやった、私の模擬データでのテストでは、思った通りになってました。

nkmyr
質問者

お礼

「プロシージャの外では無効です」とエラーになりました。 すみませんが、色々とありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.8

結合セルが有るのなら結合セルは左上のセルのアドレスを指定してください 例 A1 ⇒ A1 B2:B3 ⇒ B2 D5:E5 ⇒ D5 E10:F12 ⇒ E10 Range("A1,B3,D5,E10") Sub Test()   Dim c As Range   For Each c In Worksheets("Sheet1").Range("A1,B3,D5,E10")     c.MergeArea.Copy Worksheets("Sheet2").Range(c.MergeArea.Address)   Next End Sub

nkmyr
質問者

補足

たびたびですみません。 Dim c As Range   For Each c In Worksheets("Sheet1").Range("A10,B10")     c.MergeArea.Copy Worksheets("Sheet2").Range("A1,B1")   Next このようにテストしてみました。 Sheet1 A10(結合)の中身が「2018」 B10(結合)の中身が「テスト」 結果 Sheet2 A1(結合)の中身が「テスト」 B1(結合)の中身が「テスト」 になってしまいました。 それと普通のセルと結合のセル複合するとエラーになりますが、別々でないとダメでしょうか?

  • skydaddy
  • ベストアンサー率51% (388/749)
回答No.7

Sub test() Application.ScreenUpdating = False Sheets("Sheet1").Range("A1:A3").Copy Sheets("Sheet2").Range("A1:A3") Sheets("Sheet1").Activate Application.ScreenUpdating = True End Sub Sheet2はコピー前にに必要です。シート名が異なるとエラーになります。 コピー後に元のシートに戻らなくていいならSheets("Sheet1").Activateは不要です。

nkmyr
質問者

補足

ありがとうございます。 一つだけならできましたが、2つ以上複合になりますとエラーになります。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

VBAの基本のことと思う。 コピペは処理速度がやや遅い。エクセルでは「セルの値」を(だけを)問題にするケースが多いので、「代入」法を使うのが普通。「セルの値」という言葉を 意識したことありますか? ただ書式は代入法では、写ら(移ら)ない。 本件、回答の一方法は (前質問では、コマンドボタンのことが出ていたようだが、コマンドボタンの使い方わかっているのか?使った回答にしてみた) Private Sub CommandButton1_Click() '---シートの簡略指定法 Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--セル間の代入コード sh2.Range("A1") = sh1.Range("A1") sh2.Range("A2") = sh1.Range("A2") sh2.Range("A3") = sh1.Range("A3") End Sub これも、後半のVBAの3行が繰り返し記述になっているので、素人っぽい。 こういうコードは、作業対象シートの切り替えを、画面的に行わないことが、処理速度的に優れている。 普通は繰り返し法(For Nextなど)を使うと思うが、少数セルであれば、これでよいし、ここではこうしておく。 ーーーー 質問の書き方について、 >イコール関数を使いたい その2 普通はこの内容の場合、こういう書き方をして質問しない。質問者はVBA(さらに言えば、エクセルも)をあまり勉強してないと推定する。 >イコール関数 「=」は関数ではなく演算子と言われるもの。エクセル関数の先頭には必須のものだけれど。 まず、VBAの本を1通り読み通すことを勧める。900円台のVBAの本が、2-3本あるから(200ページぐらい)それを読むこと。書名に「マクロ」とは言いていたら、ややVBAとしては初歩的な本で、望みのことが書いてないかもしれない。 ーー なおVBAではシート画面を指定したものに自動で変えるコードもあるから勉強して。

nkmyr
質問者

お礼

ありがとうございます。 イコール関数ではなく、演算子でしたか。 記述してみましたところ、何も反映されませんでした。

  • skydaddy
  • ベストアンサー率51% (388/749)
回答No.5

#2です。 シートをまとめてコピーにしました。 Sub test() Application.ScreenUpdating = False Sheets("Sheet1").Copy Before:=Worksheets(1) ' <= Sheets("Sheet1").Activate Application.ScreenUpdating = True End Sub ちなみにブックの一番後ろにコピーしたいなら矢印行を Sheets("Sheet1").Copy After := Worksheets(Worksheets.Count) とすればいいです。

nkmyr
質問者

お礼

ありがとうございます。 シート全部コピーするのではないのですが…

回答No.4

No.2の方が大きなヒントを出していますよ。 既にコピーするマクロが出来ており、シート間を行き来するのが目障りでしたら、現在使われてるマクロの冒頭に Application.ScreenUpdating = False を入れて、マクロの最後に Application.ScreenUpdating = True を入れれば済みます。 マクロの動作が完了するまで、画面の更新を行わないので、マクロ動作も速くなりますし、シート間を行ったり来たりも無くなります。

nkmyr
質問者

お礼

ありがとうございます。 こういう方法もさっき知ったばかりでした。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

その3で出てきそうですが 離れたセルをコピーする場合 Sub Test()   Dim c As Range   For Each c In Worksheets("Sheet1").Range("A1,B2,C3")     c.Copy Worksheets("Sheet2").Range(c.Address)   Next End Sub 参考に

nkmyr
質問者

補足

ありがとうございます。 セル一つだけならできましたが、セルが結合している場合、うまくいきません。 Sub Test()   Dim c As Range   For Each c In Worksheets("Sheet1").Range("A1:A2”)     c.Copy Worksheets("Sheet2").Range(“B1:B2”)   Next End Sub 違うのでしょうか?

  • skydaddy
  • ベストアンサー率51% (388/749)
回答No.2

Application.ScreenUpdating = False Worksheets("Sheet1").Range("A:A").Copy Worksheets("Sheet2").Range("A:A") Application.ScreenUpdating = True A列全部コピーします

nkmyr
質問者

お礼

回答ありがとうございます。 全部コピペだと余計な物もペーストしてしまいます。