こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

別ブックのセルをSelectionで操作する方法

Excelの別ブックのセルをSelectionやActiveCellで操作する方法

Excel2010のVBAで別のブックを開いて、
別のブックのあるシートのあるセルを選択して、
この選択したセルに対して
SelectionやActiveCellで操作する場合、
ブック、シートはどのように指定をすればよいのでしょうか。

例えば、
MYBOOKに以下のようなVBAコードを記述して、
OTHERBOOKのSHEET4シートの選択されているセルに対して、
SelectionまたはActiveCellでRowを取得する場合、
(1)のように「Selection.Row」や
(2)のように「ActiveCell.Row」を記述しただけでは、
MYBOOKのアクティブシートの選択セルの行番号が
取得されてしまいます。
(3)(4)(5)(6)のように記述しても、
「実行時エラー'438':
 オブジェクトは、このプロパティまたは
 メソッドをサポートしていません。」
というエラーが発生してしまいます。
OTHERBOOKのSHEET4の選択セルの行番号を取得するには、
どのように記述すればよいのでしょうか。

----------------------------------------------
Dim OTHERBOOK As Excel.Workbook
Dim row_no As Integer

Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
Set OTHERBOOK = oApp.Workbooks.Add
OTHERBOOK.Activate
OTHERBOOK.Worksheets.Add(after:=OTHERBOOK. _
Worksheets(OTHERBOOK.Worksheets.Count)).Name = "SHEET4"
OTHERBOOK.Worksheets("SHEET4").Activate

'(省略)
'(OTHERBOOKのSHEET4シートの中のあるセルが選択されるが
' どのセルが選択されるのかは未定)
'(省略)

'(1)
row_no = Selection.Row
'(2)
row_no = ActiveWindow.ActiveCell.Row
'(3)
row_no = OTHERBOOK.Selection.Row
'(4)
row_no = OTHERBOOK.ActiveSheet.Selection.Row
'(5)
row_no = OTHERBOOK.Worksheets("SHEET4").Selection.Row
'(6)
row_no = Application.ActiveWorkbook.ActiveSheet.Selection.Row

oApp.Application.Quit
Set oApp = Nothing
----------------------------------------------

投稿日時 - 2015-05-18 16:22:39

QNo.8977401

困ってます

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

新規ブックがactiveにならない原因は、Set OTHERBOOK = oApp.Workbooks.AddのoAppのようです。
Set OTHERBOOK = Excel.Workbooks.Addとすると新規ブックがactiveにする事が可能になりました。

Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
はexcel以外のソフトからexcelを起動させてるのでしょうから、上記方法で走るかは不明です。

私はVBAは独学なので、これ以上の回答は出来ないと思います。
yahoo知恵袋や、VBAのサンプルコード利用しているモーグの掲示板等で質問されると、ご希望の回答が得られるかもしれません。

モーグ掲示板
http://www.moug.net/faq/

投稿日時 - 2015-05-21 22:02:32

お礼

dogs_catsさん

CreateObject()は、
Excel以外のソフトからExcelを起動させる時に使うもので、
今回のように、
Excelから新規にExcelブックを作成する場合には、
CreateObject()を使わなくても、
dogs_catsさんのようなコードで十分ということですね。

このことが分かっただけでもよかったです。

ありがとうございました。

投稿日時 - 2015-05-22 09:16:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

新規ブックオープン及び新規シート挿入と同じsubプロシージャ内で処理させてるのでしょうか?
どのような選択をさせてるのか不明なのですが、inputboxを使用してセル選択をユーザーにさせれば行番号取得は出来ますよね。

Dim Target As Range

Set Target = Application.InputBox("セルを1つ選択してください", Type:=8)
MsgBox Target.Row

Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
Set OTHERBOOK = oApp.Workbooks.Add
上記3行の影響なのか最前面に表示されず、コードを記載したブックに表示されてしまいます。

下記のような新規ブック作成だとinputboxは最前面に表示されます。
Sub test()
Dim OTHERBOOK As Excel.Workbook
Dim row_no As Integer
Dim Target As Range

'新規ブック追加時のシート枚数を変更
Application.SheetsInNewWorkbook = 4

'新規ブックを追加し、シート数を確認
Set OTHERBOOK = Workbooks.Add

OTHERBOOK.Worksheets(4).Name = "SHEET"

Set Target = Application.InputBox("セルを選択してください", Type:=8)
MsgBox Target.Row


End Sub


データを呼び込み 値検索セル又は、最終行をアクティブにさせてからというのでしょうか?
OTHERBOOK.Worksheets("SHEET4").Activateの後であれば
(1)でも可能のはずですよね。
セル選択が出来ていないから、行番号の返り値が無いという事は考えられませんか?
セル選択方法のコードが無いので何とも言えなのですが。

