質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1722閲覧

抽出したデータを別ブックに貼り付ける

Mkasai

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

2クリップ

投稿2020/02/13 03:01

エクセルで「契約情報」というブックに”契約情報”と”作成情報”というシートがあります。
”契約情報”シートで選んだ情報を”作成情報”シートに抽出して貼り付けるというところはできました。

これを”作成情報”シートへ抽出するのではなく、別の「書類作成」という別ブックの”作成情報”シートに抽出したいのですが、うまくいきません。

「契約情報」と「書類作成」ブックは同じフォルダーにあります。

現在のコードは次のとおりです。

Sub 抽出()

Worksheets("作成情報").Range("2:11").ClearContents

Dim ws1, Sakusei
Dim StartRow, EndRow, tmpRow

'シート名を変えてる場合は適宜変更
Set ws1 = Worksheets("契約情報")
Set ws2 = Worksheets("作成情報")
'作成情報シートに指定されている抽出条件
Sakusei = ws2.Cells(1, "N")

StartRow = 2
EndRow = ws1.Cells(Rows.Count, "C").End(xlUp).Row
tmpRow = 2

For i = StartRow To EndRow
If (ws1.Cells(i, "M") = Sakusei) Then
ws2.Cells(tmpRow, "N") = Sakusei
ws2.Cells(tmpRow, "C") = ws1.Cells(i, "C")
ws2.Cells(tmpRow, "D") = ws1.Cells(i, "D")
ws2.Cells(tmpRow, "E") = ws1.Cells(i, "E")
ws2.Cells(tmpRow, "F") = ws1.Cells(i, "F")
ws2.Cells(tmpRow, "G") = ws1.Cells(i, "G")
ws2.Cells(tmpRow, "H") = ws1.Cells(i, "H")
ws2.Cells(tmpRow, "I") = ws1.Cells(i, "I")
ws2.Cells(tmpRow, "J") = ws1.Cells(i, "J")
ws2.Cells(tmpRow, "K") = ws1.Cells(i, "K")
tmpRow = tmpRow + 1
End If
Next

End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

もし、コードをどう記述したらいいのかわからない場合は、マクロの自動記録を使うとExcelが勝手にコードを記述してくれます。
それを追うとどのようなコードを記述すればよいのかわかると思います。

VBA

1 'シートをコピーしたいのであれば 2 Workbooks("契約情報").Sheets("作成情報").Copy 3 4 'いきなり別ブックに出力したいのであれば 5 Workbooks.Add 6 With ActiveWorkbook 7 .Sheets(1).Name = "作成情報" 8 9 '---------- 必要な処理をここに書く ----------- 10 End With

こんな感じです。

ただ、新たにブックが作成されると新しいブックがアクティブになるので注意して下さい。


追記です。コードを書くとしたらこんな感じでしょうか。

VBA

1Sub 抽出() 2 Dim ws1 As Worksheet, ws2 As Worksheet 3 Dim Sakusei As String 4 Dim StartRow As Long, EndRow As Long, tmpRow As Long 5 Dim i As Long 6 Dim strFilePath As String, strFileName As String 7 Dim intFFile As Integer 8 Dim blnWbOpen As Boolean 9 Dim varTmp As Variant 10 11 strFilePath = ThisWorkbook.Path & "\" 12 strFileName = "書類作成.xlsx" 13 14 '----- ファイルの存在確認 15 If Dir(strFilePath & strFileName) = "" Then 16 MsgBox strFilePath & strFileName & " が見つかりません", vbCritical 17 Exit Sub 18 End If 19 20 blnWbOpen = False 21 22 '----- 書き込みできる状態か? 23 On Error Resume Next 24 intFFile = FreeFile 25 Open strFilePath & strFileName For Binary Access Read Lock Read As #intFFile 26 Close #intFFile 27 28 If Err.Number = 0 Then 29 '開く!! 30 Workbooks.Open strFilePath & strFileName 31 Else 32 '開かれているか確認する!! 33 For Each varTmp In Workbooks 34 If varTmp.FullName = strFilePath & strFileName Then 35 36 blnWbOpen = True 37 End If 38 Next 39 40 '誰かに開かれている!! 41 If Not blnWbOpen Then 42 MsgBox strFilePath & " を開くことができません。" & vbCrLf _ 43 & "誰かが開いている可能性があります" 44 Exit Sub 45 End If 46 End If 47 On Error GoTo 0 48 49 50 51 'シート名を変えてる場合は適宜変更 52 Set ws1 = Workbooks("契約情報").Sheets("契約情報") 53 Set ws2 = Workbooks(strFileName).Sheets("作成情報") 54 55 ws2.Range("2:11").ClearContents 56 57 '作成情報シートに指定されている抽出条件 58 Sakusei = ws2.Cells(1, "N") 59 60 EndRow = ws1.Cells(Rows.Count, "C").End(xlUp).Row 61 62 StartRow = 2 63 tmpRow = 2 64 65 For i = StartRow To EndRow 66 If (ws1.Cells(i, "M") = Sakusei) Then 67 68 ws2.Cells(tmpRow, "N") = Sakusei 69 70 ws2.Cells(tmpRow, "C") = ws1.Cells(i, "C") 71 ws2.Cells(tmpRow, "D") = ws1.Cells(i, "D") 72 ws2.Cells(tmpRow, "E") = ws1.Cells(i, "E") 73 ws2.Cells(tmpRow, "F") = ws1.Cells(i, "F") 74 ws2.Cells(tmpRow, "G") = ws1.Cells(i, "G") 75 ws2.Cells(tmpRow, "H") = ws1.Cells(i, "H") 76 ws2.Cells(tmpRow, "I") = ws1.Cells(i, "I") 77 ws2.Cells(tmpRow, "J") = ws1.Cells(i, "J") 78 ws2.Cells(tmpRow, "K") = ws1.Cells(i, "K") 79 80 tmpRow = tmpRow + 1 81 End If 82 Next 83 84 85 '処理完了メッセージ 86 MsgBox "処理が完了しました!", vbInformation 87 88End Sub

