質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

3回答

1341閲覧

VBAで別のブックのシートに記録する

vbc

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

2クリップ

投稿2017/08/19 07:08

###前提・実現したいこと
複数の月ごとになっているシートにデータが2列同行数記録されています。その2列のデータを用いてある計算をして、別ブックの月ごとのシートに計算結果を次々に記録していきたいと考えております。
以下のコードまで考えてこれからどうすればよいかお尋ねしたいです。
特に、2つのシートを行ったり来たりすることや、どのタイミングでデータが記録されているブックを開いたり、シートをアクティブにしたり、記録用のブックを開き記録するシートを作ったりするのが手順としてなんとなくしかイメージで書いて実際にどのようにコードに落としていけばよいかわかりません。
どうかよろしくお願いいたします。

###該当のソースコード
ExcelVBA
Sub cal()
dim wb as Workbook
dim ws as Worksheet
dim i as Integer 'データのあるシート数

ThisWorkbook.Open
wb = Workbook.Add
For i=1 To Thisworkbook.Worksheet.Count
Thisworkbook.Worksheet.Activate
'2列のデータを読み込む
'分析ツールにデータを入れる
'結果を変数に代入
'結果を記録するシートを作成
'結果を記録する
Next i
end Sub

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/19 11:49

イメージでもよいので、適当なデータを入れた写真があるとコメントが得られやすいです。あとは、参考までにエクセルのバージョンを記載ください。
seastar3

2017/08/19 18:17

集計用シートに集計結果は何行ずつ残していくのでしょうか>
退会済みユーザー

退会済みユーザー

2017/08/20 01:22

記録ブック:月毎の気温・湿度  計算ブック:月毎の気温・湿度からWBGTを計算して保存 みたいなイメージですか?
guest

回答3

0

提示いただいたコードは机上で作成したものだと思いますが、細かな指摘をいくつか。

ブックの指定

まず、ThisWorkbookは現在開いているアクティブなブックを指していますので、これを新たにOpenする必要はありません。(本来は別ブックを開きたいのかな?)
また新規ブックの追加はExcel.Workbooks.Addでできますが、作成したブックをそのまま変数に格納したい場合、格納先はWorkbook型のオブジェクト変数ですので、Setを使用してあげる必要があります。

シートの指定

ブック内の特定のシートをアクティブにするには
Thisworkbook.Worksheets(i).Activate
のような記述になります。

しかしアクティブなシートを切り替えながら処理するというのは、処理が重たくなるほか、思わぬ誤動作の原因ともなりえます。(処理中のユーザー操作や、関係ない別ブックの起動時などそちらがアクティブになる)

アクティブシートのA列のセル、という参照の仕方をするよりも、ブックやシートを明示的に指定して参照する方が安全です。
入力シートは対象ブック内に存在する各月のシートを指すことになるので、変動しますよね。
なので変数を作成して格納しておいた方が扱いやすくなります。
出力シートも、出力用に作成したブックに各月ごとわけて作成していくようですので、これも同様です。

>2つのシートを行ったり来たりする
という部分は前述の入力シート変数と出力シート変数を使い分けることで、アクティブシートの切り替えをしなくても、対象シートを指定して参照や出力が可能になります。

分析ツール

あと分析ツールを利用されるようですので、アドインの「分析ツール」は有効にしていると思いますが、これらの機能をVBAから利用する場合には同じくアドインにある「分析ツール - VBA」も有効にしてあげる必要がありますのでご注意ください。

サンプルコード

以下、これらを加味したサンプルコードになります。

Sub cal() Dim wbRead As Workbook '読込ブック Dim wbWrite As Workbook '出力ブック Dim shtR As Worksheet '読込シート Dim shtW As Worksheet '出力シート Dim rng As Range '対象範囲 Dim nmA As Integer '取得値1 Dim nmB As Integer '取得値2 Dim nmRes As Integer '計算結果 Dim i As Integer 'ループ用変数 '読込ブックの指定 Set wbRead = ThisWorkbook '現在開いているブックが入力ブックとなる場合 'Set wbRead = Excel.Workbooks.Open("C:\Tera\入力ファイル.xlsx") '別ファイルを入力ファイルとする場合 '出力ブックの作成 Set wbWrite = Excel.Workbooks.Add '新規ブックの既存シートが邪魔な場合は下記で削除 'For i = wbWrite.Worksheets.Count To 2 Step -1 ' '新規ブックの既存シートを削除(先頭シート以外) ' wbWrite.Worksheets(i).Delete 'Next i '読込ブックの全てのシートをループ処理 For Each shtR In wbRead.Worksheets '結果を記録するシートを作成 Set shtW = wbWrite.Worksheets.Add(, wbWrite.Worksheets(wbWrite.Worksheets.Count)) shtW.Name = "集計_" & shtR.Name '分析対象範囲の指定 Set rng = shtR.Range("A:B") '分析ツールにデータを入れる Application.Run "ATPVBAEN.XLAM!Mcorrel", rng, shtW.Range("A1"), "C", True '⇒詳細不明のためここでは「分析ツール」-「相関」の分析としています。 ' 実装時には目的の分析を「マクロの自動記録」でVBAコードに記録して参考にすればいいと思います。 '読み込みシートからセルの値を取得する方法(ここではとりあえず1~10行目までを取得) 'For i = i To 10 ' '2列のデータを読み込む ' nmA = shtR.Cells(i, "A") ' nmB = shtR.Cells(i, "B") ' ' '結果を変数に代入 ' nmRes = nmA + nmB ' ' '結果を出力シートに記録する ' shtW.Cells(i, "A") = nmRes 'Next r Next shtR '新規ブックの先頭シートを削除 'wbWrite.Worksheets(1).Delete '出力ブックの保存 wbWrite.SaveAs "C:\Tera\出力ファイル.xlsx" wbWrite.Close End Sub

ほぼそのまま答えというアドバイスはあまりしないのですが、質問から少し日がたっていて未解決でしたので、具体的なコードを提示してのアドバイスとさせていただきました。

参考になれば幸いです。

投稿2017/08/22 03:55

編集2017/08/22 03:58
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答が付かないようなので、丸投げですが、
teratail記事の「Excel別Book間のコピーをし、貼り付け時にずらしたい」が参考になるでしょう。
つまり、マクロを置くのは記録用のブックです。フォルダ内にあるデータを含むブックを開いて加工した表を、新たなシートを作成して埋め込んでいくことを繰り返します。
この記事はA列のみですが、A列とB列の2列分を指定するなら、

Range("a1", Range("a1").End(xlDown)) の部分を Range("a1", Range("b1").End(xlDown)) のように読み替えればいいでしょう。

投稿2017/08/20 02:20

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

excelのマクロ記録やインターネットの情報では、セル参照する場合、次のようにcellsやrangeを使っています。
worksheets("sheet1").activate
a=cells(1,2).value
b=range("B1").value
しかし、excelでは、cellsやrangeの前にworksheetを付けて任意のシート内のデータを参照することが可能です。上記の例では、次のようにコーディングすることができます。
Set sheet=worksheets("sheet1")
a=sheet.cells(1,2).value
b=sheet.range("B1").value
ご質問の例では、
"分析ツールにデータを入れる"時に、このsheetを引数で渡す等すれば良いと思います。

この方法を使うと不用意にシート選択しても誤動作しないので良いと思います

投稿2017/08/21 23:12

diracpaul

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問