アプリ版:「スタンプのみでお礼する」機能のリリースについて

仕事でシート名や列、行数が全く同じ2枚のシートから同一カ所をコピーし、別シートに貼り付けてから差異を求めてグラフを作成しています。毎回手作業でコピペしているので、1列を間違ってコピーしたりして困っています。VBAを使えば可能かと思い、書籍も買って挑戦しましたが、全く出来ませんでした。そもそも別々のシートを開かず(ディスクトップ上に存在)、その別々シート名を指定して任意のシートにコピーしたり、計算したりする事が出来るのでしょうか?私が希望するのはシートAとシートBの特定箇所(同じセル)をコピーしシートCに貼り付け(黄色破線部分)、その伸長率(赤破線部分)を求めるものです。クリックしたら上記が実現出来るVBAのコードが分かる方居たら教えていただけないでしょうか。別シートでは無理だが同一シート内でのコピー移動は可能ならその方法でも良いので教えて頂けないでしょうか。

「シートが違う2枚のエクセルシートにある数」の質問画像

質問者からの補足コメント

  • 分かり易くご提示ありがとうございます。
    文字数に制限あるみたいなので、2回に分けて送ります。
    1.はい
    2.シートA、シートBの内容をシートCにコピーするとのことですが、
    画像が不鮮明なのでよくわかりません。
    シートCのB列へシートAの内容をコピー
    シートCのC列へシートBの内容をコピー
    は、想像できますが、それ以上は具体的にわかりません。
    シートCのB2へシートAのD6をコピー
    シートCのB3へシートAのD7をコピー
    シートCのB4へシートAのD8をコピー
    シートCのB6へシートAのE6をコピー
    シートCのB7へシートAのE7をコピー
    シートCのB8へシートAのE8をコピー
    シートCのB10へシートAのF6をコピー
    シートCのB11へシートAのF7をコピー
    シートCのB12へシートAのF8をコピー

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/03/31 20:12
  • もし、値の算出なら
    D2の算出方法=B2/C2の結果(少数点以下3位を四捨五入)
    D3の算出方法=B3/C3の結果(少数点以下3位を四捨五入)
    D4の算出方法=B4/C4の結果(少数点以下3位を四捨五入)
    E2の算出方法=B6/C6の結果(少数点以下3位を四捨五入)
    E3の算出方法=B7/C7の結果(少数点以下3位を四捨五入)
    E4の算出方法=B8/C8の結果(少数点以下3位を四捨五入)
    F2の算出方法=B10/C10の結果(少数点以下3位を四捨五入)
    F3の算出方法=B11/C11の結果(少数点以下3位を四捨五入)
    F4の算出方法=B12/C12の結果(少数点以下3位を四捨五入)
    ややっこしくて申し訳ありません。
    上記で意味が伝わったでしょうか?

      補足日時:2022/03/31 20:16

A 回答 (8件)

以下のマクロを標準モジュールに登録してください。


以下の行は、実際のブック名、シート名にあわせて適切に設定してください。
Const wbA_name As String = "D:\goo\excel\goo428\ブックA.xlsx"
Const wbB_name As String = "D:\goo\excel\goo428\ブックB.xlsx"
Set wsA = wbA.Worksheets("シートA")
Set wsB = wbB.Worksheets("シートB")
Set wsC = ThisWorkbook.Worksheets("シートC")

シートCのD2:F4の値ですが、必ず小数点以下2桁を表示させたい場合は、
書式設定で小数点以下の桁数を2に設定してください。
(例 1を1.00と表示させたい場合)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Option Explicit
Public Sub ブック間コピー()
Const wbA_name As String = "D:\goo\excel\goo428\ブックA.xlsx"
Const wbB_name As String = "D:\goo\excel\goo428\ブックB.xlsx"
Dim wbA As Workbook
Dim wbB As Workbook
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim wsC As Worksheet
Set wbA = Workbooks.Open(wbA_name)
Set wbB = Workbooks.Open(wbB_name)
Set wsA = wbA.Worksheets("シートA")
Set wsB = wbB.Worksheets("シートB")
Set wsC = ThisWorkbook.Worksheets("シートC")
wsC.Cells(2, "B").Value = wsA.Cells(6, "D").Value
wsC.Cells(3, "B").Value = wsA.Cells(7, "D").Value
wsC.Cells(4, "B").Value = wsA.Cells(8, "D").Value
wsC.Cells(6, "B").Value = wsA.Cells(6, "E").Value
wsC.Cells(7, "B").Value = wsA.Cells(7, "E").Value
wsC.Cells(8, "B").Value = wsA.Cells(8, "E").Value
wsC.Cells(10, "B").Value = wsA.Cells(6, "F").Value
wsC.Cells(11, "B").Value = wsA.Cells(7, "F").Value
wsC.Cells(12, "B").Value = wsA.Cells(8, "F").Value

