• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:列の削除を早くしたい)

列の削除を早くしたい

このQ&Aのポイント
  • 列の削除を早くするための方法を教えてください。
  • 現在、列の数が2370列以上あり、処理が遅くなっています。
  • 行数は1から33行までで固定されています。この条件を加味しながら、より早く処理する方法があれば教えてください。

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.2

こんにちわ   これを試してください。 Sub 空白列の削除() Dim UsedCell As Range Dim Max_column As Long, columnCount As Long Dim i As Long, j As Long Dim 削除前配列 As Variant, 削除後配列 As Variant Dim Max_gyo As Long '使用しているセルの範囲を取得します Set UsedCell = ActiveSheet.UsedRange '最大の行番号を取得します Max_column = UsedCell.Columns.Count Max_gyo = UsedCell.Rows.Count 削除前配列 = UsedCell.Value ReDim 削除後配列(1 To Max_gyo, 1 To Max_column) i = 0 For columnCount = 1 To Max_column 'Worksheet関数のCountAを使ってデータの個数をカウント If Application.WorksheetFunction.CountA(UsedCell.Columns(columnCount)) <> 0 Then i = i + 1 For j = 1 To Max_gyo 削除後配列(j, i) = 削除前配列(j, columnCount) Next j End If Next columnCount UsedCell.ClearContents UsedCell.Resize(Max_gyo, i).Value = 削除後配列 End Sub それから、たまに間違った説明をしているのを見かけるのですが、 UsedRangeは、A列または、一行目がすべて空白だと、 "A1"からの領域ではないということを意識して、使用してください。

aitaine
質問者

お礼

何ということでしょう!あの長い時間かっかった列の削除が一瞬にして実行できました。最初本当に削除したの?という疑いを持ったほどです。本当にありがとうございました。感謝感激です。ありがとうありがとう。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! あまりお役に立てないかもしれませんが、 お示しのコードでちゃんと動作するのであれば・・・ 画面更新を止めてみてはどうでしょうか? >For columnCount = ・・・ の行の前に >Application.ScreenUpdating = False を追加、 >Next の後に >Application.ScreenUpdating = True を追加。 この程度しか思いつきませんが、時間短縮にならなかったらごめんなさいね。m(_ _)m

aitaine
質問者

補足

