• ベストアンサー

空白セルがある行の左寄せ操作の件

下記のようにI列に空白セルを検出し、その空白セルがある行においてI列からM列までのデータを左寄せする処理行っております。 For 番号 = 1 To Range("B1").End(xlDown).Row  If Cells(番号, 9).Value = "" Then    コピー開始列 = Cells(番号, 9).End(xlToRight).Column    Range(Cells(番号, コピー開始列), Cells(番号,13)).Select    Selection.Cut Destination:=Range(Cells(番号, 9),Cells(番号, 9 + 14 - コピー開始列))    Range(Cells(番号, コピー開始列), Cells(番号,13)).Select  End If Next 番号 対象行数が3000行ほどあり処理時間がかかりすぎるため、もう少し効率よいやり方があれば教えてください。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.7

No.6です。 MaxReadRow = Me.Cells(Me.Rows.Count, 2).End(xlUp).Row の部分ですが、最悪 MaxReadRow = Me.Cells(65536, 2).End(xlUp).Row でも動きます。 ただ、「Meの使い方が違う」といわれるところが気になります。標準モジュール内にプログラムを書き込んでいるのでしょうか? もし標準モジュール内に記述しているのであればMeキーワードは使用できません。 MeをSheet1等のシートのコードネームに変更するか、 下のプログラムのように変更を加えるかしてください。 ----------------------ここから----------------------- Dim varRangeData() As Variant Dim NowReadRow As Long, MaxReadRow As Long Dim NowReadColumn As Integer, StartColumnNum As Integer Const StartRow As Long = 1 Const ColumnOffset As Integer = 9 Const ColumnNumCount As Integer = 5 With ThisWorkbook.Sheets("Sheet1") '↑の"Sheet1"部分を該当シート名に変更してください。 'With Sheet1 とシートのコードネームでも可能です MaxReadRow = .Cells(.Rows.Count, 2).End(xlUp).Row 'I~M列のセルデータを全てメモリーへコピーする varRangeData = .Range(.Cells(StartRow, ColumnOffset), .Cells(MaxReadRow, ColumnOffset + ColumnNumCount - 1)).Value '↑セルのValueプロパティーだけのvarRangedata(1~行数,1~5)ができる 'I=>1 J=>2 K=>3 L=>4 M=>5 と読み替えてください For NowReadRow = StartRow To MaxReadRow If varRangeData(NowReadRow, 1) = "" Then StartColumnNum = 0 'I列は空白と分かっているのでJ列からスキャン For NowReadColumn = 2 To ColumnNumCount If varRangeData(NowReadRow, NowReadColumn) <> "" Then StartColumnNum = NowReadColumn Exit For End If Next If StartColumnNum <> 0 Then '全てが空白の場合はStartColumnNumは0になりここには来ない For NowReadColumn = 1 To ColumnNumCount If NowReadColumn + StartColumnNum - 1 > ColumnNumCount Then '元のデータがMより後の場所になる場合 varRangeData(NowReadRow, NowReadColumn) = "" Else '元のデータがM以前になる場合 varRangeData(NowReadRow, NowReadColumn) = varRangeData(NowReadRow, NowReadColumn + StartColumnNum - 1) End If Next End If End If Next '書き込む時には余分な処理が発生しないようにイベント・再計算・画面更新を停止する 'ただ、この例だと停止しなくても十分高速かもしれません Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual .Range(.Cells(StartRow, ColumnOffset), .Cells(MaxReadRow, ColumnOffset + ColumnNumCount - 1)).Value = varRangeData '停止していた処理を再開するように設定する Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True End With ----------------------ここまで-----------------------

pin3891227
質問者

お礼

Randomizeさん  驚きました。  1/90の時間に短縮できました。  感謝感謝です。

その他の回答 (10)

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

