[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『行にカウントアップをリベンジしたいです。』(どどど)
Sub カウントアップ()
i = 40 '40行目から開始
'BA列もしくはBB列もしくは・・CW列が空白ではない場合に Do While Cells(i, "") <> "" Or Cells(i, "BA") <> "" Or Cells(i, "BB") <> "" Or Cells(i, "BC") <> "" Or Cells(i, "BD") <> "" Or Cells(i, "BE") <> "" Or Cells(i, "BF") <> "" Or Cells(i, "BG") <> "" Or Cells(i, "BH") <> "" Or Cells(i, "BI") <> "" Or Cells(i, "BJ") <> "" Or Cells(i, "BK") <> "" Or Cells(i, "BL") <> "" Or Cells(i, "BM") <> "" Or Cells(i, "BN") <> "" Or Cells(i, "BO") <> "" Or Cells(i, "BP") <> "" Or Cells(i, "BQ") <> "" Or Cells(i, "BR") <> "" Or Cells(i, "BS") <> "" Or Cells(i, "BT") <> "" Or Cells(i, "BU") <> "" Or Cells(i, "BV") <> "" Or Cells(i, "BW") <> "" Or Cells(i, "BX") <> "" Or Cells(i, "BY") <> "" Or Cells(i, "BZ") <> "" _ Or Cells(i, "CA") <> "" Or Cells(i, "CB") <> "" Or Cells(i, "CC") <> "" Or Cells(i, "CD") <> "" Or Cells(i, "CE") <> "" Or Cells(i, "CF") <> "" Or Cells(i, "CG") <> "" Or Cells(i, "CH") <> "" Or Cells(i, "CI") <> "" Or Cells(i, "CJ") <> "" Or Cells(i, "CK") <> "" Or Cells(i, "CL") <> "" Or Cells(i, "CM") <> "" Or Cells(i, "CN") <> "" Or Cells(i, "CO") <> "" Or Cells(i, "CP") <> "" Or Cells(i, "CQ") <> "" Or Cells(i, "CR") <> "" Or Cells(i, "CS") <> "" Or Cells(i, "CT") <> "" Or Cells(i, "CU") <> "" Or Cells(i, "CV") <> "" Or Cells(i, "CW") <> "" Or Cells(i, "CX") <> "" Or Cells(i, "CY") <> "" Or Cells(i, "CZ") <> "" _
Cells(i, "B") = i - 39 'B40=40-39で1が入る i = i + 1 'カウントアップ Loop
End Sub
BA列からCC列までの40行目から最大の行を取得してB列にカウントさせています。
希望としてはこれをまず短くしたいです。
それと条件を追加したいです。
B列40行目を下から上に空白行を取得してそこからBA列〜CC列の最大行まで1,2,3とカウントアップ
させていく。
例えばB列40行目から55行目まで空白でなかった場合
56行目から1,2,3とカウントアップしていき
BA列からCC列までの最大の行まで取得させたいです。
よろしくお願いします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
>BA列からCC列までの40行目から最大の行を取得してB列にカウントさせています。 そもそもエラーになるんですが・・・ (フォーキー) 2023/03/10(金) 19:36:33
コードではBA-CZだったのでそれで・・・ どれか一つでも文字か数字が入っていれば、+1ってことでいいんですよね? Sub カウントアップ() Dim i As Long Dim cnt As Long 'B列の最終行+1を取り出す i = Cells(Rows.Count, "B").End(xlUp).Offset(1).Row 'B列の最終行が40以下なら処理を中断 If i <= 40 Then MsgBox "B列の最大値が40行より小さいです。処理を中断します" Exit Sub End If 'BA列もしくはBB列もしくは・・CW列が空白ではない場合に Do 'BA:CZのi行目をCOUNTIFで空白以外を数える cnt = WorksheetFunction.CountIf(Application.Index(Range("BA:CZ"), i, 0), "<>") 'すべてつなげたとき、空白でなければ、カウントアップ If cnt > 0 Then Cells(i, "B") = i - 39 i = i + 1 Else '空白なら処理を終了 MsgBox i - 1 & "行まで処理しました" Exit Do End If Loop End Sub (稲葉) 2023/03/10(金) 19:55:57
Sub カウントアップ()
Dim i As Long
i = 40
Do While WorksheetFunction.CountA(Range("BA" & i & ":CZ" & i)) > 0 Cells(i, "B") = i - 39 i = i + 1 Loop
End Sub
これでBA〜CZのどこか一つでも文字が入っていればその最大をB40に1からカウントさせています。
これに加えたい条件は
●1からカウントさせるのは40行目ではなく、B列を下から取得した空白行からにする
(Bが56行目まで埋まっていたとしたら57行目から1のカウントを開始する。
●下から取得してB40が空白だったら今まで通り、B40を1でカウントを開始する。
●BA〜AZの最大行よりB列の行の方が埋まっていた場合は何もしない
を希望しています。
今も調べていますが、かみ合わなくて申し訳ございません。
(どどど) 2023/03/10(金) 20:29:37
■1
>BA列からCC列までの40行目から最大の行を取得してB列にカウントさせています。
↑の意味が理解できませんが
>希望としてはこれをまず短くしたいです。
↑について、提示のコードがすごく見ずらいので適当に改行してみました。
Sub カウントアップ() i = 40 '40行目から開始 'BA列もしくはBB列もしくは・・CW列が空白ではない場合に Do While Cells(i, "??") <> "" Or _ Cells(i, "BA") <> "" Or Cells(i, "BB") <> "" Or Cells(i, "BC") <> "" Or Cells(i, "BD") <> "" Or Cells(i, "BE") <> "" Or _ Cells(i, "BF") <> "" Or Cells(i, "BG") <> "" Or Cells(i, "BH") <> "" Or Cells(i, "BI") <> "" Or Cells(i, "BJ") <> "" Or _ Cells(i, "BK") <> "" Or Cells(i, "BL") <> "" Or Cells(i, "BM") <> "" Or Cells(i, "BN") <> "" Or Cells(i, "BO") <> "" Or _ Cells(i, "BP") <> "" Or Cells(i, "BQ") <> "" Or Cells(i, "BR") <> "" Or Cells(i, "BS") <> "" Or Cells(i, "BT") <> "" Or _ Cells(i, "BU") <> "" Or Cells(i, "BV") <> "" Or Cells(i, "BW") <> "" Or Cells(i, "BX") <> "" Or Cells(i, "BY") <> "" Or _ Cells(i, "BZ") <> "" Or Cells(i, "CA") <> "" Or Cells(i, "CB") <> "" Or Cells(i, "CC") <> "" Or Cells(i, "CD") <> "" Or _ Cells(i, "CE") <> "" Or Cells(i, "CF") <> "" Or Cells(i, "CG") <> "" Or Cells(i, "CH") <> "" Or Cells(i, "CI") <> "" Or _ Cells(i, "CJ") <> "" Or Cells(i, "CK") <> "" Or Cells(i, "CL") <> "" Or Cells(i, "CM") <> "" Or Cells(i, "CN") <> "" Or _ Cells(i, "CO") <> "" Or Cells(i, "CP") <> "" Or Cells(i, "CQ") <> "" Or Cells(i, "CR") <> "" Or Cells(i, "CS") <> "" Or _ Cells(i, "CT") <> "" Or Cells(i, "CU") <> "" Or Cells(i, "CV") <> "" Or Cells(i, "CW") <> "" Or Cells(i, "CX") <> "" Or _ Cells(i, "CY") <> "" Or Cells(i, "CZ") <> ""
Cells(i, "B") = i - 39 'B40=40-39で1が入る i = i + 1 'カウントアップ Loop End Sub
※1 最初の「Cells(i, "")」はミスタイプだと思うのでダミーにしています。 ※2 「Cells(i, "CZ") <> ""」の後ろの改行もミスだと思うので外しました。
そして、ミスタイプと思われる最初を除けばやっていることは、i行のBA〜CZまで連続するセル範囲の【どこか一つでも】空白じゃなければ、繰り返し処理しなさいって命令になっているわけですよね。
それならば、以下のように1セルずつ書かなくても
Do While Cells(i, "BA") <> "" Or Cells(i, "BB") <> "" Or Cells(i, "BC") <> "" Or Cells(i, "BD") <> "" Or Cells(i, "BE") <> "" Or _ Cells(i, "BF") <> "" Or Cells(i, "BG") <> "" Or Cells(i, "BH") <> "" Or Cells(i, "BI") <> "" Or Cells(i, "BJ") <> "" Or _ Cells(i, "BK") <> "" Or Cells(i, "BL") <> "" Or Cells(i, "BM") <> "" Or Cells(i, "BN") <> "" Or Cells(i, "BO") <> "" Or _ Cells(i, "BP") <> "" Or Cells(i, "BQ") <> "" Or Cells(i, "BR") <> "" Or Cells(i, "BS") <> "" Or Cells(i, "BT") <> "" Or _ Cells(i, "BU") <> "" Or Cells(i, "BV") <> "" Or Cells(i, "BW") <> "" Or Cells(i, "BX") <> "" Or Cells(i, "BY") <> "" Or _ Cells(i, "BZ") <> "" Or Cells(i, "CA") <> "" Or Cells(i, "CB") <> "" Or Cells(i, "CC") <> "" Or Cells(i, "CD") <> "" Or _ Cells(i, "CE") <> "" Or Cells(i, "CF") <> "" Or Cells(i, "CG") <> "" Or Cells(i, "CH") <> "" Or Cells(i, "CI") <> "" Or _ Cells(i, "CJ") <> "" Or Cells(i, "CK") <> "" Or Cells(i, "CL") <> "" Or Cells(i, "CM") <> "" Or Cells(i, "CN") <> "" Or _ Cells(i, "CO") <> "" Or Cells(i, "CP") <> "" Or Cells(i, "CQ") <> "" Or Cells(i, "CR") <> "" Or Cells(i, "CS") <> "" Or _ Cells(i, "CT") <> "" Or Cells(i, "CU") <> "" Or Cells(i, "CV") <> "" Or Cells(i, "CW") <> "" Or Cells(i, "CX") <> "" Or _ Cells(i, "CY") <> "" Or Cells(i, "CZ") <> ""
↓
Do While Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Range(Cells(i, "BA"), Cells(i, "CZ")).Value)), "") <> ""
とか
Do While Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Cells(i, "BA").Resize(, 52).Value)), "") <> ""
のようにすればよかったりしませんか?
■2
>BA列からCC列までの最大の行まで取得させたいです。
そういった話ならば、Do〜Loopより、BA列からCC列までの最終行のうち一番大きいものを求め、40行目から求めた最終行までをFor〜Nextでループするというアプローチも有効だと思います。
(自分でカウントアップさせる必要がありませんし、場合によっては一切処理をしない(すべての列の最終行が40未満)といったケースにも対応できます)
(もこな2) 2023/03/10(金) 20:32:19
こんな感じでしょうか。 ※最初はBA〜CCだったのに、次の投稿ではBA〜CZとBA〜AZになってますが、どれが正しいんでしょうか。 ※下のコードはCCを最終列としているので、もし変える場合は >Set rng = Range("BA40").CurrentRegion.Resize(, 29) の29の部分を変更してください。 (29はBA列からCC列までの列数) ※BA〜CZとBA〜AZが正しい場合、下のコードでは対応できません。
Sub test() Dim rng As Range, LastR As Long LastR = Cells(Rows.Count, "B").End(xlUp).Offset(1).Row Set rng = Range("BA40").CurrentRegion.Resize(, 29) If WorksheetFunction.CountA(rng) = 0 Then Exit Sub
'取得セル範囲の最上行が40行より小さければ、40行目を起点に範囲を修正 If rng.Row < 40 Then With rng.Offset(40 - rng.Row, 0) Set rng = .Resize(.Rows.Count - (40 - rng.Row)) End With End If
'取得セル範囲の最右列がBA列(53)より小さければ、BA列目を起点に範囲を修正 If rng.Column < 53 Then Set rng = rng.Offset(0, 53 - rng.Column)
If rng.Rows.Count < LastR - 40 Then Exit Sub If LastR <= 40 Then Range("B40") = 1 Else Cells(LastR, "B") = 1 End If With Cells(LastR + 1, "B").Resize(rng.Rows.Count - 1) .Formula = "=B" & LastR & "+1" .Value = .Value End With End Sub (フォーキー) 2023/03/10(金) 21:21:46
フォーキーさんのモジュールを貼り付けさせてもらいましたが
一番希望に近い状態になります。
が、、後付けというか想定していませんでした。
B列のカウントアップは範囲列の最大行より超えない。最大行に達したらストップさせたいです。
指定した範囲列の中で最大行が例えばBP700までだったとする
そしてBは元々500まで埋まっていたとすると501行目から1,2,3とカウントアップを始めるが
B700まで行ったらカウントは止まる
あくまでカウントは指定した範囲列の最大行を超えなくしたいです。
(どどど) 2023/03/10(金) 22:03:57
※希望通りの結果にする、というコードなので、可読性とメンテナンス性は悪いです。
Sub test() Dim rng As Range, LastR As Long LastR = Cells(Rows.Count, "B").End(xlUp).Offset(1).Row Set rng = Range("BA40").CurrentRegion.Resize(, 29) If WorksheetFunction.CountA(rng) = 0 Then Exit Sub
'範囲の行数が40行より小さければ、40行目を起点に範囲を修正 If rng.Row < 40 Then With rng.Offset(40 - rng.Row, 0) Set rng = .Resize(.Rows.Count - (40 - rng.Row)) End With End If
'範囲の列数がBA列(53)より小さければ、BA列目を起点に範囲を修正 If rng.Column < 53 Then Set rng = rng.Offset(0, 53 - rng.Column)
If rng.Rows.Count <= LastR - 40 Then Exit Sub If LastR <= 40 Then Range("B40") = 1 LastR = 39 Else Cells(LastR, "B") = 1 End If With Cells(LastR + 1, "B").Resize(rng.Rows.Count - (LastR - 39)) .Formula = "=B" & LastR & "+1" .Value = .Value End With End Sub (フォーキー) 2023/03/10(金) 22:23:35
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.