駄文を長々書きましたが、参考になれば幸いです。

投稿日時 - 2015-05-19 17:41:50

補足

dogs_catsさん

回答ありがとうございます。


>新規ブックオープン及び新規シート挿入と同じsubプロシージャ内で処理させてるのでしょうか?

新規ではなく元のブックのプロシージャで処理をしています。


>どのような選択をさせてるのか不明なのですが

SQLの実行結果を新規ブックのシートに貼り付けて、
検索を実行して1つのセルを選択しています。


>セル選択が出来ていないから、行番号の返り値が無いという事は考えられませんか?

実際に1つのセルが選択状態になっていることを
ステップ実行で確認しながら実行しています。


>OTHERBOOK.Worksheets("SHEET4").Activateの後であれば
>(1)でも可能のはずですよね。

可能ですが、新規ブックではなく、
元のブックの方のセルの行が返されます。


>上記3行の影響なのか最前面に表示されず、コードを記載したブックに表示されてしまいます。
>下記のような新規ブック作成だとinputboxは最前面に表示されます。

の部分ですが、
今回の現象と関係しているようで少し気になっています。
以下のような簡単なサンプルを作成して実行してみたのですが
理由はよく分からないのですが、
Selectionの実行結果が違っています。
最初の質問のコード(test1)では駄目なのですが、
dogs_catsさんのコード(test2)では、
私が意図した挙動になっているのです。
なぜこのような違いが起きるのか
この理由がよく分からないのですが
何か分かりますでしょうか。

-----------------------------------------------------------
Sub test1()

Dim OTHERBOOK As Excel.Workbook
Dim row_no As Integer

 '自ブックのシートのA1を選択(区別のため)
 Worksheets("Sheet1").Cells(1, 1).Select
 Set oApp = CreateObject("Excel.Application")
 oApp.Visible = True
 Set OTHERBOOK = oApp.Workbooks.Add
 '他ブックのシートのC3を選択
 OTHERBOOK.Worksheets("Sheet1").Cells(3, 3).Select

 ThisWorkbook.Activate
 row_no = Selection.Row ' 1 (自ブックが対象になっている)
 OTHERBOOK.Activate
 row_no = Selection.Row ' 1 (自ブックが対象になっている)

End Sub
-----------------------------------------------------------
Sub test2()

 Dim OTHERBOOK As Excel.Workbook
 Dim row_no As Integer

 '自ブックのシートのA1を選択(区別のため)
 Worksheets("Sheet1").Cells(1, 1).Select
 Set OTHERBOOK = Workbooks.Add
 OTHERBOOK.Activate
 '他ブックのシートのC3を選択
 OTHERBOOK.Worksheets("Sheet1").Cells(3, 3).Select

 ThisWorkbook.Activate
 row_no = Selection.Row ' 1 (自ブックが対象になっている)
 OTHERBOOK.Activate
 row_no = Selection.Row ' 3 (他ブックが対象になっている)

End Sub
-----------------------------------------------------------

投稿日時 - 2015-05-20 16:26:42

ANo.1

row_no = oApp.Selection.Row

但し、事前に、OTHERBOOKのSHEET4がアクティブになっていないといけません。じゃないと「SHEET4じゃない、今、アクティブになっているシートの、セレクトされた範囲の先頭行」が返って来てしまいます。

投稿日時 - 2015-05-18 16:57:06

お礼

chie65535さん

row_no = oApp.Selection.Row
でうまくいきました。

新しく作成したブックは、
たとえアクティブにしてあったとしても、
Selectionだけでは駄目なんですね。
oAppは忘れそうなので、以下に
実行結果の違いを書いておきます。

ありがとうございました。

Sub test()
 Dim OTHERBOOK As Excel.Workbook
 Dim row_no As Integer
 '自ブックのシートのA1を選択(区別のため
 Worksheets("Sheet1").Cells(1, 1).Select
 Set oApp = CreateObject("Excel.Application")
 oApp.Visible = True
 Set OTHERBOOK = oApp.Workbooks.Add
 '他ブックのシートのC3を選択
 OTHERBOOK.Worksheets("Sheet1").Cells(3, 3).Select

 ThisWorkbook.Activate
 row_no = Selection.Row ' 1 (自ブックが対象になっている)
 OTHERBOOK.Activate
 row_no = Selection.Row ' 1 (自ブックが対象になっている)

 ThisWorkbook.Activate
 row_no = oApp.Selection.Row ' 3 (他ブックが対象になっている)
 OTHERBOOK.Activate
 row_no = oApp.Selection.Row ' 3 (他ブックが対象になっている)
End Sub

投稿日時 - 2015-05-20 15:28:37

あなたにオススメの質問