こんにちは。 違反事項かもしれませんが、#2の Sub test01() のコードで間違いがないと思います。>merlionX さん わざわざ、そのスタイルを変える必要性はないと思いますね。 merlionXXさんの前回のコードを応用させていただいて、B列で判定するのもやめて、以下のようにしてみました。 データの範囲が全て左に移動しますから、もし、違うなら、この方法はだめだと思います。 Calculation のオンオフは、必要に応じて入れればよいです。 私のコードは、「標準モジュール」に置きます。 '--------------------------------------------------- Sub TestMacro1()   Dim i As Long   Dim j As Long   Dim rng As Range   Application.ScreenUpdating = False   With Range("I1").CurrentRegion     i = .Cells(.Cells.Count).Row     j = .Cells(.Cells.Count).Column - .Cells(1).Column + 1     Range("I1").Resize(i, j).SpecialCells(xlCellTypeBlanks).Delete (xlShiftToLeft)   End With   Application.ScreenUpdating = True   Set rng = Nothing End Sub '-------------------------------------------------- '右側にデータがある場合 'j = .Cells(.Cells.Count).Column - .Cells(1).Column + 1 の部分を調整します。 Sub TestMacro2()   Dim rng As Range   Dim i As Long   Dim j As Long   Application.ScreenUpdating = False   With Range("I1").CurrentRegion     i = .Cells(.Cells.Count).Row     j = .Cells(.Cells.Count).Column - .Cells(1).Column + 1     Set rng = Range("I1").Resize(i, j)   End With   With Worksheets.Add     rng.Copy .Range("A1")     .Range("A1").Resize(i, j).SpecialCells(xlCellTypeBlanks).Delete (xlShiftToLeft)     .Range("A1").Resize(i, j).Copy rng     Application.DisplayAlerts = False     .Delete     Application.DisplayAlerts = True   End With   Application.ScreenUpdating = True   Set rng = Nothing End Sub '-------------------------------------------------- この処理範囲は、あくまでも、I列からなんらかのデータが続いていることが条件です。間が開いていれば、その先は、処理されません。その場合は、i は、変える必要があります。   i = Range("B65536").End(xlUp).Row なお、別件ですが、ExcelのVBAは、もともと、ローカルモジュールがたくさんあるので、ローカルモジュールではなく、標準モジュールに書くのが基本です。しかし、コントロールツールのコマンドボタンなどに設定する場合は、Me キーワードが生きるのですが、シートをまたがないなら、シートを示すオブジェクトは通常は不要です。

pin3891227
質問者

お礼

merlionX さんが3回目に提示いただいた方法が望みの動きです。 I列~L列の範囲内で移動する方法をご提示いただきました。 ありがとうございました。

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

No2-5-8 merlionXXです。 テストしてみたらぜんぜんダメでした。 訂正します。 Sub TEST04() Dim n As Long, i As Long Dim c As Range Dim myRw() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual n = 0 For Each c In Range("I1:I" & Range("B1").End(xlDown).Row).SpecialCells(xlCellTypeBlanks) ReDim Preserve myRw(n) myRw(n) = c.Row n = n + 1 Next c For i = 0 To UBound(myRw) Set myC = Cells(myRw(i), "I") Range(Cells(myRw(i), myC.End(xlToRight).Column), Cells(myRw(i), "M")).Cut Cells(myRw(i), "I") Next i Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

pin3891227
質問者

お礼

merlionXXさん  訂正ありがとうございます。  何行か処理できない行がありましたが、数回繰り返すと今までの  時間よりも短くできたので訂正前のでも使おうと思っていました。  訂正いただいたので完全に動作することを確認いたしました。  重ね重ねありがとうございました。  感謝感謝です!  

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.9

