Excel VBA で標準モジュールから Range メソッドの実行
Excel2016 の VBA で、ワークシートのイベントから、標準モジュールの関数を呼び出しています。
ThisWorkBook はキチンと取得できているようですが、ActiveSheet が取得できないようです。
WorkSheet("Sheet1").Select としても、Range メソッドが失敗します。
WorkSheet("Sheet1").Name はキチンと「Sheet1」が取得できています。
どうしてアクティブなシートなどが取得できずに Range メソッドが失敗するのでしょうか?
因みに下記コードの Cells プロパティは正常に取得できています。
発生している問題・エラーメッセージ
実行時エラー 1004 「アプリケーション定義またはオブジェクト定義のエラーです。」
該当のソースコード
Excel2016
1(一部抜粋) 2Dim wSh As WorkSheet 3Dim sTemp As String 4 5sTemp = ThisWorkbook.Sheets("Sheet1").Name '←これは「Sheet1」が取得できる 6Set wSh = ThisWorkbook.Sheets("Sheet1") '←正しい?(複数やった中の方法のひとつ) 7sTemp = wSh.Range(Cells(2, 3)) '←ここでエラーとなる
試したこと
関数の引数として ActiveSheet を参照渡しもしてみましたが変わりませんでした。
同じように WorkBook を参照渡しすると、そちらは正常に渡っているようです。
色々とシートの指定方法は試してみましたが、状況は変わりませんでした。
ちなみに、ローカルウォッチで確認すると、
一応 WorkSheet オブジェクトとして認識はされていそうです。
補足情報(FW/ツールのバージョンなど)
Windows7 SP1 32bit + Excel2016 VBA
シートの「On_Click」から標準モジュールの Public 関数を呼び出しています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
受け取りたい型は?
sTemp = wSh.Range(Cells(2, 3))
の処理でsTempには何を受け取りたいのでしょうか?
C2セルに入力されている値ですか?
それともC2セルを指すRangeオブジェクトですか?
前者(セルの値の代入)であれば、
sTemp = wSh.Cells(2, 3).Value
とすればよいです。
単一のセル範囲指定になっていればRangeプロパティを使って
sTemp = wSh.Range(wSh.Cells(2, 3), wSh.Cells(2, 3)).Value
としても取得できると思います。
しかし複数セル範囲が指定されたらエラーがおきそうです。
後者(Rangeオブジェクトを代入)の場合、オブジェクトの代入になるのでSet句が必要です。
Set sTemp = wSh.Cells(2, 3)
または
Set sTemp = wSh.Range(wSh.Cells(2, 3), wSh.Cells(2, 3))
Rangeプロパティの指定方法について
ここからは補足情報です。
Rangeプロパティには引数の指定方法が2種類あります。
⇒MSDN
①Range ( arg ) プロパティ ②Range ( cell1, cell2 ) プロパティ
①の指定方法では、引数argにはセルのアドレス文字列("A1"・"B2:D5"など)を指定します。
結果、指定したアドレスの示すセル範囲をRangeオブジェクトとして返します。
②の指定方法では、引数cell1,cell2として2つのRangeオブジェクトを渡します。
結果、cell1を始点、cell2を終点としたセル範囲をRangeオブジェクトとして返します。
今回の指定方法は、引数が1つしか指定していませんが、渡しているのはCellsなのでRangeオブジェクトです。
しかしRangeプロパティにはRangeオブジェクトを1つだけ指定するような引数指定は用意されていません。
ここでExcelはこう考えます。
⇒Rangeオブジェクトを渡されたけど、引数は1つしかないからアドレス文字列なのかもしれない。
⇒RangeオブジェクトのValueプロペティの値をアドレス文字列として使ってあげよう。
しかしそのセルにはアドレス文字列として使用できるような文字は入力されていませんでした。
Excelはできる限りがんばったけど解決できずエラーとなります。
型を意識していないと思わぬ結果となりますよ、という話です。
参考になれば幸いです。
投稿2018/02/09 09:32
編集2018/02/09 09:47総合スコア3020
0
ベストアンサー
VBA
1sTemp = wSh.Range(Cells(2, 3))
RangeはwShから参照してますが、CellsはwShを使用していないのが原因と思われます。
以下のように修正してみてください。
VBA
1sTemp = wSh.Range(wSh.Cells(2, 3)) 2 3または 4 5With wSh 6 sTemp = .Range(.Cells(2, 3)) 7End With
投稿2018/02/09 07:50
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
Cells(2, 3)の文字列が欲しいならこうかな?
Dim wSh As Worksheet Set wSh = ThisWorkbook.Worksheets("Sheet1") Dim sTemp As String sTemp = wSh.Cells(2, 3).Text
投稿2018/02/09 08:19
総合スコア4152
0
Rangeへの引数が1つだけの場合、Rangeのアドレス(文字列)指定とみなされているのではないでしょうか
つまり、Cell(2,3)に入っている文字列をRangeのアドレスとして参照しようとしていると。
wSH.Range(wSH.Cells(2,3),wSH.cells(2,3)) ならエラーになりません。
投稿2018/02/09 08:10
総合スコア505
0
他の方の回答まで見れてないでの既出かもですが、
原因は、Range や Cells の[.]無しエラー系です。
wSh.Range(Cells(2, 3)) の「Cells()」は何を参照しているのでしょうか?
Range、Cellsは[.]無しだと、ActiveSheet が参照されるので、
wSh.Range(ActiveSheet.Cells(2, 3)) と解釈されます。
そうなると、どうやってRangeオブジェクトが取得されるのでしょうか?
wSh.Range(Cells(2, 3).Address) なら取得できるはずです。
余談ながら、自分はシートのRange、Cellsを参照する際は、
基本的には With で囲むようにしています。
Withの範囲で他のシートのセルを参照しなければならない場合は、
局所的にWithを使用して、Range型変数にいれて処理させています。
少々面倒ですが、意味不明なエラーに悩まされなくて済むので。。。
投稿2018/02/10 05:26
総合スコア1175
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
色々な問題が複合的に重なっているようですね。皆様の回答をまとめると
まずrangeで取得したいのであれば、宣言部は
vba
1Dim sTemp As Range
格納する際は
vba
1set sTemp = wSh.Range(Cells(2, 3),Cells(2, 3)) 2
別シートから参照される場合はcellsが意図しない動作(プログラマにとって、実際は仕様通り)をするのを防ぐために
vba
1With wSh 2Set sTemp = .Range(.Cells(2, 3), .Cells(2, 3)) 3end with
としましょう。そしてなんか引っかかったので、原点に返ってみると
引用テキスト標準モジュールの関数を呼び出しています。
ということは、ユーザ定義関数としてセルで=関数名()とかで呼び足しているということでしょう。
それと・・
rangeが落ちる
つまりセルに期待した結果が返ってこない。コードを実行すると動くのに、セルの再計算とかでは反映されない。といったことなのではないでしょうか?
functionをユーザー定義の関数として使う場合
セルの挿入/削除
他セルの値の変更
アクティブセルや選択範囲の変更
シートの挿入/削除や名前の変更
Excelの設定の変更
などはできないです。(そーゆう仕様です)
つまり
vba
1sTemp.Select
これ出来ないです。
なぜかというと、セル一つ一つに関数が仕掛けられた場合、各セルが計算されだけでシート名が変わったり画面が違うシートに移動したりしたら、そのシート使い物にならないからです。
セルから呼び出される関数なのかsubから使われるfunctionなのかで実装の仕方が違うということをお伝えします。
投稿2018/02/10 02:42
編集2018/02/10 02:45総合スコア107
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 00:45
2018/02/13 01:33 編集