プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております
3万件あるデータを一行づつ削除したいです。
おしえてくれませんでしょうか

質問者からの補足コメント

  • うーん・・・

    早速ありがとうございます。
    A1からMM30000
    のデーターが存在します。
    データ内容は顧客情報です。
    単純に一行おきに削除
    Row 1
    Row 3
    Row 5

    というので行ごと削除です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/04/22 16:53
  • うーん・・・

    Excelです。

      補足日時:2020/04/22 16:54
  • どう思う?

    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
    だと時間がかかります

      補足日時:2020/04/22 16:59

A 回答 (7件)

この辺りが参考になると思われます。



https://detail.chiebukuro.yahoo.co.jp/qa/questio …
エクセルVBA Unionはなぜ遅い?
https://oshiete.goo.ne.jp/qa/9358734.html

下から順に削除していくのが
ロジックも簡単で、そこそこのスピードかと思います。

腕に自信があって応用がきくタイプなら、スピードアップのテクニックを駆使したものを。
    • good
    • 0
この回答へのお礼

なるほど、実はわたしもここに落ち着きました。
いろいろ検索して実験しました。
Rows(i).Delete
で最後にSort
する方法が早いことに検証して
気が付きました。
ありがとうございました

お礼日時:2020/04/24 17:10

こんにちは



ご提示の方法はかなり速い方法であると思いますが・・・?

手元のエクセルで試してみて、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

ご参考までに。
    • good
    • 0
この回答へのお礼

ありがとうございました
とても参考になりました。

お礼日時:2020/04/24 17:12

行削除すればいいのでは?


時間がかかるというのがどれほどかかっているのか分かりませんが、
頑張ってループして行削除では約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
    • good
    • 0
この回答へのお礼

ありがとうございました
とても参考になりました。

お礼日時:2020/04/24 17:13

顧客情報にIDなるものが連番であるのなら、奇数Noを抽出すれば宜しいのでは?


SQLで。
うちのはお古だから9秒かかるけど最近のなら半分以下で行けるんじゃないの?
    • good
    • 0
この回答へのお礼

いつもお世話になっております
ヒントありがとうございます。
なんとかなりそうな感じです。

お礼日時:2020/04/22 19:04

色々方法はあります。


念のため、コピーファイルで試して下さい。
https://prau-pc.jp/excel/every-other-line-3/
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考に致します。

お礼日時:2020/04/22 19:05

ソフトが不明ですが・・・


  
> 3万件あるデータを一行づつ削除したいです
「一行づつ削除」であれば根気よくやるしかないでしょう。
「まとめて削除」なら、そしてExcel かWordであればCtrlキー+「A」で全選択→Deleteキーで一気に消えます。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2020/04/22 19:05

どのような形で保存されているデータを、どういう順番で一行ずつ削除したいのでしょうか?

この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2020/04/22 19:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!