【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?

お世話になります。

エクセル2003のマクロで質問です。
しばらく考えたのですがうまく質問できるか不安です、このファイルを見てもらって「こーしたい」「あーしたい」言えれば一番良いのですが…

記録シートのA1のセルに
=COUNTIF(集計!J1:J100,100)
とあるとします(集計シートJ1からJ100の中から100の数を拾いなさいですね)

ここで選択範囲の記録シートのA1のセルを選択してマクロの記録にて
1)数式バーで「=COUNTIF(集計!J1:J100,100)」の「集計!J1:J100」を選択
2)集計シートにてマウスでJ1を選択し、「Shift+Ctrl+↓」でJ1からデータを含むデータの途切れるセルまで選択
3)記録の終了
をしました。

私の考えとして、「Shift+Ctrl+↓」の理由は(なぜマウスで範囲をドラッグしなかったか)
集計J1からJ100
が将来
集計J1からJ101、もしくは集計J1からJ200
のように範囲が増えた場合に対応できる為に「Shift+Ctrl+↓」で選択範囲を選びました。

ところが、これをマクロの自動保存で手順を保存すると
=COUNTIF(集計!J1:J100,100)
のようになって、私の希望する
=COUNTIF(集計!J1をクリックして「Shift+Ctrl+↓」)
になりません。

そこで質問の仕方を変えて
http://oshiete1.goo.ne.jp/qa2511024.html
のように質問させていただき
Range(Selection, Selection.End(xlDown)).Select
を入れれば良いと思ったのですが
=COUNTIF(集計!J1をクリックしてRange(Selection, Selection.End(xlDown)).Selectで,100」)
にしたいわけです。

初心者で勉強不足はごもっともですがどうか良きアドバイスいただけないでしょうか?。宜しくお願いいたします。

A 回答 (2件)

「Shift+Ctrl+↓」を再現するならこれ↓



Sub Sample01()
  Dim cnt, endline As Long
  endline = Range("J1").End(xlDown).Row
  cnt = WorksheetFunction.CountIf(ActiveSheet.Range("J1:J" & endline), 100)
  MsgBox cnt
End Sub

ですが、途中に空白行があると、うまく行きません
もし、その恐れが有る場合は、これ↓で、行けると思います

Sub Sample02()
  Dim cnt, endline As Long
  endline = Range("J65535").End(xlUp).Row
  cnt = WorksheetFunction.CountIf(ActiveSheet.Range("J1:J" & endline), 100)
  MsgBox cnt
End Sub
    • good
    • 0

こんばんは。



>初心者で勉強不足は

そうではないと思います。ご質問の持っているその内容のレベルは、決して入門編ではないからだと思います。こういう動的なコードは、もう少し、セルやシートのオブジェクトやメソッドに慣れてからのほうがよいです。いきなり、こういう動的な処理を扱うのは、少し難しいのです。また、ワークシート関数を、入門編では扱わないほうがよいです。上級文法を習った後のほうがよいです。

また、本当に、言葉通りの仕様を、そのまま反映させるには、本来は、イベント・ドリブン型マクロにしたほうがよいのかもしれません。

>Range(Selection, Selection.End(xlDown)).Select
>を入れれば良いと思ったのですが
>=COUNTIF(集計!J1をクリックしてRange(Selection, Selection.End(xlDown)).Selectで,100」)

それを表すと、こうなります。

'--------------------------------------------
'コードの登録はシートモジュールでも可能
Sub MacroCountIf_0()
Const MYSEARCH As Variant = 100 '検索値

'End(xlDown)プロパティの空範囲のSelectの回避
If Selection.Value = "" Then
  MsgBox "データのある場所から行ってください!", vbinfomation
  Exit Sub
End If

Range(Selection, Selection.End(xlDown)).Select
 MsgBox WorksheetFunction.CountIf(Selection, MYSEARCH)
Selection.Cells(1).Select '範囲選択を外す
End Sub

'--------------------------------------------

'以下は、標準モジュールに登録します。(上記とは少し意味が違います)
Sub MacroCountIf_1()
Dim myRng As Range
Const MYSEARCH As Variant = 100 '検索値
Set myRng = Range(Selection, Cells(65536, Selection.Column).End(xlUp))
 MsgBox WorksheetFunction.CountIf(myRng, MYSEARCH)
Set myRng = Nothing
End Sub

'----------------------------------------------------
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!