プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。

「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」の3つのワークブックを開く
マクロを作成しました。

ここまでは問題ないのですが、値の取得の関係上、
マウスポインターをSheet1のF1セルに合わせたいと思っています。

とりあえず、以下のマクロで、
最後に開いた「Book3.xlsx」のSheet1のF1に
マウスポインターを合わせてアクティブにしするところまで
出来たのですが、、、、。

2番目に開いた「Book2.xlsx」のF1に
マウスポインターを合わせてアクティブにする方法がわかりません。

すいませんが詳しい方、説明の上手な方、直接、コードで説明できる方、
「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」の3つのワークブックを開いて
2番目に開けた「Book2.xlsx」のSheet1のF1セルにマウスポインターを合わせる方法を教えて下さい。

お手数ですが、よろしくお願いします。

追記
1)こちらの知識、実力が以下のコードのレベルです。
→なのですいませんがあまり高度なことはわかりません。
→コードは以下のものを流用して頂いても、オリジナルのものでもOKです。

2)変数の練習もかねております。なので、もしお手数でなければ
変数名は日本語にして頂けるとありがたいです。
※不可の場合は慣れた書き方でいいです。

3)便宜上、
「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」の3つワークブックは
Cドライブの「A」フォルダーに入っているということでお願いします。
※ファイルパスは「C:\A」です

--------------------------
Sub Macro1()

Workbooks.Open "C:\A\Book1.xlsx"
Workbooks.Open "C:\A\Book2.xlsx"
Workbooks.Open "C:\A\Book3.xlsx"

MsgBox "開きました"

'ポインターをF1に移動する
Sheets("Sheet1").Select
Range("F1").Select

End Sub

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

  • うれしい

    No.4 tatsu99さんへ

    いつも丁寧なご解答ありがとうございます。

    前回の
    【EXCEL-VBA】シートの有無を確認してからワークシートを削除したい
    https://oshiete.goo.ne.jp/qa/9551164.html

    と今回のご返答を確認して、自分で調べておきたいことがあります。
    なので、すいませんがちょっと待って下さいね。

    ※明日、パソコン業務ではないので、もしかしたらご返答は夜以降かもしれません。

      補足日時:2017/01/12 23:31
  • HAPPY

    tom04さん、tatsu99さん

    いつも丁寧なご解答ありがとうございます。
    いろいろ教えて頂き、どちらもベストアンサーなのですが、

    前回、

    【EXCEL-VBA】シートの有無を確認してからワークシートを削除したい
    https://oshiete.goo.ne.jp/qa/9551164.html

    で、tom04さんがベストアンサーだったので、
    今回はtatsu99さんに譲らせて頂きます。

    今回も丁寧なご解答を頂きありがとうございました。
    変数の使い方のコツがだいぶわかりました。

    No.6の回答に寄せられた補足コメントです。 補足日時:2017/01/14 08:10

A 回答 (7件)

No4です。


>変数の宣言についてはSub Macro1()の上に書いても
>問題ないということでしょうか?

問題ありません。Sub Macro1()の上に書くと、そのモジュール内のどのプロシージャ(Macro2,Macro3等)
からでも、参照/設定が可能になります。
つまり、その変数をSub Macro1()以外でも使用したい場合は、Sub Macro1()の上に書きます。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
返答が遅くなりすいません。

>問題ありません。Sub Macro1()の上に書くと、そのモジュール内のどのプロシージャ(Macro2,Macro3等)
からでも、参照/設定が可能になります。
つまり、その変数をSub Macro1()以外でも使用したい場合は、Sub Macro1()の上に書きます。

こんな機能があったんですね。
知りませんでした。

今回はありがとうございます。
それと今まで、ご解答頂いた方のほうの「補足する」を
使ってませんでした。
ですが今後はこれも活用して、返答が遅れるetc.の
連絡がつくようにします。

今回はご解答頂きありがとうございました。
機会がありましたらまたお願いいたします。

