• 締切済み

2つのvbaを統合したい

はじめまして、vba初心者のものです。 よろしくお願いします。 以前こちらに質問させて頂いたことがあります。 その以前質問して回答して頂いた2つのソースを一つに統合したいです。 1、参照元ブックと貼り付けブックの2つが存在します。 2、参照元ブックの名前の指定する必要はあると思いますが、 貼り付け先ブックは新規作成にしたいです。 3、「▼質問タイトル:vba ブック間でシート名のコピーをするには」の動作は、 貼り付け先ブックの各シートに反映されるようにしたいです。 何卒よろしくお願いします。 「▼質問タイトル:vba ブック間でシート名のコピーをするには」 http://okwave.jp/qa/q8727280.html sub macro1()  dim wb1 as workbook  dim w2 as worksheet  dim i as long ’2つのブックは既に開いている事  set wb1 = workbooks("オリジナルブック.xlsm") ’拡張子まで正しく指定する事  set w2 = workbooks("貼り付け先ブック.xlsx").worksheets(1) ’同上 ’準備  w2.range("A:A").clearcontents  w2.range("A:A").numberformat = "@"  w2.range("A1") = "シート名一覧" ’転記  for i = 1 to wb1.worksheets.count  if wb1.worksheets(i).name = "Sheet1" then exit for  w2.range("A65536").end(xlup).offset(1) = wb1.worksheets(i).name  next end sub 「▼質問タイトル:セルの項目をシート名にしたい」 http://okwave.jp/qa/q8727637.html sub macro1()  dim h as range  dim s as long, i as long  s = worksheets.count + 1 ’シートを作る  for each h in range("C3:B" & range("C65536").end(xlup).row)  worksheets.add after:=worksheets(worksheets.count)  activesheet.name = h.value  next ’別のブックにする  for i = worksheets.count to s step -1  worksheets(i).select false  next i  activewindow.selectedsheets.move end sub

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

出来るだけご提示のコードを崩さないようにしたつもりですが、 余計な処理を排除するため、配列を使用しています。 A列に書き出し、C列から読み取る以下の処理が不明ですので、 >w2.range("A65536").end(xlup).offset(1) = wb1.worksheets(i).name >for each h in range("C3:C" & range("C65536").end(xlup).row) 書き出し列をC列として処理を行っています。 保存先のフォルダが不明なため、名前を付けて保存ダイアログを表示して終了するようにしています。 ■VBAコード Sub macro3() '宣言 Dim wb(1) As Workbook Dim h As Object Dim i As Long Dim mySt() As String Dim fname As String 'wb(0)に指定するブックは開いている必要があります。 Set wb(0) = Workbooks("オリジナルブック.xlsm") '新規ブックを作成 Set wb(1) = Workbooks.Add 'シート名を配列に格納 ReDim mySt(wb(0).Worksheets.Count, 0) For i = 1 To wb(0).Worksheets.Count   If wb(0).Worksheets(i).Name = "Sheet1" Then Exit For   mySt(i - 1, 0) = wb(0).Worksheets(i).Name Next i '配列毎の処理 For i = 0 To UBound(mySt, 1) - 1   If mySt(i, 0) = "" Then Exit For   wb(1).Worksheets.Add after:=wb(1).Worksheets(wb(1).Worksheets.Count)   With ActiveSheet     .Name = mySt(i, 0)     .Range(.Cells(3, "C"), .Cells(3 + UBound(mySt) - 1, "C")) = mySt   End With Next i '不要な初期シート(Sheet1~3)を削除 Application.DisplayAlerts = False wb(1).Worksheets(Array(1, 2, 3)).Delete Application.DisplayAlerts = True '名前を付けて保存 fname = Application.GetSaveAsFilename( _   InitialFileName:="貼り付け先ブック.xlsx", _   FileFilter:="Excelファイル, *.xlsx") If fname <> "False" Then wb(1).SaveAs fname End Sub

kalafina2
質問者

お礼

ありがとうございます。 ただ、まことに申し訳ございません。 私の伝え間違いがありました。前回ご指摘いただいているのに申し訳ございません。 参照元ブックの各シートを張り付け先ブックの各シート内のセルにシート一覧するのは、 理想としてた動作でした。 しかし参照元ブックのシート1にあるC3から始まるC列にある、 項目を各シートの名前にしたいです。 セルB列のセルの中身がnullになれば終了という動作にしたいです。 例えば。 セルB3に「山田」という文字列があれば、Sheet1は山田にする。 セルB4に「佐藤」という文字列があれば、Sheet2は佐藤にする。 例、 1、ブック1のSheet1に文字列の「山田」や「佐藤」のセルがあります。 2、ブック2は新規ブックです。 3、ブック1の最初のセルC3の文字列「山田」を、ブック2のSheet1を「山田」という名前のシート名にします。 4、ブック1の次のセルC4の文字列「佐藤」を、ブック2のSheet2を「佐藤」という名前のシート名にします。 5、ブック1の次のセルC5、C6、C7と繰り返していき文字列がなくなるまで続けます。 ご回答頂いたのに私の勉強不足のために二度手間になり申し訳ありません。 何とぞよろしくお願い申し上げます。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

