特定条件合致行削除の方法を教えてください
- 特定の条件に合致した行を削除する方法について教えてください。
- Excelの特定の範囲に含まれる特定の条件に合致した行を削除する処理を実行したいです。
- 条件に合致する行を削除するためのVBAの処理方法を教えてください。
- ベストアンサー
特定列を削除したい
以下の同じフォルダに入った条件の合致したセルがある行を削除したいのです が色々検索しても下の処理にあてはまるようなものが見つかりませんでした。 どなたかお助けしていただけないでしょうか? お願いします。 特定条件合致行削除() Dim path$, wb As Workbook, wbName$ Dim ws As Worksheet, I& path = ThisWorkbook.path & "\" wbName = Dir(path & "*.xls") Do Until wbName = "" If wbName <> ThisWorkbook.Name Then Set wb = Workbooks.Open(path & wbName) = 2 For Each ws In wb.Worksheets ##################################################################### With ws この部分に特定範囲の中に条件(3つ)が含まれる行を削除する処理 を実行させたい。 I = I + 1 End With ###################################################################### Next DoEvents wb.Save End If wbName = Dir Loop Set wb = Nothing Set ws = Nothing MsgBox "第三処理が完了しました。処理完了です。", vbInformation, "処理確認" End Sub
- junichihirobe
- お礼率43% (25/57)
- オフィス系ソフト
- 回答数6
- ありがとう数0
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 > 範囲指定のことでとまります。 > >For nRow = .UsedRange.Rows.Count To 1 Step -1 > > .Rows(nRow & ":" & nRow).Select > > このような範囲指定だと、とまってしまうようで・・。 どの様なエラーが出ていますか? コードを入れた場所を確認してください。 質問で提示されたソースの > この部分に特定範囲の中に条件(3つ)が含まれる行を削除する処理 > を実行させたい。 の、部分をコードで置き換えるつもりで作ってあります。 「With ws」等が消されているのでは無いでしょうか?
その他の回答 (5)
- mt2008
- ベストアンサー率52% (885/1701)
No.1です。 > If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete 「行削除」なら .EntireRow.Delete ですよ。 ただし、そこを直しても動きません。 削除の場合、削除によってアドレスが変わりますので、条件付書式を指定範囲全体に適用するようなわけにはいきません。 「下から上に行を見て行き、該当するなら削除」が基本です。 時間が無いのでその物ずばりのコードは提示できませんが、No.1で私が回答したコードを見て、ループを回す範囲を5000~2行に固定。「全ての条件を満たしたら」→「1つでも条件を満たしたら」の変更で可能です。
- rivoisu
- ベストアンサー率36% (97/264)
別に揚げ足とり言ってるわけではありません。 コードをみるととてもマクロの自動記録とは思えません。 それなりに経験があるだろうと思うのに変数宣言が変な癖のついた表記だったので気になったので「苦言」を書いただけです。 きちんと Dim path as string dim wb As Workbook dim wbName as string Dim ws As Worksheet dim I as integer コードは未来の自分と他人が読むものですから読みやすいように書きましょう もしあなたが言われるとおり自動記録にちょっと手直しした程度といわれるならこのコードはどこからか拾ってきたものがベースになっていると想像するのです。 だとしたらそのコードの意味を十分にりかいしようとせずに「これで動いたからこれでいい」というつもりなら多少の回答やアドバイスでは何にもならないと思います。 この部分はちゃんと動きますか? Set wb = Workbooks.Open(path & wbName) = 2 さて行を削除する方法はいろいろありますが 手動でやるのと同じようにその行の1行下からい最後までをCutして、その行にPasteするという方法があります。 見つけたセルをDCELLとするとデータが10列までとすると 件数=cells(1,1),.End(xlDown).row 'データの最後の行の行番号を取得 range(cells(DCELL.row+1、10),cells(件数,10)).cut 見つけた行の次の行から最後の行までカット cells(DCELL.row,1).Paste '見つけた行に貼り付け これを条件が成立したときに実行すればいいと思います。
補足
うまく行かなかったのは、削除の部分です。 経験・・・まったくないです。 以前質問して回答いただいたものを活用しています。 同じような処理(同じフォルダの複数ブックの複数シートに対する) が多いので重宝して活用させていただいているだけです。 なので変数宣言とかまったくわからないです。 なんとなく動けば、こういうことねって意味がわかる程度です。 マクロで記録したので 行削除の部分です。 他に色々さがして With ws .Range("a:t").Select If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete ElseIf .Range("a:t") Like "*01301*" Then .EntireColumn.Delete >Set wb = Workbooks.Open(path & wbName) > = 2 End If End With を見つけてみましたが、やはりうまく行かないです。 ファイル数が多いので自動でやりたいんですが・・。 今までいろんな処理で活用してますのでちゃんと動きます。 コードに対しての発言はコードを作成した人ではないので・・。 私としては作成した人に申し訳ないです。 こんな言われようされて・・・。
- imogasi
- ベストアンサー率27% (4737/17068)
表題(列)と中身(行削除)が一致しないな質問がいい加減だ。 >下の処理にあてはまるようなものが見つかりませんでした WEBを検索したのだろうが、そっくりのコードは見つからないだろう。 しかし中身的に、このコーナーでも何度も質問に出ているるものだ。 また下記(1)(2)のコードはWEBで多数ヒットするはず。 (1)あるフォルダの全てのエクセルブック(名)を順次捕まえる。 その名前でブックを開く。(2)(3)の処理後保存して閉じる。 (2)あるブックの全シート(名)を順次捕まえる。 (3)行削除は最終行から、条件を判定し、合致すれば削除するのがミスが少ない。 (1)(2)ともForEachで処理できる。 (1)は「Googoleで「フォルダ 全てのブック」で照会すればコードが出てくる。 http://q.hatena.ne.jp/1211998240 など多数。Dir関数利用でよかろう。 (2)など Sub test01() For Each sh In Worksheets MsgBox sh.Name Next End Sub でしまい。 ーーー やり方全般について、(1)(2)(3)にそれぞれ分けて、コードを書き、テストする。 そして入れ子にするやり方が、初心者が取るべき方法ではないか。 (1)(2)(3)それぞれで、疑問点を絞れるまで質問者がやってみて質問のこと。 この質問では丸投げに近い。 削除条件も、具体的に書いてないが、ものによっては、コード化にてこずるのではないか。
補足
あの揚げ足取りならコメントしないで下さい。 こちらはマクロの記録などして、そのコードを 色々変えてみて試したけど、うまくできない結果 お願いしてるわけで丸投げといわれてもね・・。 このアドバイスはこちらはわかってることを 繰り返してるだけで意味なし・・・。
- rivoisu
- ベストアンサー率36% (97/264)
タイトルが”特定列を削除したい” 1行目が”セルがある行を削除したいのです” よくわかりません。 提示してあるコードではコードがあるブックのフォルダー内のすべてのExcelファイルのすべてのシートに対して処理をするという意味でしょう この処理があってるかどうかは疑問がありますが 質問は 条件に合った行を削除するにはどうしたらいいか ということでしょうか それとも提示してあるコードがやってみたけど動作がおかしいということでしょうか だったら余計なコードは回答するほうは読みやすいです。 最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。
補足
そうです。 条件にあった行を削除したいんです。 >最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。 そういうのまったくわからないから質問してるんですけど・・。 回答を提示してくれて、質問はこういう意味とか 言ってくれる方がありがたいです。 結構質問の揚げ足取る人多いですよね。
- mt2008
- ベストアンサー率52% (885/1701)
かなり適当ですが、こんな感じでしょうか。 最終行から上に1行づつ見て行き、条件が3つともあった場合、その行を削除します。 'シートをアクティブに .Activate '行を下から上に検索 For nRow = .UsedRange.Rows.Count To 1 Step -1 .Rows(nRow & ":" & nRow).Select '条件を以下の3つと仮定 aTarget = Array("100", "200", "300") For Each A In aTarget Set FindCell = Selection.Find(What:=A) If FindCell Is Nothing Then Exit For Next If Not FindCell Is Nothing Then 条件を全て満たす行を削除 Selection.Delete Shift:=xlUp End If Next nRow 画面のチラつきを押さえるためにも Application.ScreenUpdating = False も仕掛けた方が良いかと思います。
補足
ありがとうございます。 質問がわかりずらくて申し訳ありません。 条件が3つともではなく、3つあってそれぞれ一致したら その行を削除したいんです。 マクロの記録とかで色々やってみたんですが、どうも 範囲指定のことでとまります。 >For nRow = .UsedRange.Rows.Count To 1 Step -1 > .Rows(nRow & ":" & nRow).Select このような範囲指定だと、とまってしまうようで・・。 Range("範囲”).(この部分で処理指定なのかな?) 同じ感じで########の中を With ws .Select .Range("A2:AC5000").FormatConditions.Delete .Range("A2:AC5000").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF($A1:$AC1,""*集計"")" .Range("A2:AC5000").FormatConditions(1).Interior.ColorIndex = 35 .Range("A2:AC5000").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF($A1:$AC1,""総計"")" .Range("A2:AC5000").FormatConditions(2).Interior.ColorIndex = 36 I = I + 1 End With のようなコードだとうまく行ったんですが・・。 条件の行に色をつける処理です。 こんな感じで条件にあった行を削除することは できないのでしょうか? あるフォルダにある、複数ブックの複数シートに 対してです。 > Application.ScreenUpdating = False はエラーを発見したいのでわざと入れてません。 よろしくお願いします。
関連するQ&A
- 列の追加と削除マクロ
csvを取り込んで、列の追加と削除をしたいですが、 エラーになってしまい、マクロがうまく動きません。 ■マクロでやりたいこと ・M、O、P列を削除する ・AO、AQ列の間に列を挿入 列名を「企画ID(廃止)」とする ■エラー内容 実行時エラー 「オーバーフローしました」というエラーがでる 下記がvb構文になります。 どなたかご回答お願いします。 =========================================================================================================================== ' ' CSVファイルの読込を行う ' '=========================================================================================================================== Function ReadCSV(filename As String) As Boolean Dim hanbaiwaku_wb As Workbook Dim hanbaiwaku_ws As Worksheet Dim wbk As Workbook Dim fname As String Dim endrow As Long Dim openflg As Boolean Dim i As Integer '画面の更新などを行なわない様にする SetScreenState (False) '処理中メッセージを表示する UserForm1.Show vbModeless UserForm1.Repaint '選択されたkowaku.csvファイルを開く Set hanbaiwaku_wb = Workbooks.Open(filename, ReadOnly:=True) Set hanbaiwaku_ws = hanbaiwaku_wb.Sheets(1) '最終行を取得する endrow = CLng(hanbaiwaku_ws.Range("A1").End(xlDown).Row) '2行目から最終行までループ(1行目は見出しの為、飛ばす) For i = 2 To endrow hanbaiwaku_ws.Range("A" & i).Value = SubstitutionStatus(kowaku_ws.Range("A" & i).Value) Next '処理中メッセージを削除する Unload UserForm1 'ファイル検索用のファイル名を設定する fname = ThisWorkbook.Path & "\変換済み_" & hanbaiwaku_wb.Name 'ファイルが開かれている場合、上書きが出来ない為、ブックが開かれているか調べる For Each wbk In Workbooks '同一名称のブックがある場合、処理を抜ける If wbk.Name = Dir(fname) Then Exit For End If Next 'ブックが取得されなかった場合 If wbk Is Nothing Then '変換後の内容を別名で保存する hanbaiwaku_wb.SaveAs filename:=fname openflg = True 'ブックの取得が行われていた場合 Else 'ブックの名称とファイル検索用のファイル名を比較し、 '同一であった場合、ファイルが開かれていると判定し、メッセージを表示する。 If wbk.Name = Dir(fname) Then MsgBox (Dir(fname) & "が開かれている為、保存する事が出来ません。ブックを閉じてください。") openflg = False 'ブックの名称が比較用文字列と異なる場合 Else '変換後の内容を別名で保存する hanbaiwaku_wb.SaveAs filename:="変換済み_" & hanbaiwaku_wb.Name openflg = True End If End If 'kowaku.csvを閉じる hanbaiwaku_wb.Close '解放処理 Set hanbaiwaku_wb = Nothing Set hanbaiwaku_ws = Nothing '画面の更新などを行う様にする SetScreenState (True) '処理結果を返す ReadCSV = openflg End Function '=========================================================================================================================== ' ' 不要な列の削除を行う ' 13.15.16列の削除を行う ' '=========================================================================================================================== Function SubstitutionStatus(txt As String) Sub prcDeleteRows() '列を削除します Columns("13:13,15:16").Delete Shift:=xlToLeft '列を追加します Sub 列追加() ' ' 列追加 Macro' Columns("AP:AP").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Range("AP1").Select ActiveCell.FormulaR1C1 = "企画ID(廃止)" ActiveCell.Characters(1, 2).PhoneticCharacters = "キカク" ActiveCell.Characters(6, 2).PhoneticCharacters = "ハイシ" Range("AP2").Select End Function End If '結果を返す SubstitutionStatus = txt End Sub
- 締切済み
- Visual Basic
- 名前の定義の一括削除したいんです。
こんにちは。 先日、同一フォルダの複数ブックのワークシート名の変更とセルの幅の変更とセルへの色付けを教えていただきました。 そこから先に問題が発生して、毎月更新するファイルなので アクセスのクエリをエクスポートしていますが、エクスポート先の ブックに名前の定義が残っているため、ワークシート名を変更しても 前月のシートにデータを上書きしてしまいます。 なのでシートの名前の定義の削除を行いたいのですが、 Dim nm As Name For Each nm In Application.Names nm.Delete Next のコードを以前の質問から検索して使用してみましたが nm.Delete のところで名前が正しくありませんと出てしまいます。 アクセスでエクスポートしてエクセルに張り付いた名前の定義は VBAでは削除できないのでしょうか? 最終的には同一フォルダの複数ブックのワークシートの 名前の定義をVBAで一括削除したいんですが・・・。 試してみたコードは下です。 結果はシート名(2)にシート名が変更されて 名前の定義は削除されていませんでした。 シート名を変更しているのでシート名と名前の定義の名称は 違っています。 Dim N As Object にしても結果は同様でした。 マクロの記録ではWorkbook.Names("AAA").Delete になっていて定義の名前を指定しないとダメなのかなとか 思っていたりします・・。 度々で申し訳ないですが、お知恵を頂戴できないでしょうか? Dim path$, wb As Workbook, wbName$ Dim ws As Worksheet, i& Dim nCount As Long Dim sVal As String Dim n As Name path = ThisWorkbook.path & "\" wbName = Dir(path & "*.xls") Do Until wbName = "" If wbName <> ThisWorkbook.Name Then Set wb = Workbooks.Open(path & wbName) i = 2 Set ws = wb.Worksheets(wb.Sheets.Count) If Trim(ws.Range("T2") & "月") <> "" Then On Error Resume Next ws.Name = ws.Range("T2") & "月" nCount = 1 sVal = ws.Cells(1, nCount).Value Do While sVal <> "" ws.Columns(nCount).EntireColumn.AutoFit ws.Cells(1, nCount).Interior.ColorIndex = 15 nCount = nCount + 1 sVal = ws.Cells(1, nCount).Value for each n in wb.names n.delete next for each n in ws.names n.delete next Loop If Err.Number <> 0 Then ws.Name = ws.Range("T2") & "月" & " (" & i & ")" i = i + 1 End If On Error GoTo 0 End If DoEvents 'Next wb.Save wb.Close End If wbName = Dir Loop Set wb = Nothing Set ws = Nothing
- ベストアンサー
- オフィス系ソフト
- 複数のエクセルシートをまとめるマクロ
下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub
- ベストアンサー
- Excel(エクセル)
- VBAが止まります。
フォルダ内の全てのエクセルデータを一つにまとめたいのですが、 下記を実行すると、添付ファイルのメッセージが出て先に進みません。 調べましたがよくわかりませんので、ご教示いただけませんでしょうか。 画像の最上部の『'プログラム0|変数設定の指定Option Explicit』が欄外に はみだしていて直せません、こちらが原因でしょうか。 ------------------------------------------------------- 'プログラム1|プログラム開始 Sub GetExcelDataInFolder() 'プログラム2|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'プログラム3|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム4|対象フォルダを取得 Dim myfolder As Folder Set myfolder = fs.GetFolder(ThisWorkbook.Path) 'プログラム5|対象フォルダ内の全ファイルを処理 Dim myfile As File For Each myfile In myfolder.Files 'プログラム6|拡張子が「xlsx」のファイルのみを処理 If fs.GetExtensionName(myfile) = "xlsx" Then 'プログラム7|フォルダ内のエクセルを開いてシートを設定 Dim wb As Workbook Set wb = Workbooks.Open(Filename:=myfile) Dim ws2 As Worksheet Set ws2 = wb.Worksheets(1) 'プログラム8|開いたエクセルの最終行を取得 Dim cmax As Long cmax = ws2.Range("A65536").End(xlUp).Row Debug.Print myfile.Name & "のcmax=" & cmax 'プログラム9|開いたエクセルのデータを転記 Dim i As Long For i = 2 To cmax Dim cmax1 As Long cmax1 = ws1.Range("A65536").End(xlUp).Row ws1.Range("A" & cmax1 + 1 & ":E" & cmax1 + 1).Value = ws2.Range("A" & i & ":E" & i).Value Next 'プログラム10|エクセルを閉じる wb.Close 'プログラム11|オブジェクト解放 Set ws2 = Nothing Set wb = Nothing End If Next 'プログラム12|エクセルを保存 ThisWorkbook.Save 'プログラム13|オブジェクト解放 Set myfolder = Nothing Set fs = Nothing 'プログラム14|プログラム終了
- 締切済み
- Visual Basic
- VBAがとまります。
フォルダ内の全てのエクセルデータを一つにまとめたいのですが、 下記を実行すると、『実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。』のメッセージが出て先に進みません。対象のデータを開いて実行しても同様でした。 調べましたがよくわかりませんので、ご教示いただけませんでしょうか。 基本的なところかもしれませんが、よくわかりません。 どうぞよろしくお願いいたします。 ------------------------------------------------------- 'プログラム1|プログラム開始 Sub GetExcelDataInFolder() 'プログラム2|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'プログラム3|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム4|対象フォルダを取得 Dim myfolder As Folder Set myfolder = fs.GetFolder(ThisWorkbook.Path) 'プログラム5|対象フォルダ内の全ファイルを処理 Dim myfile As File For Each myfile In myfolder.Files 'プログラム6|拡張子が「xlsx」のファイルのみを処理 If fs.GetExtensionName(myfile) = "xlsx" Then 'プログラム7|フォルダ内のエクセルを開いてシートを設定 Dim wb As Workbook Set wb = Workbooks.Open(Filename:=myfile) Dim ws2 As Worksheet Set ws2 = wb.Worksheets(1) 'プログラム8|開いたエクセルの最終行を取得 Dim cmax As Long cmax = ws2.Range("A65536").End(xlUp).Row Debug.Print myfile.Name & "のcmax=" & cmax 'プログラム9|開いたエクセルのデータを転記 Dim i As Long For i = 2 To cmax Dim cmax1 As Long cmax1 = ws1.Range("A65536").End(xlUp).Row ws1.Range("A" & cmax1 + 1 & ":E" & cmax1 + 1).Value = ws2.Range("A" & i & ":E" & i).Value Next 'プログラム10|エクセルを閉じる wb.Close 'プログラム11|オブジェクト解放 Set ws2 = Nothing Set wb = Nothing End If Next 'プログラム12|エクセルを保存 ThisWorkbook.Save 'プログラム13|オブジェクト解放 Set myfolder = Nothing Set fs = Nothing 'プログラム14|プログラム終了
- 締切済み
- Visual Basic
- 複数シートを順番に範囲指定してソートしたい
以下のコードでアクセスからデータをエクスポート後に 複数(50くらい)シート名を変更し、シートを並び替えし、 列幅を整えています。 次にデータをソートしたいのですが、うまく範囲指定が できないで2日くらいすぎてしまいました。 以下の**でかこった部分で定義ができません。 どなたかお助けしていただけないでしょうか? よろしくお願いします。 うまく改行できないですいません・・。 **************************************************** h = 1 o = 29 ws.Columns(h & ":" & o).Select 範囲指定したいのはA列からAC列までのデータの入った 行数までです。 With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToUP)) **************************************************** Private Sub CommandButton1_Click() Dim path$, wb As Workbook, wbName$ Dim ws As Worksheet, i& Dim intLoopA As Integer Dim intLoopB As Integer Dim h As Long Dim o As Long path = ThisWorkbook.path & "\" wbName = Dir(path & "*.xls") Do Until wbName = "" If wbName <> ThisWorkbook.Name Then Set wb = Workbooks.Open(path & wbName) i = 2 For Each ws In wb.Worksheets If Trim(ws.Range("A2")) <> "" Then On Error Resume Next ws.Name = ws.Range("A2") If Err.Number <> 0 Then ws.Name = ws.Range("A2") & " (" & i & ")" i = i + 1 End If On Error GoTo 0 End If For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA With ws.Rows(1) With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToLeft)) .Interior.ColorIndex = 15 .EntireColumn.AutoFit End With End With h = 1 o = 29 ws.Columns(h & ":" & o).Select With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToUP)) .Sort _ Key1:=Range("G1"), Order1:=xlDescending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End With End With DoEvents Next wb.Save End If wbName = Dir Loop Set wb = Nothing Set ws = Nothing MsgBox "処理が完了しました。", vbInformation, "処理確認" End Sub
- 締切済み
- オフィス系ソフト
- エクセルVBAで、ある条件の時
お世話になります。 エクセルVBAで次のようなことをしたいのですが方法を教えてください。 formフォルダにあるすべてのファイルについて、A1セルが「0」でないとき、 A4:B7及びA9:B12の中で日付が入っている行の日付と内容を、ActiveWorksheetのB列、C列にレコードとして取り出したいのです。 (A列はナンバリングになります) --------formフォルダの中にあるブック--------- A B 1 23 2 3 日付 内容 'この行は固定です 4 5/13 あああ 5 5/17 いいい 6 7 8 日付 内容 'この行は固定です 9 5/16 ううう 10 5/12 えええ 11 12 5/10 おおお ---ThisWorkbook(前に助けていただいたコードです)--- Sub data_torikomi2() Dim wb As Workbook Dim Fn As String Dim myPath As String Dim dbBkSh As Worksheet Dim i As Long For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name And _ InStr(1, wb.FullName, "form\", 1) > 0 Then 'formを検索 wb.Close '閉じる End If Next wb myPath = ThisWorkbook.Path & "\" Set dbBkSh = ThisWorkbook.Worksheets("一覧表") Range("4:1000").Clear '全データ削除 Fn = Dir(myPath & "form\*.xls") i = 1 '画面のちらつきを抑える Application.ScreenUpdating = False Do Until Fn = "" If Fn <> ThisWorkbook.Name Then With Workbooks.Open(myPath & "form\" & Fn, , True) dbBkSh.Range("A3").Offset(i, 0).Value = i 【★たぶんこの部分に入るものです★】 .Close False i = i + 1 End With End If Fn = Dir() Loop Application.ScreenUpdating = True Set dbBkSh = Nothing End Sub ご教示よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 【エクセルVBA】特定のシートのみ検索したい
VBA勉強中です。 フォルダにある複数のファイル(1ファイル内には複数シートあります)を順番に開けて検索をかけ、条件に合致した行をあるファイルへ転記・集約させるマクロを組みたいと思っています。 (条件は1番左の列が「○」であることです。) ネットや本を参考にしながら組んでみたのですが、「○」がない(シートの)行も転記されてしまい困っています。 (○があるシートは複数シートの内、1シートのみなのですが、○がないシートからも 「○があるシートの○がある行」と同じ行番号の行がが転記されているようです) 組んでみたマクロは以下のとおりです。 ------------------------------------------------ Sub 楕円1_Click() ActiveSheet.Range("A2:H30").ClearContents Dim ans, fn, wb, x, i, n, sh, myPath ans = "○" '条件 myPath = ThisWorkbook.Path & "\" fn = Dir(myPath & "*.xls") '選択したフォルダ内のExcelファイル Do Until fn = "" If fn <> ThisWorkbook.Name Then 'ファイルが当ファイル以外なら Set wb = Workbooks.Open(myPath & fn) '選択したファイルを開きます For Each sh In wb.Worksheets '各シートごとに x = sh.Cells(Rows.Count, 1).End(xlUp).Row '最終行取得 For i = 1 To x '1行目から最終行まで以下を実行します If Cells(i, 1) = ans Then '条件に合致するか検索 n = n + 1 With ThisWorkbook.Sheets("Sheet1") '転記 .Cells(n + 1, 1) = sh.Cells(i, "B") .Cells(n + 1, 2) = sh.Cells(i, "C") .Cells(n + 1, 3) = sh.Cells(i, "D") .Cells(n + 1, 4) = sh.Cells(i, "E") .Cells(n + 1, 5) = sh.Cells(i, "F") End With End If Next i Next sh wb.Close (False) '選択したファイルを閉じる End If fn = Dir() '次のファイルを検索 Set wb = Nothing Loop '繰り返し --------------------------------------------------------- このマクロでは各ファイルの全てのシートを検索していると思うのですが、 全シートを検索していることが問題でしょうか? 検索したいデータは特定のシートにのみ存在するので(全ファイル同じ名前のシートです) 特定のシートのみ検索してくれればそれで良いのですがどう変更すればよいかわかりません。 「For Each sh In wb.Worksheets '各シートごとに」 色々と調べてここを変更してみたのですが 何れもエラーとなり上手くいきませんでした。 どなたか上手く直す方法を教えて下さい。 宜しくお願いします。
- 締切済み
- Windows XP
- 【VBA】複数のブックを1つのシートにまとめる
あるフォルダ内に複数のブックが入っており、新しいブックに1シートでまとめようとしております。 フィルターを使用すればよいのかもしれませんが、マクロを使用したいです。 (1)全て同じフォーマットである (2)全てA17から数値が入力されているので、16行目まではフォーマットを残し、A17行目以降K列までをコピーして結合したい Sub 結合() '結合したいファイルがあるフォルダの場所 cドライブなら "C:\test\" Const Fol As String = "C:\test\" Dim Fn Dim NewFile As Workbook Dim Wb As Workbook Dim Ws1 As Worksheet Dim R As Range Set NewFile = Workbooks.Add Set Ws1 = NewFile.Worksheets(1) Set R = Ws1.Range("A17") Fn = Dir(Fol, vbNormal) Do Until Fn = "" Set Wb = Workbooks.Open(Fol & Fn) 'ワークシート1をコピーする場合は Wb.Worksheets(1) Set Ws1 = Wb.Worksheets(1) 'タイトル行を設定 If ck = False Then For cnt = 1 To 4 Wb.Worksheets(cnt).Range("A1:J16").Copy Destination:=NewFile.Worksheets(cnt).Range("A1") Next cnt ck = True End If For cnt = 1 To 4 Set Ws1 = NewFile.Worksheets(cnt) Set Ws2 = Wb.Worksheets(cnt) R = Ws1.Cells(Rows.Count, 1).End(xlUp).Row + 1 With Ws2 End With Next 'A17行目からコピーして結合する(→本当はA17行目~K列までを反映したい) Ws2.Range("A17", Ws2.Cells(Rows.Count, 3).End(xlUp)).Resize(, 20).Copy R If R.Offset(1).Value = "" Then Set R = R.Offset(1) Else Set R = R.End(xlDown).Offset(1) End If Wb.Close 'Debug.Print Fn Fn = Dir Loop Set R = Nothing Set Ws1 = Nothing: Set Ws2 = Nothing Set Wb = Nothing: Set NewFile = Nothing End Sub マクロは触ったことない初心者でグーグル検索をしながら作ってみました。 一応実行するとエラーは出ないのですが、結合されたリストが飛び飛びで、理由がわかりません。 どなたかおわかりになりますでしょうか・・・。
- ベストアンサー
- Visual Basic
- 最終セルまでデータを反映させるマクロ
あるサイトからの利用コードです。 それをアレンジしようとしましたが、つまずきました。 マクロコードをご教示ください。 あるフォルダに複数のエクセルファイルがあります。 構成が同じシート(名前は同じ。仮に "各シート")を、 別ブック(仮に "まとめ")の一つのシートに纏めます。 その時、複数ファイルの D4のデータだけは "まとめ"ブックのL列に反映させたいのですが、 下記コードを使用すると、どこにどのようなコードを入れたら良いのでしょうか? 因みに複数ファイルの8行目からコピーされ、 複数ファイルのCからM列は まとめブックのAからK列に反映されるようになってます。 (まとめブックの1行目は見出し) Dim i As Integer Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long Set WS2 = Sheets("まとめ") strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Sheets("各シート") With WS1.Range("C7") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 11).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With _____ここで つまずく_____ With WS1.Range("D4") .Copy WS2.Range("L" & WS2.Rows.Count).End(xlUp).Offset(1) WS2.Range("L" & WS2.Rows.Count).End(xlUp).AutoFill Destination = Range("E1048576").End(xlUp).Row _____ここまで つまずく_____ WB1.Close False End If strFileName = Dir Loop End Sub エクセル2013です。 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
補足
ありがとうございます。 今は With ws Range("a:t").Select If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete ElseIf .Range("a:t") Like "*01301*" Then .EntireColumn.Delete Next End With のところのIf .Range("a:t") Like "*01187*" Then .EntireColumn.Delete の.Rangeでとまります。 コンパイルエラー メソッドまたはデータメンバが見つかりませんとなります。 色々試していて、ころころコードが変わって申し訳ありません。 お手数をおかけします。