wsC.Cells(2, "C").Value = wsB.Cells(6, "D").Value
wsC.Cells(3, "C").Value = wsB.Cells(7, "D").Value
wsC.Cells(4, "C").Value = wsB.Cells(8, "D").Value
wsC.Cells(6, "C").Value = wsB.Cells(6, "E").Value
wsC.Cells(7, "C").Value = wsB.Cells(7, "E").Value
wsC.Cells(8, "C").Value = wsB.Cells(8, "E").Value
wsC.Cells(10, "C").Value = wsB.Cells(6, "F").Value
wsC.Cells(11, "C").Value = wsB.Cells(7, "F").Value
wsC.Cells(12, "C").Value = wsB.Cells(8, "F").Value

wsC.Cells(2, "D").Value = WorksheetFunction.Round(wsC.Cells(2, "B").Value / wsC.Cells(2, "C").Value, 2)
wsC.Cells(3, "D").Value = WorksheetFunction.Round(wsC.Cells(3, "B").Value / wsC.Cells(3, "C").Value, 2)
wsC.Cells(4, "D").Value = WorksheetFunction.Round(wsC.Cells(4, "B").Value / wsC.Cells(4, "C").Value, 2)
wsC.Cells(2, "E").Value = WorksheetFunction.Round(wsC.Cells(6, "B").Value / wsC.Cells(6, "C").Value, 2)
wsC.Cells(3, "E").Value = WorksheetFunction.Round(wsC.Cells(7, "B").Value / wsC.Cells(7, "C").Value, 2)
wsC.Cells(4, "E").Value = WorksheetFunction.Round(wsC.Cells(8, "B").Value / wsC.Cells(8, "C").Value, 2)
wsC.Cells(2, "F").Value = WorksheetFunction.Round(wsC.Cells(10, "B").Value / wsC.Cells(10, "C").Value, 2)
wsC.Cells(3, "F").Value = WorksheetFunction.Round(wsC.Cells(11, "B").Value / wsC.Cells(11, "C").Value, 2)
wsC.Cells(4, "F").Value = WorksheetFunction.Round(wsC.Cells(12, "B").Value / wsC.Cells(12, "C").Value, 2)
wbA.Close
wbB.Close
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

詳細な回答ありがとうございます。
お返事大変遅くなりました。

やってみました。
しかし、「実行時エラー1004 申し訳ございません。 "D:\goo\excel\goo428\ブックA.xlsx"がみつかりません」とエラーメッセージが表示されました。シートAはブックA、シートBはブックB、マクロを登録したシートCはブックCとして
Option Explicit
Public Sub ブック間コピー()以下省略~MsgBox ("完了")
End SubまでをブックCのシートCの標準モジュールに貼付し、実行を押しましたが、「実行時エラー1004 申し訳ございません。 "D:\goo\excel\goo428\ブックA.xlsx"がみつかりません」です。画面のデバックを押すと
上から10行目の
Set wbA = Workbooks.Open(wbA_name)だけ黄色文字になっていました。多分、私のやり方が間違えているかと思います。心当たりありそうな場所ありましたらまた教えて頂けますか。
また、
>以下のマクロを標準モジュールに登録してください。←この「登録」の意味が分りません。Option Explicit以下のコードをコピーして貼るだけではダメなのでしょうか。シート名、ブック名はコードと同じに変更してあります。後はカタカナの半角、スペース、確認した所間違っていないようでした。
何度もお手数掛けます。宜しくお願いいたします。

お礼日時:2022/04/01 13:56

>シートCに入っている項目文字や値のカンマなどもマクロで指示することは可能なのですか?



可能ですが、シートCは、
通常はあらかじめ、マクロを実行する前に設定しておきます。
一旦設定を行えば、永久に使えます。

どうしてもマクロでやりたい場合は、
以下のように追加します。

