• ベストアンサー

Excel VBA セル位置が取得できません

条件1の時、セル位置を変数(gyo1)に代入し、 条件2の時、セル位置を変数(gyo2)に代入。 その後、countif(gyo1:gyo2)として、 その数値を別のセルに表示させる。 という構文を作りたいと思っています。 しかし、adressプロパティを記述しても、「オブジェクトが必要です」とエラーが出てしまいます。 (expressionをSelectionに変えるとエラーは出ないのですが、この違いや意味ってなんでしょうか。) さらに、この構文はFor文で繰り返しているのですが、 最初にgyo1の値が「A2」となっても、次の繰り返し時、条件が一致したても、gyo1が更新されず、「A2」のままだったりします。 (イメージでは、「A10」とか、A列を下に移動していくはずです。) また、gyo1,gyo2の変数宣言は、どのようにすれば良いでしょうか。 以下、作成中のコードを記述します。 力を貸してくださいませ。よろしくお願いいたします。 row = 2 If Cells(row, 1) <> Cells(row - 1, 1) Then gyo1= Selection.Address(Cells(row, 1)) End If If Cells(row, 2) <> Cells(row - 1, 2) Then gyo2 = Selection.Address(Cells(row, 2)) End If Cells(row,5).value = countif(gyo1:gyo2)

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

  • ベストアンサー
  • pulsa
  • ベストアンサー率57% (34/59)
回答No.4

すいません >条件1の時、セル位置を変数(gyo1)に代入し、 >条件2の時、セル位置を変数(gyo2)に代入。 から、てっきりgyo1にCellsを指定すれば、そのRangeがgyo1に代入されると思い込んでいました   Dim MyRow As Integer   Dim gyo1 As Range   Dim gyo2 As Range ・ ・ ・       Set gyo1 = Cells(MyRow, 1)     Set gyo2 = Cells(MyRow, 2)     Cells(MyRow, 5).Value = WorksheetFunction.CountIf(Range(gyo1, gyo2), ">0") gyo1・gyo2 がどのように宣言されているかわかりませんが、VariantかRangeで宣言してください Set でRangeObjectと指定するのを忘れていました 申し訳ありません あと、前回言っていませんが、Rowは元からエクセルVBAに含まれている変数名ですので、別な変数名にするのをお勧めします(例はMyRowです)

Trader-Aki
質問者

お礼

おかげさまで問題解決できました。(^^) 何度もアドバイスいただき、本当にありがとうございました。 もっと自己学習に努め、VBAを使いこなせるよう目指します。

その他の回答 (3)

  • pulsa
  • ベストアンサー率57% (34/59)
回答No.3