お礼日時:2017/01/14 08:02

投稿後間違いに気づきました。



No.5のコードの
>wS.Cells(9 + k, "F") = .Worksheets("Sheet1").Range("F1")

>wS.Cells(10 + k, "F") = .Worksheets("Sheet1").Range("F1")
に変更してください。
そうしないと1行ずれて、F9~F11セルにデータが表示されてしまいます。

何度もごめんなさい。m(_ _)m
この回答への補足あり
    • good
    • 1
この回答へのお礼

フォローありがとうございます。
こちらもgood↑つけときますね。

お礼日時:2017/01/12 23:11

No.2・3です。



とりあえず 田中・佐藤・田中 というExcelファイルでの操作にしてみました。
今回も2番目(佐藤Book)はF1セルを選択し上書き保存するようにしています。

Sub Sample3()
Dim k As Long, myPath As String, fN As String
Dim wS As Worksheet, myAry As Variant
myAry = Array("田中", "佐藤", "山田") '← 操作するファイルを増やす場合はここで追加する★//
Set wS = ThisWorkbook.Worksheets("Sheet1")
myPath = "C:\A" & "\"
For k = 0 To UBound(myAry)
fN = myAry(k) & ".xlsx"
Workbooks.Open myPath & fN
With ActiveWorkbook
wS.Cells(9 + k, "F") = .Worksheets("Sheet1").Range("F1")
If k = 1 Then '← Arrayは「0」からのスタートなので2番目(佐藤Book)は「1」となる。★//
.Worksheets("Sheet1").Range("F1").Select
.Save
End If
.Close
End With
Next k
End Sub

※ ファイル名は「Book田中.xlsx」ではなく、単に「田中.xlsx」のようになっているという前提です。
実際に「Book田中.xlsx」のようになっている場合は
コード内の
>fN = myAry(k) & ".xlsx"

>fN ="Book" & myAry(k) & ".xlsx"
に変更してください。m(_ _)m
    • good
    • 1
この回答へのお礼

図々しい質問なのに、ご解答頂き本当にありがとうございます。

'← 操作するファイルを増やす場合はここで追加する★//
myAry = Array("田中", "佐藤", "山田")
Set wS = ThisWorkbook.Worksheets("Sheet1")


実際に「Book田中.xlsx」のようになっている場合は

>fN = myAry(k) & ".xlsx"を
>fN ="Book" & myAry(k) & ".xlsx"
に変更してください。m(_ _)m

こんな使い方をするんですね。
コメントまでつけて頂き本当にありがとうございます。
今回のことは前から思っていたので非常に参考になりました。

No.4さんのコードも読み返して、いろいろ確認したいので、
しばらく質問は開けておきます。いつもご解答ありがとうございます。

お礼日時:2017/01/12 23:09

Book1.xlsx,Book2.xlsx,Book2.xlsxを開いて


Book2のsheet1のF1の内容をマクロのあるブックのsheet1のF10へセットするマクロです。
処理が完了後、Book1,2,3を閉じています。

尚、今回は、Book2をActivateしていますが、Book2をActivateにしなくても、コピーは可能です。
一般的には、
Workbooks("Book1").Sheets("Sheet1").Range("A1").value = Workbooks("Book2").Sheets("Sheet2").Range("A1").value
のようにします。
Book2をActivateにすると、そのメリットはセルのコピー時にBook2を書かなくてもよいということだけです。
① Workbooks("Book2.xlsx").Activate
② ThisWorkbook.Sheets("sheet1").Range("F10").Value = Worksheets("sheet1").Range("F1").Value
③  'ThisWorkbook.Sheets("sheet1").Range("F10").Value = Workbooks("Book2.xlsx").Worksheets("sheet1").Range("F1").Value
①②をコメントにして③のコメントを外してください。Book2をActivateにしなくても③でコピーができることが
確認できます。

Public Const dirname はBook1,2,3が格納してあるフォルダです。(最後に\を付加してください)
-----------------------------------
Option Explicit

