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

参照元を削除する方法とは?

このQ&Aのポイント
  • 参照元シートのA列で参照先のA列を検索し、参照先に参照元の内容があれば参照元を行削除する方法について教えてください。
  • 現在のソースコードでは、参照元を削除するとセルのアドレスが正しくならず、意図した結果が得られないようです。参照元が削除可能になる方法を教えてください。
  • 参照元が500未満で参照先が数万ある場合、参照元を削除するための効果的な方法はありますか?

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

  • ベストアンサー
回答No.3

Option Explicit Sub DeleteRow() Dim 参照元 As Range Dim 検索CD As Variant Dim 最終行 As Long Dim nn As Long Dim S As Variant Set 参照元 = Sheets("参照元").Range("A2:A" & Sheets("参照元").Range("A" & Rows.Count).End(xlUp).Row) 最終行 = Sheets("参照先").Range("A" & Rows.Count).End(xlUp).Row 'For Each S In 参照元 For nn = Sheets("参照元").Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 S = Sheets("参照元").Cells(nn, "A").Value Set 検索CD = Sheets("参照先").Range("A4:A" & 最終行).Find(S) If Not 検索CD Is Nothing Then Sheets("参照元").Cells(nn, "A").EntireRow.Delete End If Next End Sub

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

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>参照元を行削除しようとしています 一気に抽出し,一気に削除します。 sub macro1()  dim buf1 as variant  dim moto as range  dim saki as range  buf1 = worksheets("参照先").range("A1").value  worksheets("参照先").range("A1").value = worksheets("参照元").range("A1").value  set moto = worksheets("参照元").range("A1:A" & worksheets("参照元").range("A65536").end(xlup).row)  set saki = worksheets("参照先").range("A1:A" & worksheets("参照先").range("A65536").end(xlup).row)  on error resume next  moto.advancedfilter action:=xlfilterinplace, criteriarange:=saki, unique:=false  moto.offset(1).specialcells(xlcelltypevisible).entirerow.delete shift:=xlshiftup  moto.parent.showalldata  worksheets("参照先").range("A1") = buf1 end sub

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19410)
回答No.1

>どうすれば参照元が削除可能になるでしょうか。 1件削除したら、削除直後にExit Subして、関数を呼ぶ所からやり直して下さい。 「行削除したら、すべて頭からやり直し」が必要です。 さもなければ(最初からやり直しが嫌ならば)「下から順に、逆順に削除」していく必要があります。

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