3点確認したい事柄があります。 (1) オリジナルブック.xlsmのシート名(シート構成)を新規で作ったブックに反映し、名前を「貼り付け先ブック.xlsx」として保存したいという事でしょうか? (2) シート名一覧を作成し、書き出す必要はなく直接シート名を設定出来ますが・・・ set w2 = workbooks("貼り付け先ブック.xlsx").worksheets(1) w2.range("A1") = "シート名一覧" w2.range("A65536").end(xlup).offset(1) = wb1.worksheets(i).name 上記の貼り付け先ブック.xlsxの1つ目のシートのセルA2以降に出力されるシート名一覧は必要なのでしょうか? (3) for each h in range("C3:B" & range("C65536").end(xlup).row) ご提示のコードではC3:B末尾を範囲としていますが、 URLのコードではB3~B末尾までのセルを対象としています。 A列に一覧を書き出し、BまたはC列を取得する意図が不明です。 (おそらくA列に書き出し、A列から取得したいのだとは思いますが) 質問の際は、辻褄がせめて合うようにご提示願います。

kalafina2
質問者

補足

ご連絡ありがとうございます。 インラインにて失礼します。 >(1) >オリジナルブック.xlsmのシート名(シート構成)を新規で作ったブックに反映し、名前を「貼り付け先ブック.xlsx」として保存したいという事でしょうか? →はい、その通りです。 >(2) >上記の貼り付け先ブック.xlsxの1つ目のシートのセルA2以降に出力されるシート名一覧は必要なのでしょうか? →はい、必要です。  また「▼質問タイトル:セルの項目をシート名にしたい」する際、各シートでシート名一覧が必要です。 >(3) >for each h in range("C3:B" & range("C65536").end(xlup).row) >ご提示のコードではC3:B末尾を範囲としていますが、 >URLのコードではB3~B末尾までのセルを対象としています。 >A列に一覧を書き出し、BまたはC列を取得する意図が不明です。 >(おそらくA列に書き出し、A列から取得したいのだとは思いますが) >質問の際は、辻褄がせめて合うようにご提示願います。 →ご指摘ありがとうございます。  訂正がございます。  正しくは、  for each h in range("C3:C" & range("C65536").end(xlup).row)  です。 何卒、宜しくお願い申し上げます。

