C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

【ExcelVBA】For〜Nextの入れ子について

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■97144 / inTopicNo.1)  【ExcelVBA】For〜Nextの入れ子について
  
□投稿者/ 工場プログラマー (67回)-(2021/04/06(Tue) 16:35:37)

分類:[Microsoft Office 全般] 

Win10

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    For j = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
…
    Next j
Next i

この処理がうまくいきません。
For j 〜 を通ると中の処理を行わずにNext iまで飛ばされます。
大きい数字を指定すればいいんですが少し見た目が気になるのでお願い致します。

引用返信 編集キー/
■97145 / inTopicNo.2)  Re[1]: 【ExcelVBA】For〜Nextの入れ子について
□投稿者/ 魔界の仮面弁士 (3042回)-(2021/04/06(Tue) 17:30:17)
No97144 (工場プログラマー さん) に返信
> この処理がうまくいきません。
行や列を表す変数は、i や j といった名前を使うよりも
x や y、あるいは col や row といった名前にした方が分かりやすくなりますよ。
本題とは直接関係ありませんけれども…。


> For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
これは、「A列(1列目)の最後の行」までのループとなります。

たとえ、B29 や Z80 にデータがあったとしても、A 列が空っぽなら
 For i = 1 To 1
の意味になってしまいますが、それは意図した動作でしょうか?


>  For j = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
これは、「1 行目の最後の列」までのループとなります。

たとえ、F91 や G3 にデータがあったとしても、1 行目にデータが無ければ、
 For j = 1 To 1
の意味になってしまいますが、それは意図した動作でしょうか?


> 大きい数字を指定すればいいんですが少し見た目が気になるのでお願い致します。
Dim minCol As Long, maxCol As Long
Dim minRow As Long, maxRow As Long
With ActiveSheet.UsedRange
 minCol = .Columns(1).Column
 maxCol = .Columns(.Columns.Count).Column
 minRow = .Rows(1).Row
 maxRow = .Rows(.Rows.Count).Row
End With
Dim c As Long, r As Long
For c = minCol To maxCol
 For r = minRow To maxRow
  'If Not IsEmpty(Cells(r, c).Value) Then
  ' Debug.Print Cells(r, c).Address(False, False); Tab(8); Cells(r, c).Value
  'End If
 Next
Next
引用返信 編集キー/
■97146 / inTopicNo.3)  Re[2]: 【ExcelVBA】For〜Nextの入れ子について
□投稿者/ 魔界の仮面弁士 (3043回)-(2021/04/06(Tue) 17:35:07)
2021/04/07(Wed) 10:02:06 編集(投稿者)

No97145 (魔界の仮面弁士) に追記
>> For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
> これは、「A列(1列目)の最後の行」までのループとなります。

もしも A列 のみを前提としたコードであったとしても、
上記のように End プロパティを用いる方法は、あまりお奨めしません。
「最終行にデータがあった場合」に対応できないためです。

たとえば、A 列すべてにデータが記述されていた場合、
「Cells(Rows.Count, 1).End(xlUp).Row」は 1 を返すことになります。


ただし End プロパティによる領域終端への参照操作時には、
非表示列・非表示行は存在しないものとして扱われます。

一方、UsedRange ではセルの可視状態は無視されますし、
「書式設定された空欄セルも含まれる」という違いがあります。



> For c = minCol To maxCol
>  For r = minRow To maxRow

別案。

Dim rCol As Excel.Range, rRow As Excel.Range
For Each rCol In ActiveSheet.UsedRange.Columns
 For Each rRow In ActiveSheet.UsedRange.Rows
  Debug.Print rRow.Row, rCol.Column
 Next
Next
引用返信 編集キー/
■97172 / inTopicNo.4)  Re[3]: 【ExcelVBA】For〜Nextの入れ子について
□投稿者/ 工場プログラマー (68回)-(2021/04/09(Fri) 15:03:28)
No97146 (魔界の仮面弁士 さん) に返信

自己解決いたしました。
解決済み
引用返信 編集キー/
■97173 / inTopicNo.5)  Re[4]: 【ExcelVBA】For〜Nextの入れ子について
□投稿者/ kiku (223回)-(2021/04/09(Fri) 17:03:27)
No97172 (工場プログラマー さん) に返信
> ■No97146 (魔界の仮面弁士 さん) に返信
>
> 自己解決いたしました。

どのように解決したかについて記述した方が良いと思います。
この掲示板に解決した内容を記述することで、
同じことに悩んでいる第3者が、解決に至ることもあるためです。

※私見ですが、そういうことをすることも感謝を示すひとつの方法であろうと思っています。
解決済み
引用返信 編集キー/
■97208 / inTopicNo.6)  Re[5]: 【ExcelVBA】For〜Nextの入れ子について
□投稿者/ 工場プログラマー (69回)-(2021/04/15(Thu) 09:13:12)
2021/04/15(Thu) 09:15:15 編集(投稿者)

No97173 (kiku さん) に返信

> どのように解決したかについて記述した方が良いと思います。
> この掲示板に解決した内容を記述することで、
> 同じことに悩んでいる第3者が、解決に至ることもあるためです。
>
> ※私見ですが、そういうことをすることも感謝を示すひとつの方法であろうと思っています。

解決法としましては、データがすべて埋まっている場所からFor〜Nextを始めて解決しました。
実際No97144で言ったような環境ではなく途中行からのForでしたので
For 8 To Cells(Rows.Count, 4).End(xlUp).Row
For 4 To Cells(8, Columns.Count).End(xlToLeft).Column

   Next
Next
こんな感じです。
No97144では説明不足だったかもしれないです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