No.7ベストアンサー
- 回答日時:
この辺りが参考になると思われます。
https://detail.chiebukuro.yahoo.co.jp/qa/questio …
エクセルVBA Unionはなぜ遅い?
https://oshiete.goo.ne.jp/qa/9358734.html
下から順に削除していくのが
ロジックも簡単で、そこそこのスピードかと思います。
腕に自信があって応用がきくタイプなら、スピードアップのテクニックを駆使したものを。
この回答へのお礼
お礼日時:2020/04/24 17:10
なるほど、実はわたしもここに落ち着きました。
いろいろ検索して実験しました。
Rows(i).Delete
で最後にSort
する方法が早いことに検証して
気が付きました。
ありがとうございました
No.6
- 回答日時:
こんにちは
ご提示の方法はかなり速い方法であると思いますが・・・?
手元のエクセルで試してみて、30000行で1秒かかりませんでした。
ただし、データの内容にもよる(長い文字列が入っているなど)と思いますので、メモリの余裕がどのくらいあるかが関係しているのかも知れません。
ご提示のコードに疑問点がありましたので、修正してテストしていますが、実際にテストに用いたコードは以下です。
Sub Sample1()
Dim x, y()
Dim i As Long, j As Long, r As Long
x = Range("A1").CurrentRegion.Value
irow = UBound(x, 1)
icol = UBound(x, 2)
ReDim y(1 To irow, 1 To icol)
For i = 1 To irow Step 2
r = Int((i + 1) / 2)
For j = 1 To icol
y(r, j) = x(i, j)
Next j
Next i
Range("A1").CurrentRegion.Value = y
End Sub
別の方法として、新しいシートに抽出する方法を試してみました。
配列を使わないのでVBAではメモリを使用しませんが、エクセル側でメモリを使うので同じかも知れません。(笑)
ロジック的にはこちらの方が時間が掛かるはずですが、30000行で約6~7秒程度でした。
※ 元のデータは「Sheet1」にあるものと仮定しており、新規シートに抽出します。
Sub Sample2()
Dim rw As Long, sh As Worksheet
Dim rng As Range, tmp As Range
Set sh = Worksheets.Add
Set rng = Worksheets("Sheet1").UsedRange
Set tmp = sh.Range(rng.Resize(Int((rng.Rows.Count + 1) / 2)).Address)
f = "=INDEX(Sheet1!" & rng.Address & ",ROW()*2-1,COLUMN())&"""""
tmp.FormulaLocal = f
tmp.Value = tmp.Value
End Sub
ご参考までに。
No.5
- 回答日時:
行削除すればいいのでは?
時間がかかるというのがどれほどかかっているのか分かりませんが、
頑張ってループして行削除では約3秒でした。
UNIONとか使えばもうちょっと早くなるかもしれませんが更なる制約もあるし面倒だったので。
Public Sub test()
' 計測開始
Dim startTime As Double
startTime = Timer
Application.ScreenUpdating = False
Dim targetRowsText As String
targetRowsText = ""
Dim maxRow As Long
maxRow = 30000
Dim r As Range
' 最大行を2で割り、そのカウンタ+カウンタ-1で奇数値が得られる
For i = WorksheetFunction.RoundUp(maxRow / 2, 0) To 1 Step -1
Dim row As Long
row = IIf(i = 1, i, i + i - 1)
Dim addRowText As String
addRowText = CStr(row) & ":" & CStr(row)
' Rangeの文字列は255文字以内でないとダメなので
If Len(targetRowsText & addRowText) > 255 Then
targetRowsText = Left(targetRowsText, Len(targetRowsText) - 1)
Set r = Range(targetRowsText)
r.Delete Shift:=xlUp
targetRowsText = ""
End If
targetRowsText = targetRowsText & CStr(row) & ":" & CStr(row) & ","
Next
targetRowsText = Left(targetRowsText, Len(targetRowsText) - 1)
Set r = Range(targetRowsText)
r.Delete Shift:=xlUp
Application.ScreenUpdating = True
' 計測終了
Dim endTime As Double
endTime = Timer
MsgBox endTime - startTime
End Sub
No.4
- 回答日時:
顧客情報にIDなるものが連番であるのなら、奇数Noを抽出すれば宜しいのでは?
SQLで。
うちのはお古だから9秒かかるけど最近のなら半分以下で行けるんじゃないの?
No.3
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセル 2つの列にある値の完全一致を抜き出すVBA 15 2022/12/15 03:22
- その他(IT・Webサービス) 高速処理可能な表計算ソフトについて ExcelやGoogleスプレッドシートのような表計算ソフトで、 2 2023/04/29 16:06
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
- Excel(エクセル) エクセルのVBAにショートカットキーの割り当て 3 2022/07/13 14:19
- Excel(エクセル) 特定のデータの抽出方法を教えてください@Excel 4 2023/06/13 18:38
- Visual Basic(VBA) ListView重複データ削除 2 2022/08/05 18:12
- Excel(エクセル) Excel 指定した固有番号で、複数の行を削除する方法は? 2 2022/03/30 15:18
- その他(法律) 携帯電話会社に保管されている解約済み個人情報を消去したい 3 2022/08/13 23:23
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて 重複したものがあれば行を削除するとい 1 2023/02/27 18:49
- Excel(エクセル) エクセル 任意の列数で分割する方法 3 2022/07/31 14:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
回答が付かなかったので、再質...
-
教えてgooの機能に関するアンケ...
-
VBA:Openステートメントで開い...
-
もう関わりたくない人がいたらL...
-
指定した文字があった場合、そ...
-
女友達にLINEしたら、既読スル...
-
恋愛相談かてで
-
エクセルで住所の混在する「丁...
-
アクセスにおいて間違って削除...
-
マクロで特定の行まで削除する...
-
ダブルクォーテーションの削除...
-
VBA IF文でORを使ったとき後ろ...
-
バッチファイルを使用したsql@p...
-
ハメ撮りが流出したら
-
教えて!gooで、自分がした回答...
-
日テレニュースHP、記事削除は...
-
いちとか1コメとかいう糞迷惑な...
-
教えて!goo質問の削除方法
-
エクセルVBAで行削除時にエラー...
-
Windows11に残されたWindows10...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA:Openステートメントで開い...
-
「医者も看護師も自分に嫌がら...
-
ハメ撮りが流出したら
-
指定した文字があった場合、そ...
-
教えて!gooにはどのカテゴリが...
-
もう関わりたくない人がいたらL...
-
真剣な質問ほど消されるのはど...
-
Facebookメッセンジャーの不具合
-
インスタグラムのギャラリーの...
-
エクセルで住所の混在する「丁...
-
回答してる間に質問が消えるっ...
-
アクセスにおいて間違って削除...
-
喧嘩をしてLINE削除され、 また...
-
バッチファイルを使用したsql@p...
-
Facebookに自分が四つもアップ...
-
ウェブページへのアクセス不可 ...
-
同じ質問
-
日テレニュースHP、記事削除は...
-
女友達にLINEしたら、既読スル...
-
エクセルVBAで行削除時にエラー...
おすすめ情報
早速ありがとうございます。
A1からMM30000
のデーターが存在します。
データ内容は顧客情報です。
単純に一行おきに削除
Row 1
Row 3
Row 5
というので行ごと削除です。
Excelです。
x = range("A1").currentregion.value
irow = cells(rows.count,1).end(xlup).row
icol = cells(1 ,columns.count).end(xltoleft).column
Redim y(1 to Irow, 1 to icol)
for i = 1 to irow step 2
Cnt(i,1) = Cnt(i,1) + 1
for j = 1 to icol
y(cnt,j) = x(i,j)
next
next
range("A1").resize(irow,icol) =y
だと時間がかかります