ほんじゃ回答の補足を引き継ぎます まず、WorksheetFunction の使い方から CountIf に限らず WorksheetFunction の引数は『基本的にセルに書くのと同じ形式』で入力します 例えばSUM  セルだと =SUM(A1:A2) なんて書きますね WorksheetFunction だと WorksheetFunction.Sum(Range("A1:A5"))  です 引数を変数で入れるなら Set MyRange = Range("A1:A5") WorksheetFunction.SUM(MyRange) てな具合 この辺の規則性が判れば、あとは簡単 NO.1の方が言う通り、CountIf の場合 COUNTIF(範囲,検索条件) 範囲 セルの個数を求めるセル範囲を指定します。 検索条件 計算の対象となるセルを定義する条件を、数値、式、または文字列で指定します。式および文字列を指定する場合は、">32"、"Windows" のように、半角の二重引用符 (") で囲む必要があります。 なので、引数が足りません そもそもここはRange範囲を入れるので Range("○:□") の形です 範囲は(gyo1:gyo2)で取ってるつもりのようですが、『:』が文字ではない為、まず構文エラーです つまり Range(gyo1 & ":" & gyo2) となります VB or VBA では、文字は "(ダブルコーテーション)で囲みます また、文字の連結には & を使います  それと、折角No.2の方が .Address としてくれていますが、Range として使用するので、 gyo1 = Cells(row, 1) gyo2 = Cells(row, 2) でOK Range(gyo1 ,gyo2) となります さらに言えば Range(Cells(row, 1),Cells(row, 2)) と使えば済む話なので、行けるのであれば変数に一旦受ける必要も無いかも・・・ もう少しです 次は肝心の検索条件です >数値が入力されていれば数えたい 予想された通り ">0" です これが検索条件となります 完成 Cells(Row, 5).Value = WorksheetFunction.CountIf(Range(gyo1, gyo2), ">0") とまあここまで書いてアレですが、WorksheetFunction は最初の内、実際にセルに =COUNTIF(A1:C1,">0") とか書いてからそれをコピペして、各カンマごとの引数を変数なりに置き換えて行くと混乱しにくいですよ

Trader-Aki
質問者

補足

回答ありがとうございます。^^ アドバイスのとおり、 gyo1 = Cells(row, 1) gyo2 = Cells(row, 2)  と、 Cells(Row, 5).Value = WorksheetFunction.CountIf(Range(gyo1, gyo2), ">0") を構文に取り入れてみました。 しかし、 Cells(Row, 5).Value = WorksheetFunction.CountIf(Range(gyo1, gyo2), ">0")のところで、 「Rangeメソッドは失敗しました。Globalオブジェクト」というエラーが出てしまいます。 原因が分からず、また止まってしまいました。(TT) また、gyo1とgyo2には、セル位置(A2とか)ではなく、セルの数値が代入されていますが、これでカウントイフできるのでしょうか? セル位置を入れて範囲指定するものだと思っていましたので...

  • pu--n
  • ベストアンサー率56% (32/57)
回答No.2

こんにちわ。 要するに、gyo1に Cells(row, 1)、gyo2に Cells(row, 2) のアドレスを取得したいとのことでよろしいのでしたら、以下のようにすれば取得できます。 Dim row As Integer '定義されていると思いますが・・ Dim gyo1 As Variant 'string形式でもOK Dim gyo2 As Variant 'string形式でもOK row = 2 : : gyo1 = Cells(row, 1).Address row = row + 1 '次の行へ : : gyo2 = Cells(row, 2).Address row = row + 1 '次の行へ : : これで解決するようでしたら、ほとんど丸投げに近いので注意してね!。

Trader-Aki
質問者

補足

回答ありがとうございます。 教えて頂いたコードで、問題解決できました。(^^) ↓この件も、初歩的な質問かもしれませんが、アドバイス頂けると嬉しいです。 Cells(row, 5).Value = WorksheetFunction.CountIf(gyo1:gyo2) gyo1からgyo2までの範囲で、数値が記載されているセルの数を数え、 Cells(row,5)に表示させたいのですが、いろいろ試してもエラーが出てしまいます。 よろしくお願いいたします。 丸投げとご指摘を受けて反省しています。 今一度、自己学習に努めたいと思います。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

選択されているセルが変化しないならSelection.AddRessの返すデータは変化しないように思います AddressはRangeオブジェクトまたは HyperLinkオブジェクトのプロパティです Selectionは Rangeオブジェクトを返すので Selection.Addressといった使い方は出来ます ですが 単に Addressとしても Excelはそんな命令を知りません したがって エラーになるのです COUNTIFは ワークシート関数ですから WorksheetFunction. をつけないといけないでしょう 引数も足りませんよどのような条件でカウントするのかを与えないといけません ユーザー定義の関数として countifを実装しているなら的外れですが

Trader-Aki
質問者

補足

回答ありがとうございます。 gyo1 = Cells(row, 1).Address とする事で問題解決できました。 VBAの基礎がまだ身についていないんだと、改めて実感しましたので、 ネットや書籍で、これから自己学習を高めていこうと思います。 COUNTIFの使い方も理解できていなく、下記コードにも苦戦しています。 Cells(row, 5).Value = WorksheetFunction.CountIf(gyo1:gyo2) gyo1からgyo2範囲の数値をカウントしたいのですが、エラーが出てしまいます。 (数値が入力されていれば数えたいので、条件は>0でいいのでしょうか。) アドバイス頂けたら嬉しいです。 よろしくお願いします。

関連するQ&A