なお、対象ブック内のシート存在確認はしていません。
あと、作成後の保存等も記述していません。

投稿2020/02/13 03:34

編集2020/02/13 07:35
yuuskeccho

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mkasai

2020/02/13 05:11

ありがとうございました。 マクロを実行してみたところ、’U:¥帳票作成¥書類作成.xlsx'が見つかりません。移動、名前の変更、または削除された可能性があります。と出て、アクセスできないいずれかの理由として、 ファイル名またはパスが存在しません。 ファイルが他のプログラムによって使用されています。 保存しようしているブックと同じ名前のブックが現在開かれています。 と出ます。 どのように修正したら動くのでしょうか。 お手数をお掛け致しますが、よろしくお願いします。
yuuskeccho

2020/02/13 08:00 編集

どのようなコードを実行してみたのでしょうか? ブックが開かれているのであればファイルが見つからない等のメッセージは本件とは関係ないと思いますが。 コードの中で、出力先ブックの存在確認→ブックを開く→転記処理→出力先ブックを上書き保存→出力先ブックを閉じる・・・といった流れを組みたいということでしょうか? 質問がうまくいきませんではこちらもよくわかりません。質問内容を最終的にどのようにしたいのか明確にした方が良いと思います。 上に何となく書いたコード追加しました。
sinzou

2020/02/13 14:47 編集

「ファイルが使用されている」(読み取り専用) ドライブ U: サーバーフォルダーですか? 一度すべてのEXCEL終了させてから、ためしてみては?
Mkasai

2020/02/14 02:30

度々お世話になります。 先日別の質問で条件に一致したセルに〇をつけるという動きについてお力をいただいたのですが、そのデータを使って、次の段階へ進みたいと思っています。 サーバー(U:)にある帳票作成というフォルダの中に、契約情報と書類作成の2つのブックがあります。 契約情報ブックの中には、契約情報と作成情報の2つのシートがあります。 書類作成ブックの中には、作成したい書類の雛型が複数シートあります。 契約情報ブックの契約情報シートから作成したいものを選択抽出し、その選んだ契約情報を書類作成ブックから帳票として印刷したい。 契約情報ブックの作成情報シートは、自分のスキルが低い為準備しているだけなので、直接書類作成ブックから帳票が作成できるのであれば必要ない。 契約情報ブックの作成情報シートをそのまま書類作成ブックにシートごとコピーして使えないかと考えていました。 でもなかなか思うように作ることができず、質問させていただきました。 書類作成ブックは開いていても開いていなくても使えるようにしたい。 保存は不要。 こちらが作りたいものの動きです。 お力お貸しください。 よろしくお願いします。
yuuskeccho

2020/02/14 07:15