こういった類の質問の場合は、データの取りうる状態などが非常に重要になります。 小出しにしなで全てを提示しましょう。 そうでないと、回答者があたふたしてしまいますよ。(^^;;;   で、以下のような場合はないのですか。  ■:データあり、  △:ブランク   ___I___J__K___L__M__N__ 1__■__■__■__△__■__■__ 2__△__■__△__■__△__■__ 3__△__△__■__△__■__■__ 4__△__△__△__■__■__■__ 5__△__△__△__■__△__■__   なければ無視願います。  

pin3891227
質問者

お礼

onlyromさん  ご指摘の状態はありません。  今後もう少し全体像が分かるような質問になるようにいたします。    

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

No2-5 merlionXXです。 > M列以降にデータがある場合があります。 M列までは左に詰めていいんですね? ならば Sub TEST03() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual x = Range("B1").End(xlDown).Row Set myRng = Range("I1:I" & x).SpecialCells(xlCellTypeBlanks) For Each C In myRng コピー開始列 = C.End(xlToRight).Column Range(Cells(C.Row, コピー開始列), Cells(C.Row, "M")).Cut Cells(C.Row, "I") Next C Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub M列は左に移動させたくないのなら Range(Cells(C.Row, コピー開始列), Cells(C.Row, "M")).Cut を Range(Cells(C.Row, コピー開始列), Cells(C.Row, "L")).Cut に変えてください。

pin3891227
質問者

お礼

merlionXXさん  できました。  速度も1/4になりました。  今回不愉快な思いさせてしまい申し訳ありませんでした。  気をつけます。  ありがとうございました。

  • Randomize
  • ベストアンサー率70% (38/54)
回答No.6

セルの入力されている値しか扱えませんが(色つけ・数式・書式などは一切コピー不可)相当高速に動くマクロです。 ----------------------ここから----------------------- Dim varRangeData() As Variant Dim NowReadRow As Long, MaxReadRow As Long Dim NowReadColumn As Integer, StartColumnNum As Integer Const StartRow As Long = 1 Const ColumnOffset As Integer = 9 Const ColumnNumCount As Integer = 5 MaxReadRow = Me.Cells(Me.Rows.Count, 2).End(xlUp).Row 'I~M列のセルデータを全てメモリーへコピーする varRangeData = Me.Range(Me.Cells(StartRow, ColumnOffset), Me.Cells(MaxReadRow, ColumnOffset + ColumnNumCount - 1)).Value '↑セルのValueプロパティーだけのvarRangedata(1~行数,1~5)ができる 'I=>1 J=>2 K=>3 L=>4 M=>5 と読み替えてください For NowReadRow = StartRow To MaxReadRow If varRangeData(NowReadRow, 1) = "" Then StartColumnNum = 0 'I列は空白と分かっているのでJ列からスキャン For NowReadColumn = 2 To ColumnNumCount If varRangeData(NowReadRow, NowReadColumn) <> "" Then StartColumnNum = NowReadColumn Exit For End If Next If StartColumnNum <> 0 Then '全てが空白の場合はStartColumnNumは0になりここには来ない For NowReadColumn = 1 To ColumnNumCount If NowReadColumn + StartColumnNum - 1 > ColumnNumCount Then '元のデータがMより後の場所になる場合 varRangeData(NowReadRow, NowReadColumn) = "" Else '元のデータがM以前になる場合 varRangeData(NowReadRow, NowReadColumn) = varRangeData(NowReadRow, NowReadColumn + StartColumnNum - 1) End If Next End If End If Next '書き込む時には余分な処理が発生しないようにイベント・再計算・画面更新を停止する 'ただ、この例だと停止しなくても十分高速かもしれません Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Me.Range(Me.Cells(StartRow, ColumnOffset), Me.Cells(MaxReadRow, ColumnOffset + ColumnNumCount - 1)).Value = varRangeData '停止していた処理を再開するように設定する Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True ----------------------ここまで----------------------- このマクロは、セルのデータの入力されている値のみをすべてメモリーへコピーしてメモリー内のみで処理をしています。Excelのセルを直接操作すると、操作するたびに値が不正でないかなどのチェック動作が入るので処理が重たくなります。そのため、メモリー内のみで処理を行うと非常に高速になります。詳しくは参考URLを見てみてください。 マクロのプログラムを拝見させていただきましてぱっと思った高速化のためのポイントを以下に記します。 1. Selectionを使うのはやめましょう 2. 反復処理数の多い場面のFor Nextで指定するToの値は極力変数に格納しましょう。式で記述すると、ループするたびに余分な計算が入ります。 3. セルに書き込みを行う場合は、再描画・再計算をとめましょう(Changeイベントにマクロを記述している場合はイベントもとめましょう) これも、参考URLのシリーズに載っていることですので、合わせて一読してみてください。 補足: このソースは簡易的なテストしか行っておりません。バグが合った場合は申し訳ありません。

参考URL:
http://officetanaka.net/excel/vba/speed/s11.htm
pin3891227
質問者

お礼

Randomizeさん  ご回答ありがとうございます。  MaxReadRow = Me.Cells(Me.Rows.Count, 2).End(xlUp).Row   の行のMe.RowsのところのMeでコンパイルエラーとなります。  「Meキーワードの使用方法が不正です」とコメントがあります。  相当高速に動くということでぜひ動かさせていただきたいのですが。  

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

No2です。 > 説明が足りなく”セル内の左寄せ”と誤解を招きました。 あなたの掲示したコードをみれば「セル内の左寄せ」ではないことぐらいわかりますよ。 だからそのように回答してありますが試してみたのですか?

pin3891227
質問者

お礼

merlionXXさん  たいへん申し訳ありませんでした。 確認せずに回答してしまいました。本当にすみません。 処理速度は劇的に変わりました。  M列以降にデータがある場合があります。I列からL列の間だけで左に寄せるためには先ほどご提示いただいたコードの中に範囲指定を追加すればできるのでしょうか。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#1です。 そうでしたか。 ほかに思うことは、セル(範囲)の削除(これは時間がかかる元凶と思う。他に挿入などシートセル・行・列の構成を変えられるとエクセルは処理がしんどい)じゃなくて、 別シート(完成データシート用)に対応各行に値代入をして、実現してはどうですか。書式などを無視してしまうが困るかな。 Sheet1の最終行まで繰り返し。 作業はEnd(xkToRight)で始まりのれるを見つける。 そこから決まった列(または、End(xkToLeft)で見つけた列までの列をSheet2の同行のA列から各セルに代入していく。 コピー貼り付け方式も有るが(コピーという仕組みの処理のに時間がかからないか心配なので)、私はまず、代入法(Sheet2!Cells(i,K))=Sheet1!.cells(i,j)をやってみてほしい。普通は、メモリ間のデータ移動の時間でやれないかと思う) ==== もうひとつ、コードの最初(ループ外)のほうに ScreeenUpdating=Falseを入れるのを忘れないことだ。

noname#99913
noname#99913
回答No.3

コードの最初と最後に、次の行を入れてみてください。 最初 Application.Calculation = xlManual 最後 Application.Calculation = xlAutomatic

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

もし、I列に空白がある行以外の行には途中の空白がないのであれば Sub test01() Dim x As Long x = Range("B1").End(xlDown).Row Application.ScreenUpdating = False Application.Calculation = xlCalculationManual On Error GoTo line Range("I1:M" & x).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft On Error GoTo 0 line: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 列に空白がある行以外の行にも途中の空白があり、これを左詰してはいけないのであれば Sub test02() Dim x As Long x = Range("B1").End(xlDown).Row Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Do On Error GoTo line Range("I1:I" & x).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft On Error GoTo 0 Loop line: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

pin3891227
質問者

お礼

説明が足りなく”セル内の左寄せ”と誤解を招きました。 たいへん申し訳ありません。 処理したいことを表にすると下記になります。       I     J     K     L 1   データ1  データ2 データ3 データ4 2          データ4 データ5 データ6 3                データ7 データ8 4                      データ9          ↓      I    J     K    L 1   データ1 データ2 データ3 データ4<--何もしない 2   データ4 データ5 データ6     <--1セル分左へ 3   データ7 データ8          <--2セル分左へ 4   データ9               <--3セル分左へ 可能であれば再度ご検討をお願いできますでしょうか。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

早くなるかどうか、普通の我々には計算・算出理論も知らず、わからないものだ。 他の方式によるコードをやってみるよりほか無い。 エクセルで3000行ぐらいで時間がかかるというのは、普通ではないように思うが。 コード上ですっきりした処理方式・書き方は (編集ージャンプーセル選択ー空白セルを使って) Sub Test01() d = 3000 'd= Range("I65536").End(xlUp).Row Range("I2:I" & d).SpecialCells(xlCellTypeBlanks).Select For Each cl In Selection Range(cl.Offset(0, 0), cl.Offset(0, 5)).HorizontalAlignment = xlLeft Next End Sub dは最下行で一般には d= Range("I65536").End(xlUp).Row これでやってみて早くなるかどうかな。やってみて。 空白セルが少ないのなら検索Find、FindNextで探してやるコードに刷るとか。 WEBに(Googleで)「VBA Find」で照会すればたくさん出るので略。

pin3891227
質問者

お礼

説明が足りなく”セル内の左寄せ”と誤解を招きました。 たいへん申し訳ありません。 処理したいことを表にすると下記になります。       I     J     K     L 1   データ1  データ2 データ3 データ4 2          データ4 データ5 データ6 3                データ7 データ8 4                      データ9          ↓      I    J     K    L 1   データ1 データ2 データ3 データ4<--何もしない 2   データ4 データ5 データ6     <--1セル分左へ 3   データ7 データ8          <--2セル分左へ 4   データ9               <--3セル分左へ 可能であれば再度ご検討をお願いできますでしょうか。

関連するQ&A

  • E列が空白のとき、その空白行を削除し、番号を振り直す

    windows7 Excel2003でマクロ勉強中です。 あるサイトにE列が空白のとき、その空白行を削除し、番号を振り直すという コードがありました。 自分で作った表(表の最上段の2行は項目名が入っています。)で  実行すると「Rangeメソッドは失敗しました。Globalオブジェクト」と エラーが出ます。エラーはでますが、処理自体は正しく実行されます。 このエラーの原因と回避するにはどうしたらよろしいでしょうか。 Sub E列が空白のとき、その空白行を削除し、番号を振り直す() Dim i As Long, j As Long '行削除の処理 For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then If Range("E" & i).Value = "" Then Rows(i).Delete End If End If Next '番号振りなおし処理 '’’Range("A" & Rows.Count).End(xlUp).Offset(1).Select For i = 0 To Range("A" & Rows.Count).End(xlUp).Row If Range("A" & i).Value = "番号" Then j = 1 ・・・・・ここでエラー発生 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then Range("A" & i).Value = j j = j + 1 End If Next ActiveSheet.Protect End Sub

  • 途中に空白行や列があるデータ範囲

    エクセル2003です。 セルA1からセルC50までデータがあり 10行目と20行目は全て空白、 セルC39が空白で セルE55、F57、G55にはデータがある の状態で以下の構文ですと Sub 範囲コピー1() Range("B3").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy End Sub 途中に空白行や列、空白セルがあり さらに離れた所E55、F57、G55に データが有るのにもかかわらず セルB3からセルG57までを選択してクリップボードにコピー してくれます。 ですが問題がありまして 上記のシートにて A45~F50を選択してDeleteをし、 さらにセルのF55、G55もDeleteして データ範囲を セルA1~E44とセルE55のみにしてからから 上記構文を実行すると セルB3からセルE55を選択してクリップボードにコピー してほしいのに、 データ削除前と同様の セルB3からセルG57を選択してクリップボードにコピー されてしまいます。 これはエクセルの手操作 Ctrl+Shift+End でも同じようになりますので当然の結果(※1)と思っています。 (※1→なにか別な方法はありますか?) 上記の使用方法はあまりないのですが 構文を使う時点での最大行数や最大列数は常に不明で 途中空白が有る場合無い場合、 上記のようにシート上でデータ操作をした直後であっても データ削除部分は加味しデータのある範囲だけの取得の対応 が可能な構文を1種類で作成したいのですが どういう方法があるでしょうか? ちなみに Sub 範囲コピー2() Range("B3").Select Range(Cells(Rows.Count, 1).End(xlUp).Row).Select Range(Cells(1, Columns.Count).End(xlToLeft).Column).Select Selection.Copy End Sub これですと 実行時エラー1004 Rangeメソッドは失敗しましたGlobalオブジェクト となります。 ヘルプをクリックしても何も表示されません。 WEB検索するとこのエラーの質問は結構多いのですが 事例が相違する為よく理解できません。 もしかしてRangeなのに 取得できる値が一つの番号でセルを指定できないからでしょうか? エラーになる構文だと最初のRangeは行番号、次のRangeは列番号、 ですので。 で、 Sub 範囲コピー3() Dim 最終行 Dim 最終列 Range("B3").Select 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 最終列 = Cells(1, Columns.Count).End(xlToLeft).Column Cells(最終行, 最終列).Select Selection.Copy End Sub これならエラーにはなりませんが 事例だとセルC50だけが単独選択されて範囲として 取得をしてくれません。 また 1, Columns.Count ですので最終列の列番号の取得が1行目の最終列から左に検索し データのある所の列番号を返すので 3→C列 となってしまい D,E,F列を見つけてくれません。 かといって 55, Columns.Count では データが55行まで無い場合には対応が出来ませんのでこれも駄目です。 途中に空白が無い場合や離れたセルが無い場合でも使いたいので UsedRangeは使用したくない(よくわかってない事もあって)です。 よろしくお願いします。

  • 空白のセルを行削除する。EXCELマクロなのですが・・

    VBA初心者です。 データーをHPから、単純にコピーしてきて、 EXCELに貼り付けています。 フィルターをかけても、画像かなにかがセルに張り付いているのか、 空白行をすべて削除できません。 いろいろ試して(HPから、空白セルの行削除について書かれてあるマクロを貼り付けて)動いたのが、このVBAです。 しかし、遅いので、早いVBAに簡略できればいいのですが。。 大体、1000行ぐらいの文字を貼り付けて、3/1ぐらいが空白行です。A行のセルの空白のみを、削除したいのですが。  まったくの素人なので、わかりません。 どうかよろしくお願いいたします。 Sub 空白の削除() x% = Worksheets("sheet1").Range("A65536").End(xlUp).Row For i = x% To 1 Step -1 If Worksheets("sheet1").Cells(i, 1).Value = "" Then Worksheets("sheet1").Rows(i).Delete Next End Sub

  • Excelvba表に空白行があれば上に詰める重い

    いつもお世話になっております。 列がD列からK列で、行が4行目から23行までの表があります。 その表で1行まるまる空白の時(4行目にには数式が入っていますがそれは除く) 上の行に詰めるようにしてあります。行はそのまま空白のまま残して、値のみ上に詰めるようにしています。 このような表が同じ列に4か所×3=12か所あるので、今はそれぞれ下のコードの行、列を変更して処理しています。 上の表と下のの表の間隔は、上が4~23行までで、下は30~49、と6行間隔です。結合セルも間にあるため5行空きがあります。 列と列の間隔は、左側から、D列~K列、続いて、N列~U列と続きます。2列空きがあります。 家で試した時は一応問題なく動いたのですが、 会社でした時フリーズしてしまい、うまくいきませんでした。 その後、家でしてもなぜかうまく動作しなくなりました。 12の表は多いのかと思い、1つで試してもだめになりました。 同じような作りの別のファイルは動いています。 念のため、新しいファイルにコピーし直してやりましたが、駄目でした。 コードもあまり良くないのかもしれません。 一応家ではVISTAの2007で試し、会社は7(32ビット)の2013です。 もう少し負担が少なくなるようなやり方があればと思っています。 もう少し、いいやり方があればお手数ですが、ご教授ください。 よろしくお願いいたします。 Sub 表の空白行は上に詰める() Dim i As Integer, x As Integer, y As Integer, CSUM As Integer Dim flag As Boolean Application.ScreenUpdating = False flag = 0 '1回だけの処理で使うフラグ For x = 22 To 4 Step -1 '23行→4行まで処理をします。 CSUM = 0 '列の文字数を数える変数CSUMを用意し、初期値0とします。 For y = 4 To 11 'D列→K列まで処理をします。 CSUM = CSUM + Len(Cells(x, y)) 'CSUMにセル(x,y)の文字数を足します。 Next '列処理繰り返し If CSUM = 0 Then Range(Cells(x + 1, 4), Cells(23, 11)).Copy '空白行の1行下から23行目までをコピー Cells(x, 4).PasteSpecial '空白行の1列目のセルを基点として貼り付け If flag = 0 Then '23行目の値クリア処理 1回だけの処理 Cells(23, 5) = 1 '23行目がすっからかんのときエラーになるので、暫定入力 Range(Cells(23, 4), Cells(23, 11)).SpecialCells(xlCellTypeConstants).ClearContents End If '1回だけの処理 ここまで flag = 1 '1回だけの処理させないためフラグ値変更 End If Application.CutCopyMode = False Next '行処理繰り返し End Sub

  • vba  対象セルが空白の間動作を繰り返すには?

    下記を走らせると、セルが右端まで行ってとまります。 そうなる前に、対象セル範囲が空白になった時点で、動作を止めたいのですが どう記述するのがいいでしょうか? Dim u As Integer, o As Integer Application.Calculate For u = 2 To 3 For o = 7 To 2000 If Cells(u, o) = "" Then Range("G2").Select Range("G2").End(xlToRight).Select ActiveCell.Resize(6, 5).Select Selection.Cut Range("B2").Select Range("B2").End(xlDown).Select ActiveCell.Offset(1).Select ActiveSheet.Paste End If Next o Next u End Sub

  • VBAで空白行を削除する

    VBAでリストの空白行を削除するための適当なコードを探しているのですがどんぴしゃのものが中々見つかりません。ご教授下さい。 ブックBのシートBのリストにはA2~AN●まで値が入っています。 別のブックAからVBAで値を取り出し貼り付けています。 いくつかの方法を試しました。 (1)ブックを開いたときに空白行を削除 Sub Auto_Open() '空白行を削除 Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True End Sub 5分以上砂時計のままで結局終わりません。 強制終了させ再度ブックを開くと空白行は削除されているのですが、こんな動作では使うことができません。 (2)ブックAの値を貼り付けた後、空白行を削除し上書き保存する Sub エクスポート() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Range(Cells(5, 7), Cells(79, 46)).Select Selection.Copy 'コピー Workbooks.Open Filename:="\\パス\ブックB.xlsm" '貼り付け先ファイルオープン Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '貼り付け Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True  '空白行を削除 ActiveWorkbook.Save '上書き保存 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub (3)空白行を削除の部分は以下のコードも試しました Worksheets("SheetB").Range("A1").Select Set currentCell = Worksheets("sheetB").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If Not IsEmpty(currentCell) Then 'カレントセルが空白でなく、 If IsEmpty(nextCell) Then '次のセルが空白のとき nextCell.EntireRow.Delete End If End If Set currentCell = currentCell.Offset(1, 0) Loop '空白行削除 宜しくお願い致します。

  • VBAエクセル空白セル0の入力

    C列が空白となるまで、F列・・・L列の空白セルに0を代入する。 という処理を行いたく以下コードで実行をして ファイル種類をCSVにて、保存した後名前の変更で拡張子をTXTにすると データ入力された列の以降がカンマの羅列が「,,,,,,,,(改行)」の繰り返しで表示されてしまいます。 (CSV保存の後、視覚的に空白部分を行選択して削除するとなくなります。) どうすれば、このカンマが表示されなくなるでしょうか。 うまく説明できてないですが、アドバイス御願いします。 Dim i As Long i = 3 Do Until Cells(i, 3).Value = "" If Cells(i, 6).Value = "" Then Cells(i, 6).Value = "0" End If If Cells(i, 7).Value = "" Then Cells(i, 7).Value = "0" End If If Cells(i, 8).Value = "" Then Cells(i, 8).Value = "0" End If If Cells(i, 9).Value = "" Then Cells(i, 9).Value = "0" End If If Cells(i, 10).Value = "" Then Cells(i, 10).Value = "0" End If If Cells(i, 11).Value = "" Then Cells(i, 11).Value = "0" End If If Cells(i, 12).Value = "" Then Cells(i, 12).Value = "0" End If i = i + 1 Loop

  • ある列の計算式が入っているセルの行のみを削除したい

    Excel2007でマクロを作成している超初心者です。 B列のセルには 空白 文字列 計算式が入っています。このうち計算式の入っているセルの行のみを削除したいのですが、どうしたらよろしいでしょうか?  セルには =IF(C17="","",+K17*L17)という式が入っています。 次式は0か空白の場合ですが、これをどのように修正したらできるでしょうか? Sub 行の削除() Dim i As Long For i = 1 To Selection.End(xlDown).Columns Step 1 Select Case Range("B" & i).Value Case 0, "" Columns(i).Delete End Select Next End Sub

  • セル範囲の指定方法について教えて下さい

    エクセルマクロ勉強中です。 いつも皆様のご回答をもとに勉強させて頂いております。 下記を行いたいのですが、うまくいきません。 AA列を検索(AA1から最終セルまでは空白セル無し)し、AA1からAEまでをコピー したいです。AEの最終行はAAで検索した最終行となります。 AA10が最終行であったならば、コピー範囲はRange("AA1:AE10")。   AA    AD AE 1  1     0 空白 2  1.5    2 空白 3  2     4  0.0 4  2.5    6  0.0 ・  ・     ・  ・ ・  ・     ・  ・ 11  空白 Range("AA1", Range("AA1").End(xlDown).End(xlToRight)).Select Selection.Copy 上記ですとAD列までは選択されますが、AEまで列までを選択するには どうしたらよいのでしょうか? ご教示頂きたく宜しくお願い致します。

  • VBAのセル空白探しは??????多々仕様なども含めて迷っている部分があるので助けてください

    VBAで入力チェッカーを作っているのですが、仕様の部分でなやんでいます。 Private Sub CommandButton1_Click() Dim i As Long lastRow = Range("A65536").End(xlUp).Row For i = 10 To lastRow If Range("A" & i).Value = "" Then Range("A" & i).Value = ??? Exit For End If Next i End Sub USERがあるセルにデータを入力するとA列に5行ごと自動に値が入ります。 しかし、入力忘れで5行飛ばしたりはたまた10行空白が出来る場合があります。 その際のチェッカーの役割なのですが。。。 したから行を見ていってA10~最終行までの間でどこか空白があったら下から空白を探し空白箇所から5個上のセルの値を基本的にコピーをしていれる。 もし5個上のセルにも無かったら10個上みたいにやりたいのですがどうしたらよいでしょうか?

専門家に質問してみよう