wsC.Cells(4, "F").Value = WorksheetFunction.Round(wsC.Cells(12, "B").Value / wsC.Cells(12, "C").Value, 2)
下記が追加部分です。
以降同様の箇所はあなたが埋め込んでください。
-----------------------------------------------------------------
'固定文字の埋め込み
wsC.Cells(1, "A").Value = "3次エリア"
wsC.Cells(1, "B").Value = "平成27年"
'以降同様
'3桁区切りのカンマ
wsC.Cells(2, "B").NumberFormatLocal = "#,##0_ "
wsC.Cells(2, "C").NumberFormatLocal = "#,##0_ "
'少数点以下2桁の表示
wsC.Cells(2, "D").NumberFormatLocal = "0.00_ "
'以降同様
------------------------------------------------------------------
wbA.Close
    • good
    • 0
この回答へのお礼

大変分かり易いコードありがとうございます。無事一発で、文字もカンマも小数点も入れる事が出来ました。また、ヒントも頂けたので自分なりに応用する事も覚えました。マクロ覚えたら楽しそうですね。私も教えて頂いた事をベースに自分なりに再度勉強してみたいと思いました。tatsumaru77さん何度も何度も分かり易く説明頂いて感謝です。また、回答も早くて(私が遅くてごめんなさい)。また機会がありましたら、宜しくご教授ください。本当に御手間かけました。ありがとうございます。失礼いたします。

お礼日時:2022/04/01 21:53

>ただ、完成したブックCシートCのB列、C列はどちらもブックAシートAの値がコピーされています。

ブックBシートBの値は反映されていません。なので、D列E列F列は全て1.00です。

>Public Sub ブック間コピー()
>Const wbA_name As String = "C:\Users\ユーザー名\Desktop\ブックA.xlsx"
>Const wbB_name As String = "C:\Users\ユーザー名\Desktop\ブックB.xlsx"
>上記に変更しましたが、何故でしょうか。

こちらでは正しく動作しています。
ブックA.xlsxのシートA
ブックB.xlsxのシートB
に同じ内容が記入されていませんでしょうか。

もしくは、
Set wsA = wbA.Worksheets("シートA")
Set wsB = wbB.Worksheets("シートB")
の箇所をあなたのほうで、ほかの内容に変更していませんでしょうか。
    • good
    • 0
この回答へのお礼

大変失礼しました。
tatsumaru77さんのご指摘通り、シートAシートB同じ内容でした(汗)
訂正したところ、画像Cと同じものが完成しました。感激です!
ありがとうございます。

厚かましいお願いで恐縮なのですが、シートCに入っている項目文字や値のカンマなどもマクロで指示することは可能なのですか?お手数でなければご教授ください。今回迄のでも大満足なのですが。ありがとうございます。宜しければ。

お礼日時:2022/04/01 18:56

>シートAの実際の名前


>シートBの実際の名前
>シートCの実際の名前
>というのが分りません。

添付画像の赤線で囲んだところです。
通常は(変更しなければ)Sheet1,Sheet2などです。

>C:\Users\ユーザ名\Desktop\ブックA.xlsx"の中のシートAなのですが、どう表現したらよいのでしょうか。
本当にシートAですか?
あなたの提示された画像をみると、画像が不鮮明なので想像ですが「基本○○」のように見えます。

> "D:\goo\excel\goo428\ブックA.xlsx"がみつかりません」です。画面の>デバックを押すと
>上から10行目の
>Set wbA = Workbooks.Open(wbA_name)だけ黄色文字になっていました。

これは、Const wbA_name As String = "○○"
の部分が正しくないことを意味しています。

C:\Users\XXXX\Desktop\A.xlsx
のようになっていますか。
Const wbA_name As String = "○○"
の箇所を提示することは可能でしょうか。
「シートが違う2枚のエクセルシートにある数」の回答画像6
    • good
    • 0
この回答へのお礼

ありがとうございます。
出来ました!
前回は¥マークが抜けて居ました。すみません。

ただ、完成したブックCシートCのB列、C列はどちらもブックAシートAの値がコピーされています。ブックBシートBの値は反映されていません。なので、D列E列F列は全て1.00です。

Public Sub ブック間コピー()
Const wbA_name As String = "C:\Users\ユーザー名\Desktop\ブックA.xlsx"
Const wbB_name As String = "C:\Users\ユーザー名\Desktop\ブックB.xlsx"
上記に変更しましたが、何故でしょうか。

お礼日時:2022/04/01 18:00

>以下のマクロを標準モジュールに登録してください。

←この「登録」の意味が分りません。Option Explicit以下のコードをコピーして貼るだけではダメなのでしょうか。
それであっています。

