質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • VBA

    1809questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBA Cells(1,1)で指定したセルをRange("A1")に変換し、その範囲をCountAしたい。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,236

King_of_Flies

score 297

お疲れ様です。

下記コードをご覧いただけますでしょうか。

Sub HogeMethd()
  Dim S11 As WorkSheet
    sheet11.Activate
    Set S11.ActiveSheet

    Dim Idx As Integer
    Dim CountResult As Integer
    Dim Range1 As String
    Dim Range2 As String

    For iIdx = 1 To 500
        Range1 = Cells(iIdx + 4, 17).Address(RowAbsolute:=False, ColumnAbsolute:=False)
        Range2 = Cells(iIdx + 4, 117).Address(RowAbsolute:=False, ColumnAbsolute:=False)
        'CountResult = Application.WorksheetFunction.CountA(S11.Range("""Range1:Range2"""))
        'Debug.Print (CountResult)
        Debug.Print (Range1)
        Debug.Print (Range2)

    Next
End Sub

今のところ、CountResultの行はコメントアウトしていますが、
一回目のループで、
Range1はQ5
Range2はDM5と表示されます。

やりたいのはApplication.WorksheetFunction.CountA(S11.Range("Q5:DM5"))で取得できる数値をCountResultに入れたいのですが、
Range1,Range2はともに変数であるため、
Application.WorksheetFunction.CountA(S11.Range("Range1:Range2"))という書き方ではCountAの結果取得はできないことはわかっています。

そこで"のエスケープについて調べ、S11.Range("""Range1:Range2""")としたのですが、
これでも上手くいかないようでした。

また別途、解決策として以下があげられるのですが、こちらも実装方法がわかりません。
1.Cellsで範囲参照を行いRangeを使用せずCountAする。
よろしくお願いいたします。

追記
質問してから、Range(Cells(iIdx + 4, 17),Cells(iIdx + 4, 117)).Select)で行ける気がしてきたので、
試してみます。

追記2
↑上手くいきませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

Dim Range1 As Range
Dim Range2 As Range

Set Range1 = ...
Set Range2 = ...

CountResult = Application.WorksheetFunction.CountA(S11.Range(Range1,Range2))

ところで、
Set S11.ActiveSheet
ってどういう動きをするんでしょうか??

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 09:01

    SET S11 = ActiveSheetの間違いです すいません。

    キャンセル

+2

>Range(Cells(iIdx + 4, 17),Cells(iIdx + 4, 117)).Select)で行ける気がしてきた

この記述で「うまくいかなかった」とのことですが、範囲指定の方法としては間違っていないと思います。
部分的な記載ですので実際どのようなコードになっているかにもよりますが、うまくいかない原因は
・RangeやCellsの対象シートが明示されていない
・なぜか.Select)がついている?
といったあたりがあやしそうです。


ご自分でこの指定方法にたどりついたのならご存知かもしれませんが、Rangeには2通りの指定方法があります。

①アドレス指定
第1引数(String型)にアドレス文字列を渡すことでセル範囲を取得する方法です。
例:Set rng = Range("Q5:DM5")

②始点セル・終点セル指定
第1引数(Range型)に始点セル、第2引数(Range型)に終点セルを指定して、始点~終点のセル範囲を取得する方法です。
例1:Set rng = Range(Cells(5, 17), Cells(5, 117))
例2:Set rng = Range(Cells(5,"Q"), Cells(5,"DM"))

ちなみにCellsとRangeはどちらもRange型を返しますが、Cellsは単一セルのみを表すのに対し、Rangeは単一セルも範囲セルも表せます。
今回のような始点セル・終点セルなら単一セルでいいのでCellsで指定していますが、Rangeで指定しても問題はありません。
※単一セルを取回す場合にはCellsを使った方が扱いやすい場合が多いです。


他の方々からのアドバイスも、このいずれかの方法にするためのものです。
ExcelVBAではここらへんをきっちり押さえておくとスムーズにコードが書けるようになってきますので、面倒でも使用するコマンドをひとつずつ調べて、うまく活用していってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

Range1とRange2は変数なので、そのような使い方はできません。

例えば

Dim Range3 As Range

とあらかじめ定義しておき、

Set Range3 = Range(Cells(iIdx + 4, 17), Cells(iIdx + 4, 117))


で、Range1(Q5)とRange2(DM5)の範囲のオブジェクトを作り、

CountResult = Application.WorksheetFunction.CountA(Range3)


というように、CountAのパラメータとして上記の「範囲のオブジェクト」を送ってやれば、正しい値が得られます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 09:50

    たぶんお分かりとは思いますが、念の為に補足を。
    Range(Cells(), Cells()) の Range,Cells両方の頭に[S11.]を付けないと、
    暗黙的にActiveSheetが参照され、
    後で処理が変わる等で意図しない結果になる可能性があります(潜在バグ)
    のでご注意を。

    キャンセル

  • 2018/01/16 11:10

    補足ありがとうございます。
    無意識にActiveSheetを使う前提で書いてしまいました。

    キャンセル

0

こんな感じでしょうか(動作未確認)

CountResult = Application.WorksheetFunction.CountA(S11.Range(Range1 & ":" & Range2))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1809questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。