• ベストアンサー

無限ループに陥ってしまいました。(Excel)

シート上に文字列がランダムにばら撒かれています。 (ばら撒かれている範囲もケースバイケースを想定しています) 最終的に、文字列をA1から順番に並べたいと思いました。 手順としてA列の文字列が入力されているセル行を調べてその回数ループさせる。もし、セルの値が""ならばセルを削除し上に詰める。そのときA列の最終行数を-1する。最終行数までくるとその列は終わり。 次の列に移動し繰り返して完了。 と、もくろんだのですが、A列のみで無限ループに陥ってしまいました。どなたか?詳しい方いらっしゃいましたら教えてください。 Sub test() Set sh1 = Worksheets("sheet1") For j = 1 To 50 LastRow1 = sh1.Cells(65536, j).End(xlUp).Row For i = 1 To LastRow1 If sh1.Cells(i, j).Value = "" Then sh1.Cells(i, j).Delete (xlShiftUp) i = i - 1 LastRow1 = LastRow1 - 1 End If Next Next End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 あまりご質問をちゃんと読んでいないので、上手くいかないかもしれませんが、こんな風に作ってみました。たぶん、空のセルを削除して、最後の要件は、空いた列を左に寄せていくのですよね。 Sub DeleteBlankCells()  Dim i As Integer  With ActiveSheet   On Error Resume Next   For i = .Range("A1").SpecialCells(xlCellTypeLastCell).Column To 1 Step -1    .Columns(i).SpecialCells(xlCellTypeBlanks).Delete xlShiftUp    If WorksheetFunction.CountA(.Columns(i)) = 0 Then     .Columns(i).Delete    End If   Next i   On Error GoTo 0  End With End Sub

cbr4001964
質問者

お礼

丁寧は回答有難う御座います。 私が書いたマクロの10倍ぐらいの速度で、処理が完了してしまいました。画面の更新を止める必要がないほどに!! マクロには、独特の考え方と、深い知識が必要なことを痛感しました。 今後とも宜しくお願いいたします。

その他の回答 (3)

noname#91724
noname#91724
回答No.3

For Next文の中に If i = LastRow1 Then Exit For End If と入れてみたらどうでしょ?

cbr4001964
質問者

お礼

ご回答ありがとうございます。 結局、教えて頂いた内容を踏まえて次のようになりました。 何か?指摘頂ければと思います。 皆さんも宜しくお願いいたします。 Sub test() Application.ScreenUpdating = False Set sh1 = Worksheets("sheet1") Dim Column_address As String Column_address = sh1.UsedRange.Address right_botmm_address = Right(Column_address, Len(Column_address) - InStrRev(Column_address, ":")) Last_Column = sh1.Range(right_botmm_address).Column For j = 1 To Last_Column LastRow1 = sh1.Cells(65536, j).End(xlUp).Row For i = LastRow1 To 1 Step -1 If sh1.Cells(i, j).Value = "" Then sh1.Cells(i, j).Delete (xlShiftUp) End If Next Next StartRowA = 1 For j = 2 To Last_Column LastRow1 = sh1.Cells(65536, j).End(xlUp).Row sh1.Range(Cells(1, j), Cells(LastRow1, j)).Cut sh1.Range(Cells(StartRowA, 1), Cells(StartRowA, 1)).Select sh1.Paste StartRowA = StartRowA + LastRow1 Next Application.ScreenUpdating = True End Sub

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

No1です。 すみません、勘違いしてました。行を削除ではなくセルの削除でしたね。 大丈夫でした。 お騒がせしました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

無限ループは以下のように下の行から削除していけば大丈夫です。 ただ、このままでは、A列以外は、A列の同じ行が空白だと、最初に削除されてしまいますよ。考え直した方がいいと思います。 Sub test() Set sh1 = Worksheets("sheet1") For j = 1 To 50 LastRow1 = sh1.Cells(65536, j).End(xlUp).Row For i = LastRow1 To 1 Step -1 If sh1.Cells(i, j).Value = "" Then sh1.Cells(i, j).Delete (xlShiftUp) End If Next Next End Sub

cbr4001964
質問者

お礼

ありがとうございます。 下から、削除なんですね。助かりました。 次の課題は、セルの範囲幅の検出と、A列への集合です。 また悩みそうなので、今から心配です。 また、宜しくお願いいたします。

