- ベストアンサー
VBA最終列の取得/不規則な処理
- VBAにて、エクセルの最終列を取得する方法について教えてください。
- また、エクセルの特定の範囲に対して不規則な繰り返し処理を行う方法も教えてください。
- 具体的には、特定の色が塗りつぶされたセルのみに処理を行い、そのセルに入力されている文字列に応じて別のブックのセルに値をカウントしたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>> ①最終列の取得 画像からすると結合セルが対象のようですが、結合セルは範囲中の1番左上のセルとしてアドレスが返りますので、そのあたりが原因でしょう。 画像の例なら1行2列分が結合してあるようですから、プログラムは最終列ではなく一つ左の列を最終として捕まえてしまいます。 例外なく結合されているなら、『Cells(4, ws1.Columns.Count).End(xlToLeft).Column+1』で一列ズラせば解決すると思います。 また出来れば『処理されない』で終わらせず、ステップ処理などで変数の内容を確認するようにしましょう。 https://asatte.biz/vba-debug-menu/ >> 繰り返し処理を3列処理、step5、3列処理、step5…と繰り返し行う方法 これは、例えば『1.2.3列を処理、4〜8列処理なし、9.10.11列を処理、12〜16列処理なし』でいいですか? 色々方法もありますが、このような場合には別の変数を作ってカウントするのが分かりやすいです。 例えば変数iを作り、For〜next処理の中でi=i+1でカウントして、if i=3 then retu = retu +5、とすれば処理をスキップさせられます。
その他の回答 (4)
- n-jun
- ベストアンサー率33% (959/2873)
回答No.4 です。 そう言えば他のセルにどのようなデータがあるのか不明ですが、 >入力されている文字列が「1」か「2」か判断するというものです。 本当に文字列なのかは置いといて(Excelは数値に出来る場合は勝手に数値にしちゃう。もしかしてやっぱり数式があるのかな?)。 1か2のカウントってならCountIfにて個数を調べるのもありかもです。 他のセル部分にはない値ならセル全体を範囲とすれば最終データ云々も関係ないように思う。 3列分を個々でカウントしたいなら、それぞれを3倍すれば良いのでは?
- n-jun
- ベストアンサー率33% (959/2873)
回答No.3 です。 サンプルの画像が正確だとしたら、これって最終行のB列にデータがない時があったら、適切な最終行を取得する事は出来ないのでは? 空白に見えるセルに数式とか埋め込んでいるなら別かもですけど、本当にまっさらなら『別の列の値』が最終行となり得るかなと。 B列の最後の値が『絶対的な最終データである』と言う定義づけされているなら良いのですが、途中の空白が気になりますね。 この場合始点はB4であったとしても終点については、『不特定セルアドレス』をチェックする必要があるのでは?と思います。 なのでFor~NextやFor Each~Nextでは厳しいのかなと初級レベルは感じます。 確かにUsedRangeを使えば或いは?とは思いますが、余り使う方は少ないのかなと。 ちょっとした疑問ですので『問題なし!』ならスル~してください。 >また、行列共に可変します。 どのように変わるのかですが、3列の結合セル+5列の単独セルであれば個人的ならOffsetプロパティ https://www.limecode.jp/entry/trap/mergecell-offset を用います。
- n-jun
- ベストアンサー率33% (959/2873)
If ws1.Cells(gyou, retu).Value = 1 Then ws2.Range("A1") = ws2.Range("A1") + 1 If ws1.Cells(gyou, retu).Value = 2 Then ws2.Range("B1") = ws2.Range("B1") + 1 判定式で数値と数字を間違えているのと、 1であった時に2である判定を行う書き方が変なのと、 1でなかった時に中断するのがおかしいように思います。 初級レベルなので勘違いかもですけど。
- imogasi
- ベストアンサー率27% (4737/17069)
小生は本質問のポイントを捉えられてない。 この程度の画像だけで、セルのデータも質問(画像でも)に掲げられていなくて、何をしようとしているのか、質問文から推測もできず、答えられないが、下記をやって見ると、 ● 第2行目のD,E列が結合されている場合 テストでは、下記のようになる。 これの類推から、対策を考えざるを得ないように思うが、どういう処理か判らないので、何も言いようがない。 Sub test01() c = Worksheets("Sheet1").Range("z2").End(xlToLeft).Column MsgBox c 'D列の4が返る。5ではない。 For i = 1 To c If Cells(2, i).MergeCells Then MsgBox 2 & "行," & i & "列 = は結合されています" End If MsgBox Cells(2, i) Next i MsgBox Cells(2, 5) End Sub Sub test02() 'Cells(2, 5) はエラーではない If Cells(2, 5).MergeCells Then MsgBox 2 & "行," & 5 & "列 = は結合されています" '結合はTRUE End If MsgBox Cells(2, 5) '空白 End Sub もっと質問者自身が、色々試行してみて、論点を整理し、その点の対策に絞って質問すべきだと思う。 === ●繰り返し処理? >3列処理、step5、3列処理、step5…と繰り返し行う方法 の意味も、よく判らない。step5はSkip5(次に続く5列は処理を飛ばす)の意味か? 3列処理は各列で独立の処理か?3列の合計のように3列グループでの処理か? 推測では、 イレギュラーなルールは、各々を表(実際のは表ではなく配列)にするーー>配列にすることを考えて、処理は同じパターンになるように考えるのが良いと思う。
お礼
共に解消いたしました! 勉強になりました。ありがとうございます!