関連するQ&A

  • マクロの処理速度が遅い コピペ→削除→名前付保存

    マクロの処理速度が遅いため、大変困っています。お忙しいところ恐縮ですが、アドバイスいただけませんでしょうか。よろしくお願い致します。 作業は、30行×54列のデータの、コピペ→削除(ここまで4~5秒)→名前を付けて保存(トータル9~10秒)です。 30行はテストで、本当は500~1000行のデータを処理したいのですが、とても時間がかかり、PCが動かなくなってしまうこともあります。 ご指摘、いろいろあるかと思うのですが、細かな点でも教えてください。どうぞよろしくお願い致します。 詳細は、 元ファイルの"シート(1)”のデータ(●行×54列)を ファイル(原紙)を開き、ファイル(原紙)の"貼り付け”のシートに貼り付けます。 元ファイルの"シート(1)”のデータ(●行×54列)は、元ファイルの"シート(2)”に移動します。 元ファイルの"シート(1)”のデータ(●行×54列)を削除します。 ファイル(原紙)に、日付ー■(通し番号)をつけて、保存します。 ■は、保存先フォルダを確認し、通し番号にしています。 元ファイルは、他のシートにもいろいろデータがあり、7MBほどです。 時間測定の部分は、本番では不要です。 Sub test5() Dim startTime As Double Dim endTime As Double Dim processTime As Double '開始時間取得 startTime = Timer Dim s1 As Worksheet Set s1 = ActiveSheet Dim nPasteRow As Double Dim sHozon As String Dim sFilename As String '画面描画を静止 Application.ScreenUpdating = False '自動再計算の停止 Application.Calculation = xlManual '警告メッセージを非表示 Application.DisplayAlerts = False '***************************************** ' 元ファイルのシート(1) から ファイル.xls へ移動 '***************************************** 'ファイルを開く Workbooks.Open "C:\Users\yyy\OneDrive\デスクトップ\フォルダー\ファイル.xls" Sheets("貼り付け").Select Set wbData = ActiveWorkbook '最終行へ移動 If Range("A5").Value = "" Then nPasteRow = 5 ElseIf Range("A6").Value = "" Then nPasteRow = 6 Else nPasteRow = Range("A5").End(xlDown).Row + 1 End If Dim i As Long Dim m As Long For i = 5 To s1.Range("A4").End(xlDown).Row For m = 1 To 54 wbData.Sheets("貼り付け").Cells(nPasteRow + i - 5, m).Value = s1.Cells(i, m).Value Next m Next i '*************************** ' 元ファイルのシート(1) から シート(2)へ移動 '*************************** Workbooks("元ファイル.xlsm").Activate Dim s2 As Worksheet Set s2 = ActiveSheet '最終行へ移動 If Range("A3").Value = "" Then nPasteRow = 3 ElseIf Range("A4").Value = "" Then nPasteRow = 4 Else nPasteRow = Range("A3").End(xlDown).Row + 1 End If Dim n As Long Dim o As Long For n = 5 To s1.Range("A4").End(xlDown).Row For o = 1 To 54 s2.Cells(nPasteRow + n - 5, o).Value = s1.Cells(n, o).Value Next o Next n '***************** ' 移動した行削除 '***************** Sheets("シート(1)").Rows("5:" & Range("A4").End(xlDown).Row).Delete ActiveWorkbook.Save '******************** ' 行削除後の処理 '******************** Dim str1 As String Dim str2 As String Dim nCnt As Integer 'ファイルを開いた場合、名前をつけて保存を行う Workbooks("ファイル.xls").Activate '保存場所を指定 sHozon = "C:\Users\yyy\OneDrive\デスクトップ\フォルダー" For nCnt = 1 To 20 'ファイル名を設定 sFilename = "ファイル" & Replace(Date, "/", "") & "-" & nCnt & ".xls" Range("D2").Value = "ファイル" & Replace(Date, "/", "") & "-" & nCnt 'ファイルが存在しているか確認 str1 = sHozon & "\" & sFilename str2 = Dir(str1) If (str2 <> sFilename) Then 'ファイルが存在しない場合、保存 '名前をつけて保存 ActiveWorkbook.SaveAs Filename:= _ sHozon & "\" & sFilename, _ FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False Sheets("処理(1)").Select Application.Goto Reference:=Range("E1"), Scroll:=True Exit For End If Next '自動再計算の再開 Application.Calculation = xlAutomatic '画面描画を開始 Application.ScreenUpdating = True '警告メッセージを表示 Application.DisplayAlerts = True '終了時間取得 endTime = Timer '処理時間表示 processTime = endTime - startTime MsgBox "処理時間:" & processTime End Sub

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • エクセルVBAコンボボックスについて

    図の左のように、商品リスト欄のセルA3から下方向に大分類(A16まで14種類) セルB3~O3(Bから数えて14個目のO)列から下方向に小分類があります。 P2~P11には1から10までの数字が入っています。 図の右側がユーザフォームで、コンボボックスの番号を入れています。 コンボボックス「1.4.・・・28.」までは大分類を選べるようにして、 コンボボックス「2.5.・・・29.」までは左の大分類に応じた小分類の値を表示させたいと思っています。 大分類「111」→小分類「あ~そ」 大分類「222」→小分類「た~と」といった具合です。 そのコンボボックスの値を指定したセルに入力しようと思っています。 下のように記述した結果、問題が発生しました。 (1)大分類で14個ほどあるリストの3つほどしかでてこない。 (2)Select Caseの構文を使用していて、大分類が14個だから「Case 13」までと しているが、「大分類の数-1」までの変えられる数までにしたい。 アドバイスをいただけると助かります。 ------------------------------------------------------------------ Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) Dim MyVar20 As Variant MyVar20 = Sheets("商品リスト").Range("P2:P" & Range("P2").End(xlDown).Row) '種類欄を指定 With ComboBox1 .List() = MyVar1 End With ※・・・(省略)・・・ コンボボックス4から25まで※ With ComboBox28 .List() = MyVar1 End With '数量欄を指定 With ComboBox3 .List() = MyVar20 End With ※・・・(省略)・・・ コンボボックス6から27まで※ With ComboBox30 .List() = MyVar20 End With End Sub '1番目 Private Sub ComboBox1_Change() Dim MyVar1 As Variant ※・・・(省略)・・・ MyVar2~13 As Variant※ Dim MyVar14 As Variant Dim MyVar20 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ※・・・(省略)・・・ B列からN列まで※ MyVar15 = Sheets("商品リスト").Range("O3:O" & Range("O3").End(xlDown).Row) MyVar20 = Sheets("商品リスト").Range("P2:P11") Select Case ComboBox1.ListIndex Case 0 With ComboBox2 .List() = MyVar2 End With ※・・・(省略)・・・ Case1~ Case12 ※ Case 13 With ComboBox2 .List() = MyVar15 End With End Select End Sub

  • VBAエラー '1004' について

    VBA初心者です。 下のプログラムの★部分で 「実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです。」 というエラーが発生します。 どなたか原因を教えていただけないでしょうか?? Dim aRange As Range Dim bRange As Range Set aRange = Range(Sheets("シートA").Range("A3"), Sheets("シートB").Range("A3").End(xlDown)) ★ Set bRange = Range(Sheets("シートB").Range("A3"), Sheets("シートB").Range("A3").End(xlDown)) 下のシートBの範囲取得と同じことをしているつもりなのですが、うまくいきません。 どうぞよろしくお願い致します。

  • Match関数がうまく機能していない??

    すみません。また教えて下さい。 過去ログを見てシート1にあったデータをシート4にあるデータと照らし合わせてすでにあれば書き換え、なければ追加というようにできるようにしたく過去ログを参考にしてやったのですが、どうしてもエラーが出てしまいます。 Private Sub aa() Dim intlastrow1 As Integer Dim strb As String Dim longlastrow1 As Long intlastrow1 = Sheets(1).Range("A7").End(xlDown).Row longlastrow1 = Sheets(4).Range("A1").End(xlDown).Row Dim c As Object Dim rtn As Variant Dim d As Integer With Sheets(4) .Select For Each c In .Range("A1", "A" & longlastrow1) rtn = Application.Match(c.Value, Sheets(1).Range("A7:A" & intlastrow1), 0) d = c.Row strb = Cells(d, "A").Value If IsError(rtn) Then With Sheets(4).Cells(longlastrow1 + 1, "A") .Value = strb With .Font .Name = "MS Pゴシック" .Bold = False .Size = 8 End With End With Sheets(4).Cells(longlastrow1 + 1, "B").Value = Sheets(1).Range("A2").Value Sheets(4).Cells(longlastrow1 + 1, "F").Value = ShowFormula(Sheet1.Range(Cells(d, "J"), Cells(d, "N"))) longlastrow1 = longlastrow1 + 1 End If If Not IsError(rtn) Then Exit Sub End If Next c End With End Sub 以上のように組んだのですがうまくいきません。 具体的に言うとシート1のA7よりしたに名前が並んでいる(山田、鈴木・・・)とお考え下さい(シート4のA2以下にも同様に名前が並んでいる)。字数の関係で判定後の処理が不十分になっています。

  • Excel VBA 貼付先のコントロール?

    御世話になります。 色々調べて下記の構文が出来たのですが、あと一歩が足りません。 製造シートのA列のデータを抽出シートのRtmが代入されたセルの上から7行目以下に貼付たいのです。 宜しくお願い致します。 Sub sappri() Dim nTotal, i Dim Rtm As Variant nTotal = Sheets("製造データ").Range("A1").End(xlDown).Row Rtm = Sheets("製造データ").Range("J1") With Sheets("抽出") For i = 1 To nTotal .Cells(i * 3 - 2, Rtm).Value = Sheets("製造データ").Cells(i, 1).Value Next i End With End Sub

  • エクセルVBAコンボボックスについて

    リスト欄のセルA3から下方向に大分類(A16まで14種類)があります。 コンボボックス1に大分類をリスト化して選べるようにしたいと思っています。 しかし、(1)のようにVBAを記入して、マクロを実行すると、コンボボックス1には、 大分類で14個あるリストの4つしか出てきません。 -(1)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ------------------------------------------------------------------ (2)のように記述してマクロを実行すると、コンボボックス1には、14個全てが表示されます。 -(2)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A16") ------------------------------------------------------------------ 原因がわかる方、いらっしゃいませんか? 出来れば、リスト欄のA列は14個よりも増える可能性があるので、Range("A3:A" & Range("A3") .End(xlDown).Row)のような範囲の指定がしたいです。 なお、リストシートのA3を選択して、「Ctrl+↓」でA16が選択されました。

  • アドバンスフィルターについて

    住所録を管理できるシステムを作っています。 2番目のシートを検索&結果表示のシート、3番目~10番目のシートにはユーザーフォームを使ってデータを入力して蓄積していくシートとしています。 検索はアドバンスフィルターを使っています。 Dim Rng As Range Dim cRng As Range Dim sh As Variant With Sheets(2).Select.Range("A13:L10000").ClearContents For Each sh In Array(Sheets(3), Sheets(4), Sheets(5), Sheets(6), Sheets(7), Sheets(8), Sheets(9), Sheets(10)) Set cRng = .Range("A65536").End(xlUp).Offset(1) If cRng.Row < 13 Then Set cRng = .Range("A13") End If sh.Range("A2:L3002").AdvancedFilterAction:=xlFilterCopy, _ CriteriaRange:=.Range("A6:L7"), CopyToRange:=cRng, _ Unique:=False cRng.Resize(, 17).Clear Next sh End With End Sub このマクロでは、ユーザーフォームを使って入力していったデータを検索することはできるのですが、他のエクセルシートからデータをコピー&ペーストしたり、直接入力をすると検索できません。 何が原因なのでしょうか。教えてください。

  • 空白行の削除マクロについてご教示ください

    空白行の削除に、下記マクロを活用させていただいていますが、 見た目空白なのに削除されない行が時々残ってしまいます。 削除されなかったセルを「Deleteキー」で空白にするとマクロが 実行され、きちんと削除されます。 こういった、スペースか何かが入っていても、見た目空白なら 削除するようにはできないでしょうか。 どなたかよろしくお願いいたします。 Sub 削除() Dim c As Range Dim 開始行 As Long Dim 最終行 As Long 開始行 = 5 最終行 = Range("a5000").End(xlUp).Row For Each c In Range("a" & 開始行 & ":a" & 最終行) If c.Value = "" Then Rows(c.Row).Delete End If Next End Sub

  • エクセルVBAマクロの質問です。

    マクロ初心者です。行き詰まってます。 sheet1には300件程度のデータがあります。 このデータの3列目の値を、VLOOKUPでsheet3のA1:B30範囲から参照します。そこで取得した回数分、sheet1の各行のデータをsheet2にコピーしたいんです。 そこで、コード文を作ってみましたが、マクロがうまく動きません。 すみませんが、お知恵を貸していただけないでしょうか? Dim Z as Long Dim L As Long Dim P As Long Dim Kensaku As String Dim M4 As Range Dim PRow As Long Dim i As Long Set M4 =Sheets(“sheet3”).Range(“A1:B30“) L = Sheets(“sheet1”).Range(“A1”).End(xlup).Row For Z = 1 to L-1 Kensaku = Sheets(“sheet1”).Cells(Z+1,3).Value P=Worksheetfunction.Vlookup(Kensaku,M4,2,False)    For i = 1 to P      Prow=Sheets(“sheet2”).Range("A1").End(xlDown).Row      Sheets(“sheet1”).Rows(Z+1).Copy Sheets(“sheet2”).Rows(Prow)    Nexti Next Z

専門家に質問してみよう