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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

4回答

8694閲覧

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

King_of_Flies

総合スコア382

VBA

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

0グッド

1クリップ

投稿2018/01/15 08:44

編集2018/01/15 08:53

お疲れ様です。

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

VBA

1Sub HogeMethd() 2  Dim S11 As WorkSheet 3 sheet11.Activate 4 Set S11.ActiveSheet 5 6 Dim Idx As Integer 7 Dim CountResult As Integer 8 Dim Range1 As String 9 Dim Range2 As String 10 11 For iIdx = 1 To 500 12 Range1 = Cells(iIdx + 4, 17).Address(RowAbsolute:=False, ColumnAbsolute:=False) 13 Range2 = Cells(iIdx + 4, 117).Address(RowAbsolute:=False, ColumnAbsolute:=False) 14 'CountResult = Application.WorksheetFunction.CountA(S11.Range("""Range1:Range2""")) 15 'Debug.Print (CountResult) 16 Debug.Print (Range1) 17 Debug.Print (Range2) 18 19 Next 20End 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
↑上手くいきませんでした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

>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ではここらへんをきっちり押さえておくとスムーズにコードが書けるようになってきますので、面倒でも使用するコマンドをひとつずつ調べて、うまく活用していってください。

投稿2018/01/16 04:44

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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/15 09:37

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2018/01/16 00:01

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

0

ベストアンサー

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

例えば

VBA

1Dim Range3 As Range 2

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

VBA

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

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

VBA

1CountResult = Application.WorksheetFunction.CountA(Range3)

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

投稿2018/01/15 09:25

cauliflowerjoe

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ExcelVBAer

2018/01/16 00:50

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

2018/01/16 02:10

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

0

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

VBA

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

投稿2018/01/15 08:58

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問