ご指摘の件に関してはすでに試しております。できれば、最大行数が33であることを利用して速度をあげたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 空白行を削除して上へ詰めたい

    例えば、画像のように 1行目から10行目の間に適当に値が入ってるとします。 その中で、行に何も入っていないのなら、削除して上へ詰めたいのですが どのようなコードを書けばいいでしょうか? 該当の行の1列目から256列目のどの列にも値が入ってないのが条件です。 自分なりに考えたのですが ---------------------------------------- Sub test1() Dim i, gyou As Long For gyou = 1 To 10 '最終行 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then Rows(gyou).Delete gyou = gyou - 1 '削除すると行がずれる End If Next End Sub ---------------------------------------- Sub test2() Dim i, gyou As Long gyou = 1 Do While gyou <> 10 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then Rows(gyou).Delete Else gyou = gyou + 1 End If Loop End Sub ---------------------------------------- どちらも、なぜか無限ループになってしまいます。 どうすればいいか教えてください。

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

    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

  • 列を削除して行きたい。

    すみません、誰か教えて頂けませんか。 1行目にタイトルが書いてあり、その下が空欄だと 列を削除しようと考えて下記の様に記述しましたが、 2列目しか削除されません。 何か、記述がおかしいのか、他にやり方があるのか 教えて頂けませんでしょうか。 宜しくお願いします。 Co = Cells(1, Columns.Count).End(xlToLeft).Column For ii = 2 To Co If Cells(1, ii).End(xlUp).Row = 1 Then Cells(1, ii).EntireColumn.Delete End If Next ii

  • エクセルの列削除がうまくいかない。

    CSV変換データの不要な列を削除しようとしているのですが、思うような動作しません。 CSV変換マクロを起動と同時にA,B,E,F,O,P,Q,R列を削除しようとしているのですが、うまくいかない。 教えていただけないでしょうか。 添付データは元のファイルです。 Option Explicit Sub EasyCopyCSV() Dim CSV_filename As Variant, target As Variant Dim CSV_SheetName As Variant Dim FileCount As Long Dim kk As Long CSV_filename = Application.GetOpenFilename(filefilter:="CSVファイル(*.csv;*.prn),*.csv;*.prn", MultiSelect:=True) If IsArray(CSV_filename) Then Else MsgBox "キャンセルされました" Exit Sub End If FileCount = UBound(CSV_filename) '配列のサイズからファイル数を調べる For kk = 1 To FileCount 'ファイル数カウンタ初期化しファイル数分カウンタを回す Workbooks.Open CSV_filename(kk) 'ファイルを開く CSV_SheetName = Worksheets(1).Name '開いたシートの名前=ファイル名を取得 Sheets(CSV_SheetName).Move Before:=ThisWorkbook.Sheets(1) Next '不要列を削除 With ActiveSheet .Range(.Columns(1), .Columns(2)).Delete Shift:=xlShiftToLeft .Range(.Columns(5), .Columns(6)).Delete Shift:=xlShiftToLeft .Range(.Columns(15), .Columns(18)).Delete Shift:=xlShiftToLeft End With End Sub

  • A列にB列の空白セル以外のセルの数だけ1から番号をふりたい。

    A列にB列の空白セル以外のセルの数だけ1から番号をふりたい。 WIN7 Excel2007でマクロ作成中です。A列にB列の番号の入っているセル(空白セル以外の)の数だけ番号を入力したいのですが、下記コードで、うまく出来ません。どうしたらよろしいでしょうか。 Sub 行番号を入れる2() Dim i As Integer Dim fCnt As Long 'シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If fCnt = WorksheetFunction.CountA(Sheets("一覧").Columns(2)) 'COUNTA関数でB列の入力セル数を求める。 For i = 1 To fCnt Worksheets("一覧").Cells(i + 3, 1).Value = i Next i End Sub

  • エクセルマクロで列を削除したい

    エクセル2013です。 マクロの途中で列を削除するようにしてあります。 A列~J列、N列~Q列、T列~U列、W列~Y列を一括削除なのですが A列~J列だけは、作業者が選択した1列だけを残して削除をしたいです。 マウスで選択させて、列を指定する所までは作成できましたが 列削除の部分(★の部分)が 思うように作成できず完成できません。 アドバイスをお願いいたします。 Sub 列削除() Dim マウス選択 Dim 選択列 Dim 選択月表示 Dim 質問 On Error GoTo myError 'INPUT-BOXでキャンセルを選択した時の回避 Set マウス選択 = Application.InputBox("回覧用に編集したい月の列を選択してください", Type:=8) If マウス選択.Columns.Count > 1 Then '選択したしたのが列で有り1列であるか確認 MsgBox "選択したのは列ではありません。又は2列以上を選択しています" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If If マウス選択.Rows.Count > 1 Then '選択したのが行又はセルの場合の処理 Else MsgBox "行又はセルを選択しています。1列を選択してください" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Set マウス選択 = マウス選択.EntireColumn Debug.Print マウス選択.Address 選択列 = マウス選択.Column 'INPUT-BOXで選択した列を数字に置き換える 選択月表示 = Cells(2, 選択列).Value '選択した列の8行目のセルの値を格納 If 選択列 > 10 Then '選択したのが11列以上の場合の処理 MsgBox "11列目以降は選択できません" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" '不要列削除 ★ Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete Else MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Exit Sub 'エラーが出なかった時のmyErrorの回避用 myError: 'INPUT-BOXでキャンセルを押した時の処理 MsgBox "キャンセルが押されました。プログラム終了します。" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub End Sub

  • VBA 特定の文字列を含む行を削除する方法

    特定の文字列を含む行を削除する方法が知りたいです。 行を削除する方法はWebで見つけたのですが↓ ---------------------------------------------------- Sub 特定の文字列を含む行を削除() Dim c As Range Dim myRow As Long With Range("A:A") Set c = .Find("特定の文字列") Do While Not c Is Nothing Rows(c.Row).Delete shift:=xlUp Set c = .Find("特定の文字列") Loop End With End Sub ---------------------------------------------------- ↑行を指定している箇所のRowsを Columns  RowをColomn に変更して以下の様にしてみました、   Columns(Colomn,c).Delete shift:=xlUp だめでした、、、。 VBAの知識が乏しく、組み立て方について理解が無いため、どうすればよいかさっぱりわからず、、 こちらで質問させて頂きました。。。 何卒宜しくお願い致します。

  • 指定した文字列が含まれる行を削除する

    データの照合をしています。 指定した文字列が、「O列」に入っていたら、その行を削除し、 行をつめる というようなマクロを組みたいのですが、エラーがかかってしまいます。 (下のVBは、ネットで公開されていたのを使用させていただいております。) Sub Macro1() Const col As String = "A" '文字列が入力されている列 Dim idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列は?", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then   For idx = Cells(65536, col).End(xlUp).Row To 1 Step -1     If InStr(Cells(idx, col).Value, keyWord) > 0 Then '    If Application.CountIf(Rows(idx), "*" & keyWord & "*") > 0 Then       Rows(idx).Delete     End If   Next idx End If End Sub 「下から3行目のNEXTに対応するforがない」とエラーがでます。 ご教授、お願いいたします。

  • VBAで教えてください

    こんにちは、VBAを作成したのですが、意図する動作にならず、ご教授お願いします。やりたいことは、2行目を検索して、"AB"を含む文字があったら、その行を削除するというものです。ですが、下記コードでは "AB"を含む文字がB列、C列と続けてあった場合、C列は削除してくれません。 思うに、最初のB列を削除したときに、左に列がSHIFTしてしまい検索にかからないのでは?と思っています。最初のB列を削除した後に、Columnの値を-1してあげればいいのかな? と思うのですが、うまくコードが書けませんでした。どうぞよろしくお願いします Sub ab_sakujyo() Dim i As Integer For i = 1 To 50 If Cells(2, i).Value Like "*AB*" Then Columns(i).Delete End If Next End Sub

  • 条件によって行削除を繰り返し処理する

    一行目がフィールド名で、Z列まで値の入っているデータがあります。 x列が""の場合はその行を削除する処理を最終行まで続けたいのですが、 ""行が2行以上続いているとFor~によって行を飛ばしてしまいます。 何か良い方法はありませんでしょうか? Sub 削除() Dim last As Long Dim row As Long last = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).row For row = 2 To last If Cells(row, 24).Value <> "" Then Rows(Format(row) + ":" + Format(row)).EntireRow.Deletesift:=xlUp End If Next End Sub