>シート名、ブック名はコードと同じに変更してあります。
これは、あなたの実際の環境にあわせないといけません。

Const wbA_name As String = "D:\goo\excel\goo428\ブックA.xlsx"
Const wbB_name As String = "D:\goo\excel\goo428\ブックB.xlsx"
Set wsA = wbA.Worksheets("シートA")
Set wsB = wbB.Worksheets("シートB")
Set wsC = ThisWorkbook.Worksheets("シートC")
上記は、こちらでの環境です。

例えば、あなたが、ブックAと言っているファイルの実際の名前が、
Book1.xlsxなら、そのように変えないといけません。

ブックAの実際の名前
ブックBの実際の名前
シートAの実際の名前
シートBの実際の名前
シートCの実際の名前
を提示してください。

デスクパスは、以下のようになっているはずです。
例えば、デスクトップ上にA.xlsxがあるとすると
C:\Users\○○\Desktop\A.xlsx
○○はあなたのユーザー名です。
上記のようになっているか確認してください。

該当ファイル(A.xlsx)を選択し、右クリックし、プロパティを
選択すると、そのファイルのプロパティが表示されます。
添付図の赤線で囲んだところが、実際のパス名になります。
「シートが違う2枚のエクセルシートにある数」の回答画像5
    • good
    • 0
この回答へのお礼

ありがとうございます。Const wbA_name As String = "D:\goo\excel\goo428\ブックA.xlsx"←この部分は意味がわかり、C:\Users\ユーザ名\Desktop\ブックA.xlsx"と変更しました。ブックBも。

ただ、
シートAの実際の名前
シートBの実際の名前
シートCの実際の名前
というのが分りません。
C:\Users\ユーザ名\Desktop\ブックA.xlsx"の中のシートAなのですが、どう表現したらよいのでしょうか。

お礼日時:2022/04/01 14:56

こんにちは


>同一カ所をコピーし、別シートに貼り付けてから差異を求めてグラフを作成しています。毎回手作業でコピペしている

一歩として、マクロの自動記録を使ってコードを作ってみてはいかがでしょう。
自動記録の方法などは、参考サイトで
https://fastclassinfo.com/entry/macro_jido_kiroku/

読みにくいようであれば、自身で「マクロ自動記録」などで調べてください
    • good
    • 0
この回答へのお礼

ありがとうございます。自動記録を使ってコード作成が可能なのですね。これだと初心者でも少し可能かもしれません。勉強して実験してみます。

お礼日時:2022/03/31 20:26

補足要求です。


1.マクロは、シートCのあるブックに格納する。
シートA、シートBは別々のブックにある。
ブックA内にシートA
ブックB内にシートB がある。
上記のような前提で良いですか。

2.シートA、シートBの内容をシートCにコピーするとのことですが、
画像が不鮮明なのでよくわかりません。
シートCのB列へシートAの内容をコピー
シートCのC列へシートBの内容をコピー
は、想像できますが、それ以上は具体的にわかりません。
シートCのB2へシートAの○○をコピー
シートCのB3へシートAの○○をコピー
シートCのB4へシートAの○○をコピー
シートCのB6へシートAの○○をコピー
シートCのB7へシートAの○○をコピー
シートCのB8へシートAの○○をコピー
シートCのB10へシートAの○○をコピー
シートCのB11へシートAの○○をコピー
シートCのB12へシートAの○○をコピー
上記の○○の部分を提示してください。
シートCのC列は、シートBから同じようにコピーします。

また、シートCのD,E,Fは、シートA,シートBからコピーするものなのでしょうか。それとも、シートCのB列、C列から算出するものなのでしょうか。
もし、コピーなら
D1へシート●の○○をコピー
D2へシート●の○○をコピー
D3へシート●の○○をコピー
E1へシート●の○○をコピー
E2へシート●の○○をコピー
E3へシート●の○○をコピー
F1へシート●の○○をコピー
F2へシート●の○○をコピー
F3へシート●の○○をコピー
のように提示してください。

もし、値の算出なら
D1の算出方法
D2の算出方法
D3の算出方法
E1の算出方法
E2の算出方法
E3の算出方法
F1の算出方法
F2の算出方法
F3の算出方法
を提示してください。
例 D1 = B2/C2の結果(小数点以下3位を四捨五入)
この回答への補足あり
    • good
    • 0

数式で大丈夫そうな気がしました。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!