VBAでエクセルAから配列2つを抜き出して、その2つを
足し合わせたものをエクセルBに貼り付けるということをしたいです。
下記のように書きましたが、ダメでした。
(ア)(イ)などを試しました。
これはセルを1つ1つ抜き出してきて計算しなければならないのでしょうか?
Set x = Workbooks(A).Worksheets(sheet).Range("K5:T19") Set y = Workbooks(A).Worksheets(sheet).Range("K21:T35") (ア)Set q = x + y (イ)Set q = x + y Set b = Workbooks(fileB).Worksheets(sheet1).Range("D4") q.copy(a)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
まず、Set x = の x はRangeなので、配列ではないです。
そして、VBAにはRange、配列に対して、
q = x + y 等という記述で一括処理はできません。
なので、For文等で1つずつ計算するしかないです。
投稿2018/02/02 01:28
総合スコア1175
0
こういうの、あまり詳しくはないのですが配列の要素同士を足しあうベクトル演算とかいうものですかね。
今回やりたいことは、VBAを使わなくても実現できます。
ちょっと普段使わない操作になりますが。
シート操作で実現する
【手順】
①ファイルBのD4:M18を選択する ②式`=[ブックAの名前]シート名!K5:T19 + [ブックAの名前]シート名!K21:T35`を入力 ※ブック名やシート名の部分は対象ブック・シート名に置き換えてください ③【重要】式を入力したら、[Ctrl]+[Shift]+[Enter]キーで確定する
ここまでの操作でファイルBのD4:M18にはそれぞれの範囲のセルごとの合計値が表示されると思います。
このような範囲+範囲のような数式は、結果を出力するセル範囲を指定して計算結果の配列を反映させるため「配列数式」と呼ばれます。
③で特殊な操作をしましたが、これは「配列数式」を反映させる操作です。
これで求めたい計算結果は得られると思いますが、このままだとD4:M18には別ブックのセルを参照する数式のままになってしまいますので、もうひと手間必要です。
④ファイルBのD4:M18を選択して「コピー」 ⑤ファイルBのD4:M18に「値の貼り付け」
以上で完了となります。
これをVBAで行うと
上記操作をマクロの記録で記録すればVBA化できます。
以下はそれをもとに少し手を加えたサンプルです。
Sub Sample() Dim rngPaste As Range Set rngPaste = Workbooks(fileB).Worksheets(sheet1).Range("D4:M18") rngPaste.FormulaArray = "=[ブックAの名前]シート名!K5:T19 + [ブックAの名前]シート名!K21:T35" '式の結果を値として貼り付けなおす rngPaste.Value = rngPaste.Value End Sub
このサンプルは、マクロの記録とは少し違う実装ですがやっていることはほとんど同じですが、
・式の入力部分は範囲選択せずに直接セル範囲指定しています。
・また値の貼り付けの部分はクリップボードを経由しない形に変えています。
の2点だけ修正してあります。
マクロ処理ではもともとの選択範囲やクリップボードの内容は極力変えたくないため、この対応を行いました。
参考になれば幸いです。
投稿2018/02/02 05:41
総合スコア3020
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単に全体の合算なら、以下で良いのでは。
VBA
1q = WorksheetFunction.Sum(Range("K5:T19"),Range("K21:T35"))
投稿2018/02/02 02:52
編集2018/02/02 04:02総合スコア25430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/02 03:51
2018/02/02 04:43

0
ベストアンサー
設定先に計算式を埋め込むのはどうですか?
Sheet2.Range("K15:T19").Formula = "='Sheet1'!K5+'Sheet1'!K21"
投稿2018/02/06 00:04
総合スコア505
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ExcelVBAerさんの回答通りにfor文が一番いいと思いますが
名前を付けて計算して出力して削除
VBA
1Sub range_sum() 2 ' 3 ' Macro1 Macro 4 ' 5 Names.Add Name:="test1", RefersTo:="=Sheet1!$K$5:$T$19" 6 Names.Add Name:="test2", RefersTo:="=Sheet1!$K$21:$T$35" 7 8 Range("K37:T51").FormulaArray = "=test1+test2" 9 Worksheets("Sheet1").Range("K37:T51").Copy 10 Worksheets("Sheet1").Range("K37:T51").PasteSpecial Paste:=xlPasteValues 11 12 Application.Names.Item("test1").Delete 13 Application.Names.Item("test2").Delete 14 15' 16End Sub 17
投稿2018/02/02 05:14
総合スコア156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。