Worksheets("顧客名")のA列に1から順に数値が入っています。
例えばTextShoyu1の値が5の時はA列に5が入った行を削除するために以下のように書きました。
イベントとしては思い通りになったのですが、ループ処理に非常に時間がかかります。
どこを修正すればスムーズな処理が出来るでしょうか?
よろしくお願いいたします。
Private Sub CommandButton1_Click()
Dim i As Long
For i = Range("A1").End(xlDown).Row To 2 Step -1
With Worksheets("顧客名").Cells(i, "A")
If _
.Value Like Me.TextShoyu1.Value Then
.EntireRow.Delete
End If
End With
Next i
End Sub
No.10ベストアンサー
- 回答日時:
閉じてないようでしたので、参考になれば幸いです。
------------------------------------------------------
Private Sub CommandButton1_Click()
Dim sh As Worksheet
Dim ix As Long
Dim stime As Variant
Dim etime As Variant
Application.ScreenUpdating = False
stime = Time
If TextShoyu1.Text = "" Then
MsgBox ("削除条件設定")
Exit Sub
End If
Set sh = Worksheets("顧客名")
For ix = sh.Cells(sh.Rows.Count, 1).End(xlUp).row To 2 Step -1
If TextShoyu1.Text = sh.Cells(ix, 1) Then
sh.Rows(ix).Delete
End If
Next
etime = Time
Application.ScreenUpdating = True
MsgBox ("実行時間(秒)=" & Second(etime - stime))
End Sub
-------------------------------------------------
最後に実行時間を表示しています。不要であれば、この行をコメントアウトしてください。
こちらの環境では、20000行のうちA列が5のデータを3000件で
実行したところ6秒かかりました。
もっと、速い方法を望まれる場合は、このサンプルは試さないでください。
このスペックでもよいなら試してください。
実行時は、ブックのバックアップをとってから試してください。
No.11
- 回答日時:
以下のようになります。
--------------------------------------------------
Private Sub CommandButton1_Click()
Dim stime As Date '開始時刻用
Dim etime As Date '終了時刻用
Dim i As Long
stime = Time '開始時刻取得
For i = Range("A1").End(xlDown).row To 2 Step -1
With Worksheets("顧客名").Cells(i, "A")
If _
.Value Like Me.TextShoyu1.Value Then
.EntireRow.Delete
End If
End With
Next i
etime = Time '終了時刻取得
MsgBox ("実行時間(秒)=" & Second(etime - stime))
End Sub
-------------------------------------------------------
今後、時間を計測したい場合、一般的には、以下のような手順になります。
Dim stime As Date '開始時刻用
Dim etime As Date '終了時刻用
stime = Time '開始時刻取得
・・・・計測したい処理
etime = Time '終了時刻取得
MsgBox ("実行時間(秒)=" & Second(etime - stime))
---------------------------------
処理時間を計測したい直前に
stime=Timeをかくと、現在時刻をstimeに格納します。
計測したい処理が終わった後で、
etime = Timeをかくと現在時刻をetimeに格納します。
msgboxに表示するのは、そのあと、どこでも構いません。
(通常は、etime=Timeの直後でよいかと)
Second(etime-stime)の意味ですが、
Timeで取得した値(stime,etime)の単位は秒でなく、excel固有のDate型で示される単位です。
そのため、Second関数で秒に換算して、表示します。
(最初に投稿したときは、stime,etimeをVriantで定義しました。Variantでも問題なく動作しますが、
Date型のほうが時間を扱っていることが明確になるので、時間計測の場合はDate型を使用したほうが良いでしょう。)
No.9
- 回答日時:
となると見た目には同じに見えても
どこかが「別物」というコトになります。
不要なスペースが入っていたり・・・
あくまで完全一致が前提のコードですので
試しにどこか使っていないセルにMATCH関数などを使って
=MATCH(検索数値,顧客名!A:A,0)
(検索数値とはテキストボックスに入力する数値)
としてみてください。
ちゃんと数値(行番号)が表示されればそのデータは存在する!というコトになり、
#N/A と表示されれば存在しない!というコトになります。
万一エラーが表示される場合は見た目は同じでも別物です。
※ こちらではお手元のデータがどのようになっているのか判断できませんので
いままでのやり取りで考えられるといえばこの程度ですかね。m(_ _)m
No.8
- 回答日時:
A列が半角でテキストボックスが全角というコトはないですか?
(もしくは逆のパターン)
同じ数値でも全角と半角では別物になります。
A列データが数値の半角という前提であれば
myStr = StrConv(Me.TextShoyu1, vbNarrow)
のようにしてみてください。
※ A列が文字列・数値が混在の場合はちょっと厄介になりそうです。m(_ _)m
No.7
- 回答日時:
No.2・5です。
メッセーボックスが邪魔をしている可能性がありますので、
コード内の
>Else
>MsgBox "該当データなし"
の2行を削除したらどうなりますか?m(_ _)m
No.5
- 回答日時:
No.2です。
ん~~~
ユーザーフォームにテキストボックスとコマンドボタンを配置しているのですよね?
テキストボックスの「オブジェクト名」が「TextShoyu1」となっているのであれば
前回のコードの
>myStr = Application.InputBox("削除する文字列を入力")
を
>myStr = Me.TextShoyu1.Value
に変更するだけで大丈夫だと思うのですが・・・
>全然別のところで・・・
とはどこでメッセーボックスが出たのでしょうか?
イマイチ理解できないのでですが、
結論としてそういうメッセージが出たというコトは
「顧客名」シートのA列に「TextShoyu1」に入力したデータがない!
というコトになると思われます。
原因が判りませんが、この程度でごめんなさい。m(_ _)m
No.2
- 回答日時:
こんばんは!
一例です。
Private Sub CommandButton1_Click()
Dim myStr As String, myRng As Range
Dim myFound As Range, myFirst As Range
myStr = Application.InputBox("削除する文字列を入力")
With Worksheets("顧客名")
Set myFound = .Range("A:A").Find(what:=myStr, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myRng = myFound
Set myFirst = myFound
Do
Set myFound = .Range("A:A").FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireRow.Delete
Else
MsgBox "該当データなし"
End If
End With
End Sub
※ No.1さんと同意見でFindメソッドにしています。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで教えて頂きたいのですが? 1 2022/04/29 02:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで「3次元配列」表の...
-
顧客CDのCDって?
-
エクセルデータ。容量を減らす...
-
事業内容に適した、見積・請求...
-
<新設税理士事務所です>ミロ...
-
エクセルの数式で教えてください。
-
Excel 指定した固有番号で、複...
-
アクセスでのデータ抽出方法
-
エクセルVBA テキストボックス検索
-
ソフトウェア開発会社とはどん...
-
読み取ったQRコード/バーコード...
-
EXCELでバーコードを作成すると...
-
振込請求書が破れてしまいました
-
エクセル バーコード作成で他の...
-
コンビニ決済の用紙で支払いの...
-
バーコードコントロールが印刷...
-
学校図書館を電算化したいので...
-
国内線航空券をJALのアプリにて...
-
ソフト面、ハード面は英語でど...
-
差し込み印刷のバーコードを小さく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
顧客CDのCDって?
-
スプレッドシートの関数につい...
-
エクセルで「3次元配列」表の...
-
<新設税理士事務所です>ミロ...
-
エクセルVBA テキストボックス検索
-
VBA リストボックス反映できない
-
エクセルの数式で教えてください。
-
VBA。リストボックスの値を別の...
-
エクセルデータ。容量を減らす...
-
現在、日興証券で重大なトラブ...
-
EXCELシート内の数字での並び替...
-
アクセスでのデータ抽出方法
-
エクセルで顧客の継続率
-
事業内容に適した、見積・請求...
-
顧客データと請求書、売上帳を...
-
Excelの集計をWordで差し込み印...
-
エクセルで並び替えするとハイ...
-
Excel 指定した固有番号で、複...
-
お客さんの来店間隔が知りたい...
-
エクセルマクロ ブックをアクテ...
おすすめ情報
こんばんは。ご回答ありがとうございます。
myStr = Application.InputBox("削除する文字列を入力")でインプットボックスを表示させるのではなく、
テキストボックスTextShoyu1の値を参照してCommandButton1クリックでイベントを行いたいです。
よろしくお願いいたします。
こんばんは。
myStr = Application.InputBox("削除する文字列を入力")を
myStr = Me.TextShoyu1.Value
としたら全然別のところで該当するデータはありませんというMsgBoxが出たのでお聞きしました。
UserForm1上のTextNumber_Changeとそれに付随するSpinButton1_SpinDown()、SpinUpと
ComboKokyakumei_Changeでデータベースを呼び出してたんですが、
どれも「該当するデータがありません」というMsgBoxが表示されます。
myStr = Me.TextShoyu1.Value
Me.TextShoyu1.ValueはTextNumberによっては数値が入っていたり空欄だったりします。
詳しくはNo.4の方の補足に書きましたが
UserForm上にデータを呼び出せなくなりました。
CommandButton1_Clickする以前の処理が出来なくなりました。
何度かファイルを閉じてやり直してみました。
すると、先程のMsgBoxは表示されなくなり、UserForm上に今まで通りにデータも呼び出せましたが、
例えばTextShoyu1に30という値が入ってる時にCommandButton1をクリックしてみましたが、
”顧客名”のA列に30が入っている行は削除されず、MsgBoxに該当データなしが表示されました。
その2行を削除しました。
MsgBoxは当然表示されなくなりましたが、
行削除は出来ませんでした。
A列に入るTextNumberもTextShoyu1もIMEModeは2-fmIMEModeOffにして半角入力にしています。
"顧客名"シートを確認しても半角数字のみで全角数字も文字列もありませんでした。
上記のmyStr = StrConv(Me.TextShoyu1, vbNarrow)でも結果は変わらずでした。
お手間をおかけして申し訳ありません。
こんにちは。
=MATCH(検索数値,顧客名!A:A,0)で試してみました。
ちゃんと行番号が返ってきました。
Private Sub NyuryokuButton1_Click()以下にNo.2で教えていただいたコードを書き、
myStr = Me.TextShoyu1.Valueを
myStr = StrConv(Me.TextShoyu1, vbNarrow)に変更。
Else
MsgBox "該当データなし"を削除し、
End If
End With以下に下記のように書いています。
Worksheets("買増確認一覧表").Rows(Me.TextShoyu1.Value * 2 + 2).Hidden = True
Worksheets("データベース").Rows(Me.TextShoyu1.Value).Hidden = True
End Sub
またもやお世話になり、ありがとうございます。
ちょっと諦め気味に当初のコードに戻していたところでした。
A列には同じ数値は1つしか入らないので
添付画像のとおり、いただいたコードでサクサク行きました。
ちなみにですが、当初のコードに
MsgBox ("実行時間(秒)=" & Second(etime - stime))を表示させるにはどこの部分に挿入すれば計測出来ますか?
ちなみに体感的には10秒以上はかかっています。
厚かましいお願いですが、ご教授いただけたら幸いです。
おはようございます。
時間計測の手順とても参考になりました。
ありがとうございます。
ちなみに昨日と同じデータで計測してみたら最初のコードは12秒でした。