• ベストアンサー

エクセルマクロ イコール関数を使いたい その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」を表示させる そのようにしたいのです。 宜しくお願いします。

  • nkmyr
  • お礼率67% (403/600)

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

  • ベストアンサー
  • 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/17068)
回答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/17068)
回答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/748)
回答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/17068)
回答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/748)
回答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/748)
回答No.2

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

nkmyr
質問者

お礼

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

関連するQ&A

  • エクセルマクロ イコール関数を使いたい

    シート1のA1の値をそのままシート2のA1に表示させるマクロを作りたいのです。 ボタンを配置して、ボタンをクリックすると シート1 A1 「2018/06/20」の値をそのまま シート2 A1 に「2018/06/20」を表示させる そのようにしたいのです。 宜しくお願いします。

  • 再質問:エクセルでマクロを使ってイコールで同じものを表示できますがどっち入力してもどちらにも反映する事は出来ますか?

    http://okwave.jp/qa2598070.html で質問したのですがシート1で入力したのを シート2に自動的に入力してどちらが変更になっても 同じ値が出るようになったのですが 同じシート内、違うブックはどうしたらいいのでしょうか?>< 宜しくお願い致します0^^0

  • エクセル:関数の値をコピペ

    エクセルで関数で値Aを出したセルを 他のセルにコピペすると、 値Aとは異なる値Bが表示されたり、 「#DIV/0!」と表示されたりしますよね。 これを、コピペしても値Aのままで 表示されるようにしたいのですが、 そんなことは可能ですか?

  • Excelのマクロを教えてください!!

    転記するマクロを探していた所、下記の質問を見つけました。 https://okwave.jp/qa/q9554919.html また、watabe007さんの良い回答があった為、下記を参考にさせていただきました。 https://okwave.jp/qa/q9554919/a26683580.html ただ、同じファイル名が複数存在した時に古いファイルのみ転記されるようでした。 (例えば1.csvが3個ある場合、更新日時の古いファイルが転記されてました。) そこで質問ですが、同じファイル名が複数存在した時に1番新しいファイルのみ転記する事は可能でしょうか? 急な質問、大変申し訳ありませんがご教授お願いできないでしょうか?

  • エクセルのマクロや関数の質問

    いくつかまとめて質問させてください。 よろしくお願いします。 1、シート1のA1に、入れる関数ですが、シート2からシート20の"C13"の総合計をいれたいのです。 それらを、単純に1個ずつクリックして、+していけばいいのですが、他にもいくつもありますので、簡単にできる方法があれば教えていただきたいです。 2、.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues コードの一部です。A列にデータがなければ、2行目にコピペします。 データがあれば、次の行にデータをコピペします。 これを、データがなければ、1行目にコピペ、データがあれば、次の行にデータをコピペというふうに変更をお願いしたいです。 3、シート1のA1に、文字列を入力します。 阪神と入力すれば、阪神シートの"D5"、巨人と入力すれば、巨人シートの"D5"を表示できるような関数はありますか?='$A1$'!D5しか思いつきませんでした。 質問攻めですが、よろしくお願いします。

  • 再再質問:エクセルでマクロを使ってイコールで同じものを表示できますがどっち入力してもどちらにも反映する事は出来ますか?

    http://okwave.jp/qa2598070.html で質問したのですがシート1で入力したのを シート2に自動的に入力してどちらが変更になっても 同じ値が出るようになったのですが 同じシート内はわかったのですが違うブックはどうしたらいいのでしょうか?>< 宜しくお願い致します0^^0

  • エクセル マクロ ソルバ 中止(T)を選択したい

    エクセル2007のマクロを修正しています。 ソルバで、オプションの制限時間を設定しており、 制限時間に達した時に、「試行状況の表示」が現れるため、 マクロが途中で停止してしまい、困っております。 「試行状況の表示」が現れる時に、中止(T)を選択できれば、 目的のマクロになります。いくつかの方法を試したのですが、 うまくマクロが動作しません。 【試した事】  (1)Dummy Macro() → 「値の更新」が表示されて止まる。  参考 http://okwave.jp/qa/q2630207.html  (2)Function → 「値の更新」が表示されて止まる。  参考 http://msdn.microsoft.com/ja-jp/library/office/ff197237.aspx  (3)Application Display Alerts → 「試行状況の表示」が表示されて止まる。  参考 http://okwave.jp/qa/q2630207.html コードを記述しないと、非常に回答し辛い事は、承知しております。 ただ、セキュリティの問題で、生コードは持ち出せません。また、 現在、マクロを勉強中のため、簡易的に書く技術が無く申し訳ございません。 やりたい内容や課題になっている所は、gucchi-you殿の質問と同様だと思います。 http://okwave.jp/qa/q2630207.html この質問は、解決せずに終了しております。 2週間試行錯誤しましたが、うまくいかずに投稿させて頂きました。 もし、ご回答頂ければ、非常にありがたいです。 お知恵をお貸し下さい。

  • エクセル関数について

    エクセルの関数についてなのですが、例えば「セルA3」に「セルB2」の値を表示させるには「=(B2)」と「セルA3」に表示させてます。別のSheetの値も表示できるのでしょうか?例えば「Sheet1.Range("A3")」の値をSheet2のA1に表示させたい場合Sheet2のA1にはどのような関数を入力していけばよいのでしょうか?VBAは使わずに表示したいのですが。関数はまだほとんど使ったことがないので分かる人いたら教えてください。よろしくお願いします。

  • エクセル マクロ 定型ごと抜き出す

    こんばんは エクセルのマクロで困っているので教えていただけませんか? 前回の質問 http://okwave.jp/qa/q8803640.html におきまして、回答を頂き使用していたのですが、更に検索対象が増えて困っています。 前回は、Sheet4 の M列 の 優良 と言う文字を検索し、A列~CL列までSheet5に抜き出していたのですが、今回 優良 と言う文字を含むもの、可と言う文字を含むもの 両方を抜き出したいと思います。 抜き出す範囲も A列~EO列と広くなりました。 一人では解決できないので、詳しい方教えていただけませんでしょうか。 よろしくお願い致します。

  • エクセル 行を列に参照する NO.2

    お世話になります。 昨日 http://sp.okwave.jp/qa/q9264221.html で質問させていただきましたもののアレンジです。 昨日の質問では、 Sheet1のA1からF500...の値を Sheet2のA列に参照させたい。 Sheet1 Sheet2 A1 →A1 B1 →A2 C1 →A3 D1 →A4 E1 →A5 F1 →A6 A2 →A7 B2 →A8 C2 →A9 . . . で、 Sheet2のA1に =OFFSET(Sheet1!$A$1,(ROW()-1)/6,MOD(ROW()-1,6)) と入力して,下にコピー という完璧な回答をいただきました。 これを、違う表でアレンジしたかったのです。 Sheet1のG2からN500... の値を Sheet2のE7から下に表示したかったのです。 あれこれ試して =OFFSET(Sheet1!$G$2,(ROW()-7)/8,MOD(ROW()-7,8)) で、値の参照ができました。 この中の、 -7 の部分がわからないのです。 どなたか、わかりやすく教えていただけませんでしょうか? お忙しいとは思いますが、よろしくお願いします。

専門家に質問してみよう