[[20051123091757]] 『RangeオブジェクトとCellsプロパティについて』(マッシ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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)
 

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.