[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『RangeオブジェクトとCellsプロパティについて』(マッシ)
cellの値に変数を使用したいのですが、うまく利用できません。
質問の前に、まずは次のコードを載せます。
Sub Test1()
Dim d As Long
Dim e As Long
Dim f As Long
For d = 13 To 18
Worksheets(4).Activate
If Cells(d, 1) = "" Then
Range(Cells(d, 2), Cells(d, 8)).Copy Worksheets(2).Activate e = ActiveSheet.UsedRange.End(xlDown).Row f = e + 1 Cells(f, 2).PasteSpecial Paste:=xlValues End If Next End Sub このコードを実行すると、 Cells(f, 2).PasteSpecial Paste:=xlValues の部分で 実行時エラー'1004' '_Default'メソッドは失敗しました:'Range'オブジェクト の表示がでます。 変数fを数字に入れ変えると、例えばこのコードを Cells(8, 2).PasteSpecial Paste:=xlValues とすると、正常に動作します。 if〜then文やFor〜Next文で変数を使用する時に、 なにか決まりごとがあるのでしょうか? また、過去ログで1004エラーが出た場合というのがあり 変数の確認、Cellsプロパティの確認などが 指摘されていました。 変数の型は変数fをVariantやIntegerで試しましたが 効果はありませんでした。 Cellsプロパティについては VBAヘルプにオブジェクトが必要とありましたが Range("A6").Cells(r,1) のようにRangeオブジェクトに引数が必要と されていました。 このコードでの Cells(f, 2).PasteSpecial Paste:=xlValues セル番地f行2列目に値をペーストする、 という時のRangeオブジェクトの使い方が わかりませんでした。 また、Range(Cells(d, 2), Cells(d, 8)).Copy の部分のようなRangeオブジェクトとCellsプロパティの 使い方で正常に動作していることから その上の部分 If Cells(d, 1) = "" Then を If Range(Cells(d, 1)) = "" Then とすると、 実行時エラー'1004' 'Range'メソッドは失敗しました:'_Grobal'オブジェクト と表示されます。 この2つの文の違いは何が原因なのでしょうか? このコードではFor d = 13 To 18 としていますが、今後この部分にも変数を使用したいと思っています。 a = ActiveSheet.UsedRange.End(xlDown).Row b = a + 1 For d = 13 To b として実行しても動作がWorksheets(4).Activate しか実行されません。 この原因もCellsプロパティの使用方法にあるのでは? と考えています。 その他にエラー原因として考えているのは 最下行番号の取得部分 e = ActiveSheet.UsedRange.End(xlDown).Row が悪いのかな?と考えているのですが... 長文となり申し訳ありませんが、 VBAヘルプや他の文献を調べてもわからなかったので 教えて頂きたいと思っています。 よろしくお願いいたします。 エクセルのヴァージョンはExcel X for mac (macOS10.3.9)です。
このコードは標準モジュールに書いていますか? sheetモジュールに書いている場合、シート名を省略した記述は アクティブシートではなく、そのモジュールが対象になってしまいます。
あと、F8キーでステップ実行しながらローカルウィンドウで 変数の値を確認してエラーの発生するタイミングを調べてみては?
>e = ActiveSheet.UsedRange.End(xlDown).Row >が悪いのかな?と考えているのですが... これは何を取得したいのでしょうか? (INA)
Mac版Excel X では「標準モジュール」の表記がありません
。
標準モジュールを追加をしたら、コードを書いているモジュールの次に
新たにモジュールが作られたので、たぶん、書いているモジュールは
標準モジュールだと思います。
また、Mac版ではローカルウィンドウがありません。
よって変数値の確認ができませんでした。
そこでwindowsマシンにて同じコードを書き、実行してみました。
すると、INAさんご指摘の行でエラーが発生しました。
e = ActiveSheet.UsedRange.End(xlDown).Row
これはActiveSheetでの、入力のあるセルの最下行番号の取得のつもりなのですが...
(某サイトでRange("A1").CurrentRegion.End(xlDown).Rowとあったのを
UsedRangeを使ったのですが...)
ようは、別シートにペーストをする時に空行をなくしたいために、
このようにしました。
そこで、このコードを
Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
とし、左端列の入力のあるセルの最下行番号の取得としました。
(某サイトのコピペですが...)
それに伴いIF文の参照セル番地、コピーおよびペースト領域を変更すると、
動作しました。
また、
a = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For d = 13 To a
のコードを入れると、データ全てに実行されました。
ログインウィンドウに関しては過去ログより、
INAさんの記述があったので参考にさせていただきました。
もっと、うまい記述方法はあるのでしょうが、
徐々に勉強していこうと思います。
RangeオブジェクトとCellsプロパティの使用方法や性質については
まだ理解が不十分ですが...過去ログ参考に勉強します。
ありがとうございました。
丁寧なお返事有り難う御座いました。 ひとまず解決したようで何よりです。 RangeとCellsの違いは、表記の違いだけで効果は同じです。(セル範囲の取得) 文字列で指定するときはRange 数値で行列を指定するときはCells ただRangeの場合、複数のセルを取得できます。 Range("A1:C10") , Range(Cells(1,1),Cells(10,3))
(INA)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.