ん~、色々ツッコミどころがあるようですね。 普通ひな形というのは、直接触らないで、コピーして使うものではないのでしょうか? だとすれば、ひな形が入っているブックにシートをコピーするとか値を直接書き込むというのはナンセンスで、ひな形をコピーして使うというのが本来の使い方な気がします。 仮にひな形に書き込むとしても僕が追記したコードは実行してみましたか? それで足りないというのであれば、何が足りないのでしょうか? あと、質問内容や主旨が変わってくるのであれば、質問自体を訂正して下さい。 それとスキルが低くてという謙遜は必要ありませんし、最初からスキルを持っている人はいません。 どの部分がどのようにわからないのかを質問して教えてもらい、学習したうえで自身で解決するためにこのteratailがあるわけです。
sinzou

2020/02/14 09:11 編集

そうですね、「発行済み」ブックに「作成情報」シートコピーして、値を貼り付け、印刷、保存とかありそうですけど。 まず、’U:¥帳票作成¥書類作成.xlsx'ファイルその場所にありますか、半角スペース等も注意してください。 Yuusukecchoさんのコード、pc立ち上げ最初に実行してもエラー出ますか? 他の方も作業がありひらいたりしてませんか?
Mkasai

2020/02/17 04:44

ありがとうございました。 ファイルの場所を確認してみるようアドバイスいただいて気が付きました。 拡張子が違っていました。 xlsxをxlsmに修正したら思っていた動きをするようになりました。 ありがとうございました。
guest

0

他のExcelを使う場合、ブックを操作する処理が必要ですね。
既に開いてる時に更にOpen処理で開こうとするとダイアログが出てしまうなど意外と面倒です。
このソースは既に開いている場合も閉じてる場合も対応できるように書いたものです。
それと複数の連続セルをコピーする場合はRangeで範囲指定した方が処理が速いです。

VBA

1Sub 抽出() 2 3 Dim twb, cwb As Workbook 4 Dim curPath, Sakusei As String 5 Dim ws1, ws2 As Worksheet 6 Dim StartRow, EndRow, tmpRow As Integer 7 Dim wb As Workbook, flag As Boolean 8 9 Set twb = ThisWorkbook 10 curPath = twb.Path 11 12 'ブックが既に開いているかどうかチェック 13 For Each wb In Workbooks 14 If wb.Name = "書類作成.xlsx" Then 15 flag = True 16 Exit For 17 End If 18 Next wb 19 '既に開いている場合 20 If flag = True Then 21 'オブジェクトにセット 22 Set cwb = Workbooks("書類作成.xlsx") 23 cwb.Activate 24 Else 25 '新規で開いてオブジェクトにセット 26 Workbooks.Open Filename:=curPath & "\書類作成.xlsx" 27 Set cwb = ActiveWorkbook 28 End If 29 30 'シート名を変えてる場合は適宜変更 31 Set ws1 = twb.Worksheets("契約情報") 32 Set ws2 = cwb.Worksheets("作成情報") 33 34 ws2.Range("2:11").ClearContents 35 36 '作成情報シートに指定されている抽出条件 37 Sakusei = ws2.Cells(1, "N") 38 39 StartRow = 2 40 EndRow = ws1.Cells(Rows.Count, "C").End(xlUp).Row 41 tmpRow = 2 42 43 For i = StartRow To EndRow 44 If (ws1.Cells(i, "M") = Sakusei) Then 45 ws2.Cells(tmpRow, "N") = Sakusei 46 '範囲コピー 47 ws2.Range(ws2.Cells(tmpRow, "C"), ws2.Cells(tmpRow, "K")).Value = ws1.Range(ws1.Cells(i, "C"), ws1.Cells(i, "K")).Value 48 tmpRow = tmpRow + 1 49 End If 50 Next 51 52End Sub

投稿2020/02/13 04:02

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/02/13 04:08

Dim twb, cwb As Workbook の部分ですが、型指定はまとめてできませんので、一つずつする必要があります。 Dim twb As Workbook, cwb As Workbook というように。 前者だと、twb はVariant型で宣言したことになります。(Variant型なのでエラーにはなりませんが。)
guest

0

これを”作成情報”シートへ抽出するのではなく、別の「書類作成」という別ブックの”作成情報”シートに抽出したいのですが、うまくいきません。

「契約情報」と「書類作成」ブックは同じフォルダーにあります。

vba

1Set ws1 = Worksheets("契約情報") 2Set ws2 = Worksheets("作成情報")

を下記のように書き換えればいいでしょう。

vba

1Dim ws1 As Worksheet, ws2 As Worksheet 2Dim targetWb As Workbook 3 4Set ws1 = ThisWorkbook.Worksheets("契約情報") 5Set targetWb = Workbooks.Open("書類作成.xlsx") 6Set ws2 = targetWb.Worksheets("作成情報")

投稿2020/02/13 03:54

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問