関連するQ&A

  • 2重ループ

    下記のマクロを実行させてもB20までのセル(19回繰り返し)にしか数値を書き込んでくれません。 どうして100回繰り返さないのでしょうか? Private Sub CommandButton1_Click() For j = 1 To 10 For i = 1 To 10 Cells(i + j, 2).Value = i + j Next i Next j End Sub

  • エクセル マクロで行の合計を数値で入力したい

    マクロ初心者です。 F列からAJ列までの合計をAK列に数値で入力しようとしています。 ただし、FからAJ列の各セルに全てデータは入っていません。 したがってFからAJ列のいずれかにデータが入っている最終行を 見つけて合計を算入しようとしているのですが下記の通りやっても うまくいきません。教えてください。 エクセルのバージョンは2002です。 Sub () 'データが入っている最終行まで合計額を数字で入力 LastRow = Cells(65536, COL).End(xlUp).Row For i = LastRow To 6 Step -1 Set myRange = Range(Cells(i, 6), Cells(i, 36)) Cells(i, 37).Value = WorksheetFunction.Sum(myRange) Next i End Sub

  • VBAのループ処理について

    VBA(Excel2000)にて、参考書等を見て下記のコードを作成しました。 「セルA1かA10において、同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」 Sub ループ() Dim a As Long With Range("a1:a10") For a = 1 To .Count - 1 If .Cells(a).value <> .Cells(a + 1).value Then .Cells(a, 2).value = .Cells(a).value End If Next .Cells(.Count, 2).value = .Cells(.Count).value End With End Sub 上記の「For idx = 1 To .Count - 1」の意味が分かりません。 よろしくお願いします。

  • VBA ループ文

    お手数ですが、回答お願いします。 VBAでループ文を勉強しております。 最初のfor 文で1000行、1000列に文字を入力、 次のdo 文でその文字を全部消したいのですが、うまくいきません。 またfor 文で1000行、1000列で文字を入力しているのですが、 時間がかかるのは仕方がないことなのでしょうか? お手数ですが、ご教授お願いします。 Sub 文字入力() Dim i As long Dim t As long For i = 1 To 1000 For t = 1 To 1000 Cells(i, t) = "wooo" Next t Next i End Sub ================================================================= Sub 文字入力消し() Dim i As long Dim t As long i = 1 Do t = 1 Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 Loop Until Cells(i, t) = "" End Sub

  • 標準モジュールマクロ動作について

    office2010 excelのマクロにて、標準モジュールにて一括の場合と、分割されている場合で動作結果が変わります。 その原因が分からないので教えて頂きたく。 A2セルからR6セルまで、文字列データが入っています。 D列、F列のみ、不特定行が空欄ありです。 D列を検索し、○があったら、行ごと削除します。 C列の最終セルから2行上、1列右のセルを参照し、空欄だったら、A空欄あり のメッセージ表示 E列の最終セルから2行上、1列右のセルを参照し、空欄だったら、B空欄あり のメッセージ表示 マクロ実行前のデータで D2セルが○、D3セルが○、 D4セルが空欄 F4セルが何かしらの文字列あり でマクロを実行させると、 D2セルは空欄、 D4セルが何かしらの文字列あり になります。 メッセージは、A空欄あり のみとなるはずなのですが、 (1)の場合、A空欄あり、B空欄あり と誤りになります。 (2)だとA空欄ありのみ表示されます。 何がおかしいのでしょうか? なお、(1)を2回マクロ実行させると、2回目は、A空欄ありのみ表示です (1)標準モジュール一括の場合 Sub SAKUJO() 'D列で○の非稼働日行を削除 Dim lastRow, r As Long Dim v As Variant 'C列最終行の取得 lastRow = Cells(Rows.Count, 3).End(xlUp).Row 'D列を検索し、非稼働日(○)は行で削除 For Each v In Array("○") For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか Rows(r).Delete '含む場合は行を削除 End If Next r Next v '非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示 If Cells(lastRow, 3).Offset(-2, 1) = "" Then MsgBox "A空欄あり" Else End If If Cells(lastRow, 5).Offset(-2, 1) = "" Then MsgBox "B空欄あり" Else End If End Sub (2)標準モジュール分割の場合 Sub SAKUJO() 'D列で○の非稼働日行を削除 Dim lastRow, r As Long Dim v As Variant 'C列最終行の取得 lastRow = Cells(Rows.Count, 3).End(xlUp).Row 'D列を検索し、非稼働日(○)は行で削除 For Each v In Array("○") For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか Rows(r).Delete '含む場合は行を削除 End If Next r Next v test End Sub Sub test() '非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示 Dim lastRow ' C列の最終行取得   lastRow = Cells(Rows.Count, 3).End(xlUp).Row If Cells(lastRow, 3).Offset(-2, 1) = "" Then MsgBox "A空欄あり" Else End If If Cells(lastRow, 5).Offset(-2, 1) = "" Then MsgBox "B空欄あり" Else End If End Sub

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

  • このマクロ、どこがおかしいですか?

    i5とj5のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i5とj5のセルに何も書かれていないときはそのまま一つ下の列へ行き、行った先のセルでも同じように処理(i6とj6のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i6とj6のセルに何も書かれていないときはそのまま一つ下の列へ行き)を繰り返し、と言うことをi33とj33のセルまで続けたいと思っています。 Sub よろしくお願いします() Dim i As Integer For i = 5 To 33 Cells(i, 9).Select If Cells(i, 9).Value = Cells(i, 10).Value Then Range(Cells(i, 9), Cells(i, 10)).Merge Selection.Offset(i + 1).Select ElseIf Cells(i, 9).Value = "" Then Selection.Offset(i + 1).Select Next i End If End Sub と書いたのですが、『Nextに対応するForがありません』と言われてしまいます。どうすれば思い通りにできるでしょうか? 極めて初心者で、伝わりにくい点があるかもしれません。よろしくお願いします。

  • excelマクロの重複セルの削除について

    excelマクロ超初心者です。 E列に下記のようにデータが入っていたとします。   E列 1 いちご 2 りんご 3 みかん 4 いちご 5 りんご 6 れもん これを重複セルを削除して   E列 1 いちご 2 りんご 3 みかん 4 れもん としたいのですが、どうすればいいでしょうか? 自分なりに調べて、下記のように記述したのですが、 Sub test() lastRow = wb.Sheets("Sheet1").Range("E" & Rows.Count).End(xlUp).Row 'E列最終行 For i = lastRow To 2 Step -1 If Cells(i, 5).Value = Cells(i - 1, 5).Value Then Cells(i, 5).EntireRow.Delete Shift:=xlUp End If Next i End Sub() E4列から下のデータしか重複セルが削除されません。 ここでいうlastRow To 2 Step -1はどういう意味なのでしょうか? すみませんが宜しくお願いします。

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • A列の最終行までハイパーリンクを付けたい

    A列の最終行までハイパーリンクを付けたいのですがコードがわかりません。 Sub test() Dim i As Long For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row 'ハイパーリンクにするコード Next i End Sub まではわかりました。 表示文字列もURLもセルに入ってる値にしたいです。 ご教授よろしくお願いします。

専門家に質問してみよう