関連する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

  • 全くの初心者ですVBA

    どこが悪いかわかりません。 教えてください。 Sub テスト() Dim kekka As String Dim i As Integer tokuten = Worksheets("Sheet1").Cells(i, 1).Value For i = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row.Count If tokuten >= 80 Then kekka = "合格" Else kekka = "不合格" kekka = Cells(i, 2) End If Next i End Sub シート1の A列に数値で得点が入っています。

  • 「 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マクロがうまく動きません

    こんにちは。いつもお世話になっております。 掲題の通りなのですが、下記のマクロを作り、 あるブック(毎回異なります)の全シート(毎回名前も数も異なります) に対して、同じ作業をしてほしいのですが、 1シート目で止まってしまいます。 特にエラー表示も出ないので、何が違っているのか わからず、どのように修正をしたらよいか、ご教示いただければ 幸いです。 エクセル2010を使用、パーソナルブックにマクロ登録しています。 Sub Test() Dim i As Integer ' 現在のブックのシート数を取得 For i = 1 To ThisWorkbook.Worksheets.Count '保護解除 Worksheets(i).Unprotect Password:="" '非表示列を表示 Worksheets(i).Columns.Hidden = False 'A列挿入数式コピー、オートフィル Worksheets(i).Columns(1).Insert Range("A12") = "=B12&C12" Range("A12").AutoFill Destination:=Range("A12:A" & Range("D" & Cells.Rows.Count).End(xlUp).Row), Type:=xlFillCopy Next i End Sub よろしくお願い致します。

  • Excel VBAでの質問

    以前、質問に回答頂きそれを実行してうまくいったのですが、 特定のsheetだけsheetのつくりが違うため、 このsheetは毎回なにも処理をしないという処理を加えたいのですが、 (例えばsheet5とsheet8は処理をしない) 下記のコードにどのように付け加えればよいでしょうか? わかるかた宜しくお願い致します。 Dim i As Long For i = 1 To Worksheets.Count  If Worksheets(i).Range("A1").Value = 10 Then Worksheets(i).Range("K1") = Worksheets(i).Range("A1")  Worksheets(i).Range("A1:D80").ClearContents Next End Sub

  • Excel VBAについて教えて下さい。

    00というブックとテストというブックがあります。 00のデータを並び替え、一部変更し、テストのシート3へ貼付けを行いたいのですが、 うまく作動してくれません。以下に現在のコードを記載しましたので、ご指摘いただければと思います。 やりたいことは 1.ブック”00”のシート00にて条件がF列が0、E列がHでソートをかけます。 2.E列のHをすべて数字の1に変更します。 3.今度は別の条件、F列が1、E列がH、D列が1でソートをかけます。 4.E列のHをすべて消去します。 5.すべて表示させA列からE列までのデータを、テストのシート3へ貼付けをします。 コピー&ペーストは上手くいくのですが、肝心のソート+文字の変更+消去が出来ていません。 ネットを見ながら書いたコードで、VBAを勉強中です。 よろしくお願いします。 あと、この作業の前にブック00のB列にて昇順のソートをかけるというコードを追加したいのですが、 それについても教えていただけるとうれしいです。 よろしくお願い致します。 Private Sub Worksheet_Activate() Dim wb1 As Workbook Dim wb2 As Workbook Dim i As Long Application.ScreenUpdating = False Set wb1 = ActiveWorkbook Set wb2 = Workbooks.Open("C:\Documents and Settings\デスクトップ\メモ\00.xls", ReadOnly:=True) With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", "1") End If Next i With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="=" & "1", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", " ") End If Next i wb2.Sheets("00").Range("B1", .Cells(Rows.Count, 5).End(xlUp)).Copy wb1.Sheets("Sheet3").Range("K3").PasteSpecial wb2.Close False Range("A1").Select Application.ScreenUpdating = True End With End With End Sub

  • VBAに関する質問

    VBA初心者のものですが、エクセル形式で保存されているいくつかのブックのシートの中身をテキストエディタ(MIFESというもの)に.csv形式で上から順に貼り付けていき保存するということは可能でしょうか? 例えば workbooks("wb1").worksheets("data").range("a1:f1")が 1  2 3  4  5 6  7 workbooks("wb2").worksheets("data").range("a1:f1")が 8 9 10 11 12 13 14 という2つのブックが存在するなら 1,2,3,4,5,6,7, 8,9,10,11,12,13,14, とテキストエディタにコピーしていく感じです。 イメージとして恐らく非常におかしなコードだと思いますが、 Sub test() Dim wb As Workbook Dim i As Integer, v As Integer Dim OpenFilename As String, wc As String dim ap as double i = Application.InputBox("コピーしたいファイル数を記入してください", Type:=1) ap = shell("MIW.exe") For v = 1 To i OpenFilename = Application.GetOpenFilename("Microsoft Excelブック,*.xls") Workbooks.Open Filename:=OpenFilename Set wb = ActiveWorkbook  wb.worksheets("data").range("a1:f1").copy appactivate ap sendkeys "^V", true appaplication,wait now+timevalue("0:00:05") appactivate application.caption application.cutcopymode = false next v end sub というような感じです。 最初、エクセルで一つのシートに対し貼り付け作業を行ったあと.csv形式で保存すればいいだろうと思っていたのですが、一つ一つのシートの容量が大きく、エクセルで処理できる容量をこえてしまいそのやり方では無理なようです。分かりにくいところなど多々あるとは思いますが、時間がございましたら、手助けとなるコードなり指摘なり示して頂ければと思います。宜しくお願いします。

  • ブック内に特定名のシートがある場合

    はじめまして、こんにちは。 VBAを最近はじめたばかりの者です。質問が初歩的なもので申し訳ないのですが是非教えてください。 以下を使って、複数ブックの○○というシートから指定セルの内容を抜き出したいと思っています。 ところが、ブックによっては○○というシートが存在しない場合があり、その場合には「インデックスが有効でない」というエラーで動作が止まってしまいます。 ブック内に○○というシートがある場合にのみ動作させるようにするにはどのようにすれば良いのでしょうか。 よろしくお願いします。 Dim wb As Workbook, myRow As Long Dim e As Integer myRow = ThisWorkbook.Worksheets(1).Rows.Count With Application.FileSearch .NewSearch .LookIn = ThisWorkbook.Path .SearchSubFolders = True .FileType = msoFileTypeExcelWorkbooks If .Execute() > 0 Then For i = 1 To .FoundFiles.Count If .FoundFiles(i) <> ThisWorkbook.FullName Then Set wb = Workbooks.Open(.FoundFiles(i), UpdateLinks:=0) Application.ScreenUpdating = False ThisWorkbook.Worksheets(1).Range("A" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F6").Value ThisWorkbook.Worksheets(1).Range("B" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F7").Value ThisWorkbook.Worksheets(1).Range("C" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F8").Value ThisWorkbook.Worksheets(1).Range("D" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("Y6").Value wb.Close False End If Next i Else MsgBox "ファイルがありません。" End If End With End Sub

  • VBA シート指定とファイル名入力

    部署ごとに分割し、ブックで保存するコードです。 sheet名は「部署」です。 Sub macro1() Dim w As Worksheet Dim n As Long Dim r As Long Dim s As String Dim WSH As Variant Dim myPath As String Set w = ActiveSheet n = Worksheets.Count Application.ScreenUpdating = False On Error GoTo errhandle For r = 5 To w.Range("B65536").End(xlUp).Row s = w.Cells(r, "B") w.Rows(r).Copy Worksheets(s).Range("B65536").End(xlUp).Offset(1, -1) Next r On Error GoTo 0 Set WSH = CreateObject("Wscript.Shell") myPath = ActiveWorkbook.Path & "\1\" For r = Worksheets.Count To n + 1 Step -1 Worksheets(Worksheets.Count).Copy ActiveSheet.Columns.AutoFit ActiveWorkbook.SaveAs Filename:=myPath & ActiveSheet.Name ActiveWorkbook.Close False Application.DisplayAlerts = False Worksheets(Worksheets.Count).Delete Application.DisplayAlerts = True Next r w.Select Exit Sub errhandle: Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = s w.Rows(1).Copy Range("A1") w.Rows(2).Copy Range("A2") w.Rows(3).Copy Range("A3") w.Rows(4).Copy Range("A4") Resume Application.ScreenUpdating = True End Sub (1)sheet1にマクロ実行ボタンを配置し、部署seedにマクロ実行命令をする。 (2)sheet1のB2セルにファイル名を入力して、そのファイルに保存する。(例部署ファイル) (1)Dim w As Worksheets("部署")と変更したのですが、エラーが出ました。 (2)myPath = ActiveWorkbook.Path & "\部署ファイル\"   ↑ これをsheet1のB2セルから指定できるようにしたいです。 宜しくお願いします。

  • VBAでsheetのコピー

    ご回答有難う御座いました。補足説明を致します。動作するとこまでは、出来たのですが、一点変更しました。:=のコピーの所でデバッグすると、エラーになるので、=だけにしました。すると動作するのですが、新しいsheetの名前が、コピー元のsheet名になります。そして、MsgBoxを入れると、エラーになります。また、1sheetだけがコピーされます。大変恐縮ですが、もう一度ご教授願います。補足説明なりますが、やりたい事は、拡張子がxlsmの中に名前のついた10個のsheetがあります。この10個のsheetを拡張子がxlsxのBookにコピーしたいのですが、このBook1のsheetをVBAから新に作成しBook2のsheet1に纏めたいのですが、纏め方は、Book2のsheet1の下から上に10sheetをコピーして、条件としてBook2のsheet1の名前は、固定で構いません。Book1の一番初めのsheetにコピーする時だけ3行目にある見出しだけは、Book2のsheet1に付けたく。それ以外のBook1のsheetは、デターだ4行目以降をコピーしたいのですが、また、コピーしたいsheetの範囲に列は、A1~AFで列は3~62までです。マクロはご教授頂いた、下記通りです。 Sub macro1() Dim i As Long Dim w0 As Workbook Dim s As Worksheet Set w0 = ActiveWorkbook '1枚目シートから貼り付け先のブックを作る w0.Worksheets(1).Copy Set s = ActiveSheet '2枚目以降のデータをコピーする For i = 2 To w0.Worksheets.count With w0.Worksheets(i) .Range("A4:AF" & .Range("A65536").End(xlUp).Row).Copy Destination = s.Range("A65536").End(xlUp).Offset(1) End With Next i End Sub これを先ほど書きました、マクロを教えて頂けませんでしょうか?何せ、マクロ初心者なので、msm相談箱がたよりです。何卒マクロを教えて頂きたく宜しくお願い申し上げます。

専門家に質問してみよう