Public Const dirname As String = "C:\Users\xxxx\Documents\"
Public Sub TestOpen()
Workbooks.Open dirname & "Book1.xlsx"
Workbooks.Open dirname & "Book2.xlsx"
Workbooks.Open dirname & "Book3.xlsx"
Workbooks("Book2.xlsx").Activate
ThisWorkbook.Sheets("sheet1").Range("F10").Value = Worksheets("sheet1").Range("F1").Value
'ThisWorkbook.Sheets("sheet1").Range("F10").Value = Workbooks("Book2.xlsx").Worksheets("sheet1").Range("F1").Value
Workbooks("Book1.xlsx").Close
Workbooks("Book2.xlsx").Close
Workbooks("Book3.xlsx").Close
End Sub
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。お礼が遅くなりすいません。

すごくわかりやすいマクロで感謝してます。
「わかりやすい」=こちらのレベルに合っているということで
いつも質問の内容をよく読んでからご返答して頂いているので本当にありがたいです。

頂いたコードや前回のアドバイスを読み返してみたところ、
今回のコードでも不思議に思うことが1つあります。

それは

Public Const dirname As String = "C:\Users\xxxx\Documents\"

がプロシージャーの名前より上に記載されていることです。

通常、VBAのコードは

Sub Macro1()



End Sub

という形で、最初の「Sub Macro1()」より上に
コードを記載するとエラーが出る場合がほとんどです。

ところが、今回はエラーも出ませんし、
Option Explicit を削除しても動きます。

Public Const dirname As String = "C:\Users\xxxx\Documents\"

の意味は

dirname という変数が出てきたら 
"C:\Users\xxxx\Documents\" と置き換えなさい。
という意味だと思います。

変数の宣言についてはSub Macro1()の上に書いても
問題ないということでしょうか?


追記
今回、初めてConstの意味を調べてみました。

Constステートメント
http://bit.ly/2jLDAEZ

こんな使い方をするんですね。
って、、、思うのですが、リンク先の使い方も

やっぱりConstステートメントが

Sub Macro1()



End Sub

の中にありますね。
変数の指定は変数を使う前なら、どこに記載しても良いということなのでしょうか?

お礼日時:2017/01/13 20:20

No.2です。



投稿後にNo.1さんのお礼欄を拝見しました。

>1個目のワークブックからの値の取得 ※Sheet1のF1セル
>2個目のワークブックからの値の取得 ※Sheet1のF1セル
>3個目のワークブックからの値の取得 ※Sheet1のF1セル
>↓
>アクティブシートの
>Sheet1のF10、F11、F12への入力
>↓
>開いた「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」を閉じる
>ということにトライしようと思っております。

コードを記載しているBookは「アクティブワークブック」とは言わず、
「This Workbook」となります。
(開いたブックが「アクティブワークブック」になります。)

それはさておいて・・・

Sub Sample2()
Dim k As Long, myPath As String, fN As String
Dim wS As Worksheet
Set wS = ThisWorkbook.Worksheets("Sheet1")
myPath = "C:\A" & "\"
For k = 1 To 3
fN = "Book" & k & ".xlsx"
Workbooks.Open myPath & fN
With ActiveWorkbook
wS.Cells(9 + k, "F") = .Worksheets("Sheet1").Range("F1")
If k = 2 Then
.Worksheets("Sheet1").Range("F1").Select
.Save
End If
.Close
End With
Next k
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 1
この回答へのお礼

いつもご解答ありがとうございます。
いつも本当にスゴイです。

fn:ファイルネーム
k:変数:1 To 3

ということだと思います。
ここまでは問題ありません。


ですが、、、実はここまで本格的な話になると思っていませんでした。

なので、Book1.xlsx、Book2.xlsx、Book3.xlsx、という名前は
今回の質問用に適当につけた名前です。

本当に使う名前はBook田中.xlsx、Book佐藤.xlsx、Book山本.xlsxの
ように「タイトル+担当者名」です。

