- ベストアンサー
エクセルマクロでCellsの範囲選択について
- Excelのマクロを使用して、特定のセルの範囲を選択する方法について説明します。
- エクセル2003で、セルA1に表示される行番号を使用して、特定の範囲を選択する方法を学びたいです。
- 記述したマクロの中でエラーが発生し、問題の解決策が分からないので、助けてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
文法的には問題ないですが、 A1セルには、どういう値が入っているのでしょうか 試しに Dim j As Double j = Range("A1").Value では Sub ボタン1_Click() Dim j As Double j = Range("A1").Value Worksheets("Sheet1").Activate Range("E" & j & ":J" & j).Select End Sub の方がシンプルかな?
その他の回答 (3)
- cj_mover
- ベストアンサー率76% (292/381)
お邪魔します。 > ※のところでエラーが出てしまい、問題がわからずにおります。 エラーメッセージとエラーナンバーをチェックして それをヒントにして原因を探る習慣をつけるようにしましょう。 特に、限られた情報から問題解決をアドバイスする回答者 にとっては必要な情報です。 さておき。 与えられた情報から。もっとも可能性が高いと私が判断する問題点 についてレスしてみます。 Sub マクロ1()が書かれたモジュールは「標準モジュール」でしょうか? もし、 それが「シートモジュール」に書かれていて もし、 そのシートモジュールのシート名が"Sheet1"ではない場合は、 |実行時エラー '1004': | |アプリケーション定義またはオブジェクト定義のエラーです。 このようなエラーメッセージが表示される筈です。 この場合は、Sub マクロ1()の記述が不適切です。 > Range(Cells(j, 5), Cells(j, 10)).Select ←※ の一行のうち、Range プロパティ、Cells プロパティ、計3箇所、 親オブジェクトの省略をしてしまうと、 Sub マクロ1()が書かれたシート の Range(Cells(j, 5), Cells(j, 10)) を .Select するように命令しているけれど、 直前に Worksheets("Sheet1").Activate つまり、Sub マクロ1()が書かれたシート以外のシートが選択されているので、 アクティブではないシート上のセルを.Selectすることは出来ないので、 エラーとなります。 解決策a■ Sub マクロ1()をそのまま標準モジュールに移す(シートモジュールから切り取る)。 記述はそのままで、元あったシートモジュールからのみ呼び出す。 解決策b■(モジュールは変えずに) ' ' =========================== Sub マクロ1c() Dim j As Integer j = Range("A1") With Worksheets("Sheet1") .Select ' .Activate と.Select の違いを理解できるまでは専ら.Select を使いましょう .Range(.Cells(j, 5), .Cells(j, 10)).Select End With End Sub ' ' ==========または=========== Sub マクロ1j() Dim j As Integer j = Range("A1") With Worksheets("Sheet1") Application.Goto .Range(.Cells(j, 5), .Cells(j, 10)) End With End Sub ' ' =========================== 備考■ 初学者が知らずにいる(教えて貰えない)ことが意外と多い注意点ですが、 注釈なしにプロシージャが書かれていたとしたら、それは 標準モジュールの記述であるというのが暗黙のルールです。 また、特別な理由がない限り、プロシージャは標準モジュールに書くものです。 VBAを扱うブック(プロジェクト)には、 真っ先に標準モジュールを追加する習慣をつけ Sub プロシージャ、Function プロシージャは標準モジュールに書きましょう。 参考■ Sub マクロ1c()をWithステートメントを用いずに書くと以下のようになります。 ' ' =========================== Sub マクロ1cc() Dim j As Integer j = Range("A1") Worksheets("Sheet1").Select Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(j, 5), Worksheets("Sheet1").Cells(j, 10)).Select End Sub ' ' =========================== 参考■ Sub マクロ1c()を標準モジュール用に 親オブジェクトをきちんと指定して アクティブシート如何、サブプロシージャ呼び出し元如何などの状況に 左右されないように書くと以下のようになります。 ' ' =========================== Sub マクロ1ccc() Dim j As Variant j = Worksheets("行番号が設定されたシートのシート名").Range("A1") With Worksheets("Sheet1") .Select .Range(.Cells(j, 5), .Cells(j, 10)).Select End With End Sub ' ' =========================== 課題■ Range("A1")には手作業で入力規則を設定して 非負整数(または[1-65536]の整数)以外は入力できないようにしておくのが安心で簡単だと思います。 (もし設定済みであるとか該当しないケースであるなら、そういう情報も必要です) > Dim j As Integer > j = Range("A1") 「「[1-65536]の非負整数」以外の値」がRange("A1")に設定されると ここにもエラーの可能性があることだけは指摘しておきます。が、 必要に応じて書けるようになればいいので、この点は あまり神経質に考えなくてもいいと私は思います。 一応、本来VBAでは、セル範囲の値を受ける変数の型はVariant型で、 Variant型変数の内部データ型をVarType()関数などで確認したり、 値によって条件分岐したり、というのが、堅実なやり方ではあります。 ■■ > A1には行番号にあたる変数が表示される A1に手入力することはないのかな?あるのかな? 数式の結果、という意味なのか、VBAによって値を設定しているのか、 外部のプログラム?クエリとか? いずれにしても(場合によって多少読み替えて貰う必要はあるにしても)、 「「親オブジェクト」を確認しましょう」という内容の、レス、でした。 なお、 望み通りの結果が得られない場合でも 黙して諦めるのではなく どのようなことを実際に試して 具体的にどのような結果だったのか 報せるとか、 誤解があるなら補足するとか、 対話の中から解決策を探していくように構えていた方が うまくいくことが多いです。
jの値は、確かに何かの数字が入っているのでしょうか? ステップインで実行させ、「j」にカーソルを当てると何が入ってるか分かります。確認しましょう。 例えば、マクロ開始時に選択されてるワークシートは、Sheet1で確かでしょうか?違うならばjには別シートのA1の値が入ってます。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! お示しのコードで問題ないように思われますが・・・ 強いて言えば、A1セルが空白・もしくは0以下の場合にエラーになると思いますので、 一例ですが、↓のようにしてみてはどうでしょうか? Sub マクロ1() Dim j As Integer Worksheets("Sheet1").Activate j = Range("A1") If j > 0 Then Range(Cells(j, 5), Cells(j, 10)).Select End If End Sub 他の原因ならごめんなさいね。m(_ _)m