こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA 取得したセルの列の最終行

お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが
下記でつまってしまいました。

Wb.Worksheets("Sheet1").Cells.Find("実施日").Select
Sel_Col = Selection.Column

Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1

For i = Last_Row To 2 Step -1
If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2
If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then
A_count = A_count + 1
ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then
B_count = B_count + 1
ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then
C_count = C_count + 1
End If

Else
End If

Next i

まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して
その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の
中での最終行が取得されてしまいます。
この場合、Sel_Col をどのように使えばよろしいでしょうか?

次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら
日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを
カウントするという造りにしたいと思っています。
実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと
出てしまいます。

Wbはset Wbとして開いたブックを定義しています。
DayはDay = Dateで今日の日付を取得しています。

独学で無茶苦茶なコードですが、
どなたか詳しい方、ご教示お願いいたします。

投稿日時 - 2017-02-02 14:28:52

QNo.9288823

すぐに回答ほしいです

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

こんにちは
「実施日」というセルは1つしかないのですね?
' 不要 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select
Sel_Col = Wb.Worksheets("Sheet1").Cells.Find("実施日").Column
Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, Sel_Col ).End(xlUp).Row
で。
Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value
は、
Wb.Worksheets("Sheet1").Cells(i, Sel_Col, i).Value
です。
Cells(行, 列)ですから。

全体的には、ループでなくても関数CountIFだけでも出来そうですね。

投稿日時 - 2017-02-02 14:41:04

補足

ushi2015様

早速ご回答ありがとうございます。
最終行などを取得するのと代入するのを纏めてするということと
Cellを使用する際、行と列を間違えていました。

そこは上手くいきましたが、下記がまだ上手くいきません。

得られたカウント数を下記のようにセルに入力したいのですが
Rangeだと上手くいき、Cellだとエラーになってしまいます。
何か違いがあるんでしょうか?

○ Worksheets("Sheet2").Range("C10") = A_Count
× Worksheets("Sheet2").Cell(10, 3) = A_Count

また、本来は入力する先のセルも行列を取得して
下記のように指定したいというのが、やりたいことになります。

ThisWorkbook.Worksheets("Sheet2").Cell(Thisbook_A_Row, Thisbook_A_Col) = A_Count

お手数ですが、宜しくお願いします。

投稿日時 - 2017-02-02 15:59:51

お礼

この問題に関して、解決できました。
ありがとうございました。

投稿日時 - 2017-02-02 18:08:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

補足での、Cell( )はエクセルシートの場合はsが必要で シート.Cells(i,j)の書き方ですよ。質問ではsを付けているので凡ミスか。小生もよくミスるよね。
(WordVBAのテーブルなどやると、Cell(sなし)もでてきて混乱するが。)
ーーー
他の点で
Sub test01()
Set Rng = Union(Range("A2"), Range("b5"), Range("c7"), Range("d9"))
Set x = Rng.Find(Range("a1")) '<--
MsgBox x.Row '<--
MsgBox x.Column
End Sub
Findメソッドは上記のような書き方もできる

投稿日時 - 2017-02-02 17:37:06

お礼

ありがとうございます。
凡ミスでした。

投稿日時 - 2017-02-02 18:06:58

ANo.2

消し忘れました。
Wb.Worksheets("Sheet1").Cells(i, Sel_Col, i).Value

Wb.Worksheets("Sheet1").Cells(i, Sel_Col).Value
で。

投稿日時 - 2017-02-02 14:42:22

あなたにオススメの質問