前から思っていたのですが、tom04さんの変数名の付け方って
ファイル名に番号があった場合はいつも「+fN」でfNは数字(変数)でよね。

以前から聞こうと思っていたのですが、
「タイトル+担当者名」(担当者は3人以上)というパターンの名前の場合、
どういう処理をすればいいのでしょうか?

図々しいリクエストで大変申し訳ないのですが
もし、お手数でなければ同じ条件でワークブックの名前が
「Book田中.xlsx」「Book佐藤.xlsx」「Book山本.xlsx」の時もお願いします。


本当に図々しいリクエストですいません。
この件につきましては前から思っていましたし、こちらの業務では
このパターンのファイル名が多いので教えて頂ければ嬉しいです。

※ご面倒でしたらスルーでOKです。

お礼日時:2017/01/12 21:46

こんばんは!



2番目に開いたBookのみSheet1のF1セルをアクティブにしておけばよいのですね?
一例です。
Bookは三つとも開いていないという前提です。

Sub Sample1()
Dim k As Long, myPath As String, fN As String
myPath = "C:\A" & "\"
For k = 1 To 3
fN = "Book" & k & ".xlsx"
Workbooks.Open myPath & fN
If k = 2 Then
ActiveWorkbook.Worksheets("Sheet1").Activate
Range("F1").Select
End If
Next k
End Sub

※ 変数名は「日本語」ではありませんが、
何となく判ってもらえると思います。m(_ _)m
    • good
    • 1
この回答へのお礼

いつもご解答ありがとうごいます。
No3.の方にまとめますね。

お礼日時:2017/01/12 21:43

>とりあえず、以下のマクロで、


>最後に開いた「Book3.xlsx」のSheet1のF1に
>マウスポインターを合わせてアクティブにしするところまで
>出来たのですが、、、、。

>2番目に開いた「Book2.xlsx」のF1に
>マウスポインターを合わせてアクティブにする方法がわかりません。

「Book3.xlsx」のSheet1のF1及び
「Book2.xlsx」のF1を同時にアクティブにすることは、できないと思いますが、いかがでしょうか。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。
前回は丁寧なご説明ありがとうございました。

>「Book3.xlsx」のSheet1のF1及び
「Book2.xlsx」のF1を同時にアクティブにすることは、できないと思いますが、いかがでしょうか。

こちらの説明がわかりにくくてすいません。
同時にアクティブにすることは出来ないです。

とりあえず2番目に開けた「Book2.xlsx」のSheet1のF1セルだけに
マウスポインターを合わせることが出来れば問題ないです。

ご解答頂きありがとうございます。
続きがございましたら、よろしくお願い致します。


追記A
1)可能でしたら、「Book2.xlsx」のSheet1のF1セルの値を取得して
アクティブのワークブックのSheet1のF10セルに
入力出来ればいいと思っております。

※「アクティブのワークブック」マクロの入った呼び出す側のワークブック。
→「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」のワークブック以外です。

2)1個のワークブックからしか値を取得しないのにワークブックを3個開いたのは、
ワークブックの選択方法を知りたかったためです。

とりあえずこの質問が解決したら、
1個目のワークブックからの値の取得 ※Sheet1のF1セル
2個目のワークブックからの値の取得 ※Sheet1のF1セル
3個目のワークブックからの値の取得 ※Sheet1のF1セル

アクティブシートの
Sheet1のF10、F11、F12への入力

開いた「Book1.xlsx」、「Book2.xlsx」、「Book3.xlsx」を閉じる

ということにトライしようと思っております。


追記B
今、思い出したのですが、以前頂いた以下のマクロと少し似ています。
以下のマクロの時は本当にありがとうございました。
このマクロはカスタマイズして仕事で活用しております。
いつもご解答ありがとうございます。

【VBA】3個のワークブックから同時にシートをコピーしたい
https://oshiete.goo.ne.jp/qa/9476111.html

お礼日時:2017/01/12 20:28

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