- ベストアンサー
VBA Excel処理の追加を2点教えてください
Office2003(SP3) 以下は、昔、教えてもらったExcel VBAスクリプトで、よく使わせて もらってます。「C:\mybooks\」にあるxlsファイル(a001.xls、a002.xls、 a003.xls・・・・)を片っ端から開き、 1つのBookに束ねる動作をします。 これだけでも大変便利なのですが、もう少し改善いたしたく。 (1) 束ねられたBookのSheet名が、Sheet1、Sheet1 (2)、Sheet1 (3)、 Sheet1 (4)・・・ になってしまいます。そこで、ファイル名から拡張子を落 とした文字列をSheet名にセットする記述をご教示下さい。 (2) a001.xls、a002.xls、a003.xls・・・は、それぞれSheet1、Sheet2、 Sheet3を含みます。Sheet1だけが抜き取られてSheet2、Sheet3が残された大量 の残骸Bookが開きっぱなしになります。これら、保存せずに閉じる記述を追加 したいのですが。 よろしくお願い致します。 Sub OpenFiles() Dim i As Integer Dim wb As Workbook Dim fname Dim dirname As String ' i = 1 dirname = "C:\mybooks\" fname = Dir(dirname + "*.htm") If fname <> "" Then Do While fname <> "" If fname <> "." And fname <> ".." Then If i = 1 Then ' 最初のファイルを開く Workbooks.OpenText FileName:=dirname + fname Set wb = ActiveWorkbook ' 最初のファイルを新規ブックに複製して閉じる。 ActiveSheet.Copy wb.Close Set wb = ActiveWorkbook Else ' 2番目以降のファイルは複製した最初のファイルに追加 Workbooks.OpenText FileName:=dirname + fname ActiveSheet.Move After:=wb.Worksheets(wb.Worksheets.Count) End If i = i + 1 End If fname = Dir Loop Else MsgBox "検索条件を満たすファイルはありません。" End If Set wb = Nothing End Sub
- litton101
- お礼率89% (1106/1240)
- Visual Basic
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでいいのでは Sub GetSheets() Dim sName As String, sDir As String, n As Integer Dim wb As Workbook, w As Workbook Dim ws As Worksheet Dim bflag As Boolean sDir = "c:\mybooks\" sName = Dir(sDir & "a*.htm") ' 画面の更新の抑止 Application.ScreenUpdating = False While sName <> "" ' 取得ファイル名のブックを開く Application.OpenText FileName:= sDir & sName Set w = ActiveWorkbook Set ws = w.Sheets("Sheet1") ' Sheet1の名前を変更 ws.Name = Replace(sName, ".xls", "") If wb Is Nothing Then ' まとめるためのブックを追加 Set wb = Workbooks.Add bflag = True End If ' 対象シートをコピー ws.Copy after:=wb.Worksheets(wb.Worksheets.Count) ' アラートの抑止 Application.DisplayAlerts = False If bflag Then ' 新規ブックの Sheet1,Sheet2,Sheet3を削除 For n = wb.Worksheets.Count To 1 Step -1 If Left$(wb.Worksheets(n).Name, 5) = "Sheet" Then wb.Worksheets(n).Delete End If Next End If ' 開いたブックを閉じる w.Close ' アラートの抑止の解除 Application.DisplayAlerts = True Set ws = Nothing Set w = Nothing sName = Dir Wend ' 画面更新の抑止を解除 Application.ScreenUpdating = True End Sub # 字下げには全角スペースを使用しています
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
Application.OpenText は間違えですね Workbooks.OpenTextです 投稿する際にコメントなどを追加したときに何かを間違えたのだと思います 大変失礼しました m(__)m
お礼
redfox63さん、フォローありがとうございました。 ばっちり動きました、大変作業がはかどります、ありがとうございます。
- Sinogi
- ベストアンサー率27% (72/260)
まずは希望動作のマクロ記録をとりましょう。 シート名の変更に関するコード ファイルを閉じるコードがすぐにわかるので現コードでループしているうちのどこに入れたらいいか考えましょう。 手作業でする順番を考えればすぐにわかりますよ
お礼
御礼遅くなってすみません。 アドバイスありがとうございました。 記録をとってみたのですが ファイルを閉じると記録したものも全て吹っ飛んでしまい、 そこで挫折しかけていました、、、 地道に研究してみます。ありがとうございます。
関連するQ&A
- VBAでご相談です!
Excel2010使用。 VBA初心者です。 VBAでご相談させて下さい。 複数のファイルを1つにまとめる 作業をしたいと思い、ググったところ あるサイトで下記のコードを見つけました。 ただ、このコードでは、ファイルをダイアログから 選択する形になります。 これを、ファイルを指定した状態で実行させたいと思い、 自分で試してみたのですが、上手くいきませんでした。 同一フォルダ内には4つのファイルがあり、全て同じ様式の シートが複数あります。ただ、フォルダ名が毎月変更になります。 この同一フォルダ内のデータの中の特定のシートを一つのシートに まとめたいと考えているのですが、可能でしょうか? 可能であれば、アドバイスいただけるとありがたいです。 Sub sample() Dim myPath As String Dim wb_A As Workbook, wb_B As Workbook Dim i As Long, s As Long myPath = Application.GetOpenFilename(("Excel ファイル (*.xls), *.xls"), , "データを蓄積するブックを選択して下さい。") If myPath = "False" Then Exit Sub Set wb_A = Workbooks.Open(myPath) myPath = Application.GetOpenFilename(("Excel ファイル (*.xls), *.xls"), , "データを取得するブックを選択して下さい。") If myPath = "False" Then Exit Sub Set wb_B = Workbooks.Open(myPath) With wb_B For i = 1 To .Worksheets.Count 'wb_Bループ For s = 1 To wb_A.Worksheets.Count 'wb_Aループ '同じ名前のシートがあるとき データコピー If .Worksheets(i).Name = wb_A.Worksheets(s).Name Then .Worksheets(i).Range("A1").CurrentRegion.Copy _ wb_A.Worksheets(i).Range("A65536").End(xlUp).Offset(1) Exit For End If '同じ名前のシートが無いとき シートコピー If s = wb_A.Worksheets.Count Then .Worksheets(i).Copy Before:=wb_A.Sheets(1) End If Next s Next i wb_B.Close False MsgBox "完了" End With End Sub ※長文、説明下手で申し訳ありませんが よろしくお願いします。 <参考URL> http://www.excel.studio-kazu.jp/kw/20040709212700.html
- ベストアンサー
- その他MS Office製品
- VBAで質問です
下記のVBAを作成しました。 ダイアログからtxtファイルをエクセルで開きます。 ここで作成されたシートを別のブックの「ログ」というシートに貼り付けたいのです。 宜しくお願いします。 ・txtファイルは日付が入る為、毎回違う名前になります。 ・ Private Sub CommandButton4_Click() Dim fname As String fname = Application.GetOpenFilename( _ filefilter:="Excelファイル,*.xls,すべてのファイル,*.*") If fname = "false" Then Exit Sub Workbooks.OpenText Filename:=fname
- 締切済み
- Visual Basic
- 「 VBA の 宣言 」 がない場合の問題点は ?
下記例で、 「 宣言 」 なしでも、現在のところ、問題は発生してませんが、 今後、「 宣言 」 がなかった場合の 「 問題点の例 」 を教えて下さいませ。 ------------------------------- Sub ブックA*の全シートをコピー() Dim Wb As Workbook '宣言 For Each Wb In Workbooks If Wb.Name Like "ブックA*.xls" Then With Workbooks("ブックB.xls") Wb.Worksheets _ .Copy after:=.Sheets(.Sheets.Count) End With End If Next Worksheets(Worksheets.Count).Activate MsgBox ActiveSheet.Index Worksheets("Sheet1").Select End Sub
- ベストアンサー
- オフィス系ソフト
- エクセルVBA ブック間のコピー
選択したテキストファイルをエクセルで開いたコピーし、 もう一つ開いたエクセルファイルにペーストするというマクロをVBAで 作成していますが、つまずいてしまいました。 ----------------------------------- Dim wb1 As String Dim wb2 As String Sub Opentxt() wb1 = Application.GetOpenFilename("テキストファイル,*.txt") If wb1 <> "False" Then Workbooks.OpenText Filename:=wb1, DataType:=xlDelimited, comma:=True End If End Sub Sub Copy() Dim LastRow As Long wb2 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If wb2 <> "False" Then Workbooks.Open wb2 LastRow = wb2.Sheets("一覧表").Range("A" & Rows.Count). End(xlUp).Row wb2.Sheets("一覧表").Range("A5:A" & lastRow).Copy _ wb1.Sheets("Sheet1).Range("B33") End If End Sub ----------------------------------- Opentxtの方は問題ないですが、Copyの方を実行すると wb1とwb2で引っかかって「コンパイルエラー/ 修飾子が不正です」と 表示されて、エラーになってしまいます。 この場合変数の型などがおかしいのでしょうか? excel2007を使用しています。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- エクセルVBAでBOOKを開く際の処理
エクセルVBAでBOOKを開く際の処理 エクセル2000です。 VBAで特定のフォルダー内のBOOKを開き、1枚目のシートSheets(1)のデータを読み込んで別BOOK(マクロを記載したBOOK)にコピペしたら保存せず閉じるコードを下記のように書きました。(かなり簡略化しましたが) これで作動するのですが、万一、そのフォルダー内のBOOKが開いていても1枚目のシートのデータを読み込み後、閉じられてしまいます。 BOOKが開いていれば、その開いていたBOOKは閉じず、先に進むようにするにはどのように直せばいいでしょうか? Sub TEST01() Dim mb As Workbook, wb As Workbook Dim myfd As String, fnme As String, ans As Byte, i As Long ans = MsgBox("集計用フォルダーには回収したアンケートファイルとこの集計用ファイルしかないですね?", vbYesNo + vbQuestion, "( ̄∇ ̄) ? ") If ans = vbNo Then MsgBox "それじゃだめです。", vbCritical, "Σ( ̄ロ ̄lll)" Exit Sub End If Set mb = ThisWorkbook myfd = mb.Path fnme = Dir(myfd & "\*.xls") Do Until fnme = Empty If fnme <> mb.Name Then Set wb = Workbooks.Open(myfd & "\" & fnme) i = i + 1 mb.Sheets(1).Cells(i, 1) = wb.Sheets(1).Range("S10") wb.Close (False) '保存せずに閉じる End If fnme = Dir Loop Set mb = Nothing Set wb = Nothing MsgBox i End Sub
- ベストアンサー
- その他MS Office製品
- エクセルVBAでファイル作成
エクセルVBAで、データをフィルタで抽出し、別なBOOKの指定シートに転記し、名前をつけて保存したいのです。一応、下記のコードでテストは成功しました。 しかし下記コードでは1回ごとにデータの転記先を開かなくてはなりません。 処理する件数が多いので、できればいちいち新たに開き直さなくともよい方法はないでしょうか? 最初から開いておいて、転記後名前をつけて保存すると、開いていたファイルが閉じてしまい、うまくいきません。 別BOOKでなく別シートに転記して、そのシートをMoveして別ファイル保存ならわかるのですが、今回はどうしても別BOOKに転記しなければなりません。 よろしくお願いします。 Option Explicit Sub データ分割転記() Dim myPth As String, fname As String Dim myRng As Range, myC As Range Dim i As Long, x As Long Dim wb(2) As Workbook Dim ws As Worksheet Dim t As Single t = Timer Set wb(0) = ThisWorkbook myPth = wb(0).Path With wb(0).Sheets("Key") Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData End With For Each myC In myRng Application.EnableEvents = False Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm") Set ws = wb(1).Sheets("List") With wb(0).Sheets("DATA") .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9") .ShowAllData End With With ws x = .Cells(Rows.Count, "A").End(xlUp).Row myC.Offset(, 2).Value = x '行数確認 .Range("A9").Value = 1 If x > 9 Then .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番 End If End With wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm" wb(1).Close (False) Application.EnableEvents = True i = i + 1 Next MsgBox i & "件を完了" _ & vbCrLf & Timer - t & " Sec." End Sub *Application.EnableEvents = False を使っているのば別BOOKが持つイベントマクロを作動させないためです。
- ベストアンサー
- Excel(エクセル)
- エクセルVBAで読み取りパスワード回避
エクセル2010です。 以下のコードで任意のフォルダ内のエクセルBOOKから所定のデータを取得できます。 しかし、指定フォルダ内に読み取りパスワードが設定されたものがあると、開くことができずに止まってしまいます。 読み取りパスワードが同一で、事前に分かっていればコードにPassword:="AAAABBBB" などと書き入れればいいと思うのですが、事前にはわかりませんし、パスワードもそれぞれ異なります。 そこで、開けなかった場合には、そのBOOKを飛ばしてすすみ、別シートに飛ばしたBOOK名を記録しておきたいのです。 (BOOK作成者にあとからパスワードを聞くため) しかし、残念ながらどのように書けばいいのか思いつきません。 ご指導いただければ幸いです。 Sub TEST001() Dim wb(1) As Workbook Dim ws(1) As Worksheet Dim myFdr As String, fn As String Dim i As Long With Application.FileDialog(msoFileDialogFolderPicker) 'フォルダ指定 If .Show = True Then myFdr = .SelectedItems(1) Else Exit Sub End If End With Application.ScreenUpdating = False '画面更新を一時停止 Set wb(0) = ThisWorkbook 'このコピー先ブックをwb(0)とする。 Set ws(0) = wb(0).Sheets(1) 'wb(0)の1枚目のシートをws(0)とする。 fn = Dir(myFdr & "\*.xls*") 'フォルダ内のExcelブックを検索 Do Until fn = Empty '全て検索 Application.EnableEvents = False Set wb(1) = Workbooks.Open(myFdr & "\" & fn, UpdateLinks:=False, ReadOnly:=True) 'そのブックを開きwb(1)とする。 Set ws(1) = wb(1).Worksheets(1) i = i + 1 ws(0).Cells(i, "A").Value = ws(1).Range("B2") 'ws(0)に転記 ws(0).Cells(i, "B").Value = wb(1).Name ws(0).Cells(i, "C").Value = ws(1).Name wb(1).Close (False) '保存せず閉じる Application.EnableEvents = True fn = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新停止を解除 MsgBox i & "個取得" End Sub
- ベストアンサー
- Excel(エクセル)
- vba, 複数ブックの同一セルに同一写真を挿入
エクセルVBAの初心者です。使っているのはExcel2007です。 同じフォルダの中にある連番の複数のエクセルファイルに同じ操作を繰り返すマクロを作っています。まず、複数ブックの同一セルに同じ内容の文字列を挿入することはどこかで見つけました。 Sub 複数Book同一セルに同一文字列入力() Dim fName As Variant Dim i As Long Dim WB As Workbook fName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xlsx", MultiSelect:=True) If IsArray(fName) Then For i = LBound(fName) To UBound(fName) Set WB = Workbooks.Open(fName(i)) WB.Worksheets(1).Range("A1").Value = "テスト" WB.Close SaveChanges:=True Next End If End Sub また、選択したセルに同じフォルダの中にある写真を挿入するマクロもどこかで拝見しました。 Sub AddPictureSampLinkPaste() Dim myFileName As String Dim myShape As Shape myFileName = ActiveWorkbook.Path & "\Koala.jpg" '--(1) 選択位置に画像ファイルを挿入し、変数myShapeに格納 Set myShape = ActiveSheet.Shapes.AddPicture( _ Filename:=myFileName, _ LinkToFile:=True, _ SaveWithDocument:=False, _ Left:=Selection.Left, _ Top:=Selection.Top, _ Width:=0, _ Height:=0) '--(2) 挿入した画像に対して元画像と同じ高さ・幅にする With myShape .ScaleHeight 1, msoTrue '数字は写真の高さの倍数 .ScaleWidth 1, msoTrue '数字は写真の幅の倍数 End With End Sub ここまではテストで問題なかったので、この二つのマクロを一つにまとめて、同じフォルダにある連番のエクセルブックの同一セルに同一写真を挿入するマクロを作ろうと下記のようにアレンジしましたが、なぜか写真はマクロを記入したブックのアクティブセルに連番のブックの数だけの写真が重なるように貼り付けられるだけで、標的のブックには写真が挿入できません。 Sub 複数Bookの同じ位置に同一写真挿入() Dim fName As Variant Dim i As Long Dim WB As Workbook Dim myFileName As String Dim myShape As Shape fName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xlsx", MultiSelect:=True) myFileName = ActiveWorkbook.Path & "\Koala.jpg" If IsArray(fName) Then For i = LBound(fName) To UBound(fName) Set WB = Workbooks.Open(fName(i)) Worksheets("Sheet1").Activate '--(1) 選択位置に画像ファイルを挿入し、変数myShapeに格納 Set myShape = ActiveSheet.Shapes.AddPicture( _ Filename:=myFileName, _ LinkToFile:=True, _ SaveWithDocument:=False, _ Left:=Selection.Left, _ Top:=Selection.Top, _ Width:=0, _ Height:=0) '--(2) 挿入した画像に対して元画像と同じ高さ・幅にする With myShape .ScaleHeight 1, msoTrue .ScaleWidth 1, msoTrue End With WB.Close SaveChanges:=True Next End If End Sub 本当にどこが間違っているか分からず、ここで質問いたします。初心者で分からないところばかりなので、どなたかやさしく教えていただけませんか?よろしくお願いいたします。
- 締切済み
- Excel(エクセル)
- Excel VBA 違うxlsファイルの指定したシートを開く処理
Excel VBAで違うExcelファイルの指定したシートを開きたいのですが、 うまくいきません。現在のコードは、 *フォーム* Private Sub CB1_Click() Dim A As Integer A = MsgBox("データ展開する?", 4, "データ展開?") If A = 6 Then INPORT.FILE_OPEN1 End If End Sub *INPORTモジュール* Sub FILE_OPEN1() FILE_OPEN8 End Sub Sub FILE_OPEN8() Dim fnames As String fnames = fnames1 Workbooks.Open Filename:=fnames ***ここでしょうか?.Sheet("")と指定しても出来ません*** End Sub Function fnames1() As Variant fnames1 = Application.GetOpenFilename( _ Title:="ファイルを開く", _ FILEFILTER:="エクセルファイル (*.xls), *.xls") If fnames1 = False Then MsgBox ("ファイルを開けませんでした。" & Chr$(13) & _ "もう一度やり直して下さい。") End End If End Function また、指定する事が出来たら、選択したシートを現在のブックにコピーもしたいのですが、どの様にすればよいでしょうか? よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 【VBA】特定の文字が入っている行の一部を抽出
マクロ初心者です。 一つのフォルダにある複数のエクセルファイルから”山口県”の行を 抽出するマクロを作成していますが、抽出条件をもう一つ追加したいのですがマクロの作成方法がわかりません。 現在下記のマクロを作成済みですが、こちらは”C”列に”山口県”と入力済みのデータを抽出しています 作成したいのは”C”列に”山口県” ”D”列に”宇部市”と入力済みのデータの抽出を行いたいです。 ↓現在作成済みのマクロです Sub test01() Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 With wb.ActiveSheet 'wbの開かれたシートについて x = .Cells(Rows.Count, "C").End(xlUp).Row 'A列最終行をxに代入 For i = 1 To x '1~xまで繰り返し If .Cells(i, "C").Value = "G1" Then '値がヒットしたら n = n + 1 .Rows(i).Copy 'コピー mb.Sheets(1).Rows(n).PasteSpecial 'このブックの最初のシートに貼り付け Application.CutCopyMode = False End If Next i End With wb.Close (False) '保存の有無を聞かずに保存しないで閉じる End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 Set mb = Nothing Set wb = Nothing End Sub マクロ初心者のため説明不足等でご迷惑をおかけするかと思いますが ご回答お願い致します。
- ベストアンサー
- Visual Basic
お礼
redfox63さん、御礼が大変遅くなったことをまずはお詫び申し上げます。 別の作業に追われており、ようやく本件に取り掛かることができました。 さて詳細なコードまでご提示いただき、大変ありがとうございました。 実行してみると、 ' 取得ファイル名のブックを開く Application.OpenText FileName:= sDir & sName ここで以下のエラーで止まってしまうようです。 「実行時エラー '438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 「Application.OpenText FileName」をGoogleで調べてみましたが、 本質問にしかHITしないようで、、、 当方、Excel2003ですが、「Application.OpenText」はExcel2007など新しい バージョンでの記述なのでしょうか? まことに厚かましいですが、もし原因が簡単にわかるようでしたら ご教示いただけますと幸いです。