[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAにて 可変列の最終行を取得したいのですが・・』(さと)
初歩的なことかもしれませんが、教えてください。
まず可変する列の最終列を取得し、
(Set f = Cells(6, Columns.Count).End(xlToLeft) '6行目に項目名があるため)
その最終列から2列左+6行下に移動
(Set r1 = f.Offset(7, -2) 'そもそも2列左の列を選択したい+6行下からレコードが存在するため)
この「r1」を最上段セルとし、
最下段セル「r2」(途中空白あり)をxlUpを用いて選択した上で
r1〜r2を選択し、空白セルがある場合=メッセージを出す
ということをしたいのですが、
r2を算出する時点でうまいコーディングができずにいます。
※変数は「f」「r1」「r2」を Rangeとしています。
良いアドバイスをいただけないでしょうか。
よろしくお願い致します。
※初心者故 うまく説明ができておらず、過不足があるかもしれませんが、
ご質問いただければ回答しますので、何卒お手柔らかにお願い致します。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
こんな感じで...
Sub test() Dim r As Range, c As Range With Rows(6).Find("*", , , , 2, 2) Set r = Range(.Cells, Cells(Rows.Count, .Column)).Find("*", , , , 1, 2)(7, -1) MsgBox r.Address '<- 2列左,6行下が取得されているか確認 End With Set c = Range(r, Cells(Rows.Count, r.Column)).Find("*", , , , 2, 2) If c.Row <= r.Row Then MsgBox r.Address & " の下行にデータ無し": Exit Sub If Application.CountBlank(Range(r, c)) Then MsgBox "空白あり" Else MsgBox "空白無し" End If End Sub (seiya) 2016/02/04(木) 18:56
早速のご教示、ありがとうございます。
一定の方法しか思いついていなかたので、とても参考になりました。
ただ、これですと最下段まで6行下にズレてしまようで
当然(枠外になるので)「空白」が存在してしまいます。
何か策は無いものでしょうか・・・。
(さと) 2016/02/05(金) 09:29
どのようなデータ配列がされて、何を取得したいのかを詳しく例を挙げて説明してもらえますか? (seiya) 2016/02/05(金) 09:38
行・列の可変があるマトリクスの最終3列で
そのマトリクスの値が正しいかをチェックしています。
(今回 必要としているのはIDチェックの列になります=先頭列にもあるのですが、列が長くなった時用に左側にも入る仕組みになっています。)
ただ、何かエラーがあった時に その左側のIDが空白になってしまうことがあるらしく、
それをチェックしたい!というのが主旨です。
そのID列が最終列から2つ左の6行目にフィールド名があり、
そこから7行下から実際のIDが入る!という仕組みです。
要するに
後ろから3列目の12行目〜表の最下段に「空白が存在するか」をチェックしたい
というカンジです。
説明になっていますでしょうか?
そもそも12行目を開始とすれば良・・・かったりするんでしょうか?
(さと) 2016/02/05(金) 09:52
>後ろから3列目の12行目〜表の最下段に「空白が存在するか」をチェックしたい この[最下段]とは、[後ろから3列目]の最後にデータのある行、という意味ですか? (seiya) 2016/02/05(金) 09:57
そうなります。
但し、途中に空白が存在する・・・かもしれない
というチェックをしたいのです。
ちなみに、(今 表を確認していて気付いたのですが(今さらですみません))
最終列は(行としては同じ動きをしますが)空白が入らない仕様になっています。
(単に行内の修正(SUM)しているので、空白が途中にあっても「0」の表示になるからです。)
最終列の12行目〜最下段を選択し、それを左に2列移す・・という方法はアリでしょうか?
(さと) 2016/02/05(金) 10:04
少し整理しましょう。
1) 列項目が6行目にある。 2) 行・列共に可変で最終列には数式が入力され、各行の集計がされている。
この状況で 最終列から3列左の列に列項目(6行目)からその列のデータがある最終行に空白があるか調べる。 もし1行でも空白がある場は最終列の数式?値?をその列に移す?
ということですか?
(seiya) 2016/02/05(金) 10:19
整理、ありがとうございます。
少し異なる部分があるので、そこを説明させていただきます。
1・2はそのままの認識で大丈夫です。
条件を追記すると・・
3.項目名は6行目だが、実レコードが入っているのは そこからまた7行下からになります。
(要するに、項目名と実レコードの間に空白が6行入ってしまうフォームになっているんです。)
4.実レコード(13行目〜最下段)内に空白があるかをチェックし、メッセージを表示させる。
※12行目だと思っていましたが、6行目の6行下なので13行目でした。失礼しました。
単純に「項目名のある6行目〜最終行をチェック」してしまうと
当然、空白があるため「空白アリ」になってしまうわけです。
最終列にも同じく 6行目に項目名があり、そこから6行は「空白」その下(要するに12行目)から最下段までは
空白は無く、実レコードが入っている。というカンジです。
※最終列の左隣列の実レコードは全て空欄になっています。
いかがでしょう?
【↓イメージ↓】 ※ズレたら すみません!
行数
1 2 3 4 5 6 ・・・ ID 備考 数量 7 8 9 10 11 No. ID 12 13 1 a a 8 14 2 b 0 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ x x y y z
↑この場合の「b」の抜け=空白をチェックしたい というのが主旨です!
(さと) 2016/02/05(金) 10:42
・6行目に項目がある
・そこから6行「空白」があり、その下の13行目から実レコードが入る
です。
大変失礼しました!!
(さと) 2016/02/05(金) 10:47
表が....
最終列から3列左の意味が最終列を含めたものなのか不明なので、以下で調整してみてください。
Sub test() Dim LastR As Long, x ' 最終列から左3? 2?列目 少々曖昧... With Cells(6, Columns.Count).End(xlToLeft)(8, -1) '<- "-1" を調整して正確な列を指定。 MsgBox .Address, , "最終列から3列目の13行目" '<- 取得できているか確認 '最終列の最終行を取得 LastR = Columns(.Column).Find("*", , , , 1, 2).Row MsgBox LastR, , "最終列の最終行" '<-確認 x = Application.CountBlank(Range(.Cells, Cells(LastR, .Column))) If x > 0 Then MsgBox "空白あり" Else MsgBox "空白無し" End If End With End Sub (seiya) 2016/02/05(金) 11:19
ありがとうございます!
+わかりにくい事ですみませんでした。:最終列から2列左です。
頂いたコードそのままで うまくメッセージが出ました!!
何から何まで 本当にありがとうございました!!!
(さと) 2016/02/05(金) 11:26
ちなみに・・・
図々しいご相談ですが、
この空白セルに色を(例えば「赤:ColorIndex = 3」)など入れることも可能ですか?
→ご教示いただいたコードに少し手を加え、設定させてみたんですが
どうもうまくいかなくて・・・・
本当にすみません!!(最初から言え!ですよね><;)
(さと) 2016/02/05(金) 11:38
追記ですが(今、確認して発覚したので 後追いですみません!)
空白チェックするマトリクスのシートは、
「既存」で存在しないらしいです。
=後から(同じシート名になりますが)作成しているらしいです。
シートの存在有無と存在する場合は「MATRIX」シートの最終列・・・・・という流れで
ご教示いただけませんでしょうか。
よろしくお願いします!!!!
(さと) 2016/02/05(金) 11:46
これで検証してください。
Sub test() Dim LastR As Long, x, i As Long With Sheets("MATRIX") ' 最終列から左3? 2?列目 少々曖昧... With .Cells(6, Columns.Count).End(xlToLeft)(8, -1) '<- "-1" を調整して正確な列を指定。 'MsgBox .Address, , "最終列から3列目の13行目" '<- 取得できているか確認 '最終列の最終行を取得 LastR = .Parent.Columns(.Column).Find("*", , , , 1, 2).Row 'MsgBox LastR, , "最終列の最終行" '<-確認 With .Parent.Range(.Cells, .Parent.Cells(LastR, .Column)) .Interior.ColorIndex = xlNone x = Application.CountBlank(.Cells) If x > 0 Then For i = 1 To .Count If .Cells(i).Value = "" Then .Cells(i).Interior.Color = vbRed Next Else MsgBox "空白無し" End If End With End With End With End Sub (seiya) 2016/02/05(金) 12:02
ここまでご教示いただいたら、あとの微調整はやれそうです!
ありがとうございました!!
(さと) 2016/02/05(金) 12:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.