No.1
- 回答日時:
こんばんは!
元データはSheet1にあり、Sheet2に表示するとします。
尚、1行目は項目行でデータはA列2行目以降にあるという前提です。
一例です。
標準モジュールにしてください。
Sub Sample1()
Dim i As Long, lastRow As Long
Dim c As Range, r As Range
Dim wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
Application.ScreenUpdating = False
.Cells.ClearContents
wS.Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("A1"), unique:=True
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
Range(.Cells(1, "B"), .Cells(1, lastRow)).Value = _
Application.Transpose(Range(.Cells(2, "A"), .Cells(lastRow, "A")).Value)
Range(.Cells(2, "A"), .Cells(lastRow, "A")).ClearContents
.Range("A2") = "良品"
.Range("A3") = "不良品"
For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
Set r = .Rows(1).Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Set c = .Range("A:A").Find(what:=wS.Cells(i, "C"), LookIn:=xlValues, lookat:=xlWhole)
With .Cells(c.Row, r.Column)
If .Value = "" Then
.Value = wS.Cells(i, "B")
Else
.Value = .Value & "," & wS.Cells(i, "B")
End If
End With
Next i
.Columns.AutoFit
Application.ScreenUpdating = True
.Activate
End With
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
No.2
- 回答日時:
No.1です。
二番目の補足のエラーに関してですが・・・
もしかしてシートモジュールにしていませんか?
シートモジュールで別シートのデータの消去などを行うとエラーになる場合があります。
標準モジュールであればちゃんと動作すると思うのですが。
もしくはシート名が違うとか?
そして、最初の補足の件ですが
異なるブックが三つあり、一つのブックのマクロで他の二つのブックの操作だけをしたい!っていうコトでしょうか?
通常、そのような場合は一つのブックのマクロ(たとえばデータを表示するブック、画像では下側のブックのマクロ)で
他のブックを開く → 操作 → 他のブックを閉じる!
といった手順にするのが一般的だと思います。
すなわちわざわざ行いたい操作を記載したマクロだけのブックを作る必要はないと思うのですが。
どうしてもそのようにしたいのであれば、当然可能です。
ただ、今はじっくり考える時間がないので、とりあえずこの程度で・・・m(_ _)m
No.3
- 回答日時:
続けてお邪魔します。
どうも失礼しました。
補足の
>不良品以外にも「廃棄」・・・
を見逃していました。
とりあえずSheet1のC列のデータが何種類あっても対応できる方法にしてみました。
少し手を加えるだけで大丈夫なので、これに関してはすぐに回答はできます。
前回のコードを消去し、↓のコードに変更してみてください。
(もちろん、標準モジュールです)
Sub Sample2()
Dim i As Long, lastRow As Long
Dim c As Range, r As Range
Dim wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
Application.ScreenUpdating = False
.Cells.ClearContents
wS.Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("A1"), unique:=True
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
Range(.Cells(1, "B"), .Cells(1, lastRow)).Value = _
Application.Transpose(Range(.Cells(2, "A"), .Cells(lastRow, "A")).Value)
Range(.Cells(1, "A"), .Cells(lastRow, "A")).ClearContents '//★//
wS.Range("C:C").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("A1"), unique:=True '//★//
For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
Set r = .Rows(1).Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Set c = .Range("A:A").Find(what:=wS.Cells(i, "C"), LookIn:=xlValues, lookat:=xlWhole)
With .Cells(c.Row, r.Column)
If .Value = "" Then
.Value = wS.Cells(i, "B")
Else
.Value = .Value & "," & wS.Cells(i, "B")
End If
End With
Next i
.Columns.AutoFit
Application.ScreenUpdating = True
.Activate
End With
MsgBox "完了"
End Sub
※ コード内の「★」の行が変わっているだけです。m(_ _)m
No.4ベストアンサー
- 回答日時:
最終確認です。
① 三つのブックは同じフォルダ内に保存している
② 参照元ファイル名は「Book1」、表示したいブックのファイル名は「Book2」とし
両ブックの拡張子は「xlsx」とする
③ 元データは Book1 の Sheet1 にあり、表示するのは Book2 の Sheet1 とする
④ 表示するデータは項目行を入れて3行のみ(C列が「良品」以外はすべて「不良品」の行にまとめる)
以上の前提条件です。
別ブック参照するときは気を付けなければならないコトが多くあります。
ブック名とシート名
これは必須です。これらを指定してやらないとちゃんと動かないコトが多いです。
↓のコードをマクロ記載ブック(三つ目のブック)の標準モジュールにしてみてください。
Sub Sample3()
Dim myPath As String, fN As String
Dim i As Long, k As Long, lastRow As Long, myRow As Long
Dim wB1 As Workbook, wB2 As Workbook, wS As Worksheet
Dim c As Range, myFlg As Boolean
Application.ScreenUpdating = False
'//▼ここからブックを開く操作//
myPath = ThisWorkbook.Path & "\"
fN = "Book1.xlsx"
If Workbooks.Count > 1 Then
For k = 2 To Workbooks.Count
If Workbooks(k).Name = fN Then
myFlg = True
End If
Next k
End If
If Workbooks.Count = 1 Or myFlg = False Then
Workbooks.Open myPath & fN
End If
Set wB1 = Workbooks(fN)
Set wS = wB1.Worksheets("Sheet1")
myFlg = False
fN = "Book2.xlsx"
For k = 2 To Workbooks.Count
If Workbooks(k).Name = fN Then
myFlg = True
End If
Next k
If myFlg = False Then
Workbooks.Open myPath & fN
End If
Set wB2 = Workbooks(fN)
'//▲ココまで//
'//▼ココから本格的な操作//
With wB2.Worksheets("Sheet1")
.Cells.ClearContents
wS.Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("A1"), unique:=True
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
Range(.Cells(1, "B"), .Cells(1, lastRow)).Value = _
Application.Transpose(Range(.Cells(2, "A"), .Cells(lastRow, "A")).Value)
.Range("A:A").ClearContents
.Range("A1") = wS.Range("C1")
.Range("A2") = "良品"
.Range("A3") = "不用品"
For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
Set c = .Rows(1).Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If wS.Cells(i, "C") = "良品" Then
myRow = 2
Else
myRow = 3
End If
With .Cells(myRow, c.Column)
If .Value = "" Then
.Value = wS.Cells(i, "B")
Else
.Value = .Value & "," & wS.Cells(i, "B")
End If
End With
Next i
.Columns.AutoFit
.Activate
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
※ 上記コードをコピー&ペーストした後に
マクロ有効ブックとして、一旦名前を付けて保存(二つのブックと同じファイルに!)し
新たに開いてマクロを実行してみてください。
※ 二つのブックは開いたままにしていますが、
当然上書き保存して閉じることもマクロで可能です。m(_ _)m
この回答へのお礼
お礼日時:2019/01/30 10:36
tom04さんのおかげで望んでいたものができました。
大変助かりました!本当にありがとうございます。感謝しています。
それから、こんなに長々とやり取りさせてしまい申し訳ありません。
ちゃんと理解できるよう頑張ります。有難うございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAリストボックスで選択した後 5 2022/11/07 17:50
- 画像編集・動画編集・音楽編集 AfterEffectでのシャターの挙動がおかしい 1 2023/05/07 00:38
- Visual Basic(VBA) VBAマクロ 決まっていない行を選択して別シートへ貼付け 4 2023/02/16 16:08
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
- Excel(エクセル) VBAで「クエリと接続」の画面を出せますか? 2 2022/10/24 13:35
- Excel(エクセル) エクセルで対象日に該当するデータがある場合に別表へ全対象者を表示させたい。 3 2023/07/12 09:48
- Visual Basic(VBA) ChatGPTに作らせたい Excel VBA 1 2023/04/05 19:56
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- その他(Microsoft Office) Excel VBA で条件に合わせて行を合算する方法 2 2022/04/27 14:21
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
ワイルドカード「*」を使うとう...
-
エクセルVBAが途中で止まります
-
vbaでvbaProjectのパスワード解...
-
VBAで別ブックのシートを指定し...
-
【VBA】全シートの計算式を全て...
-
VBS Bookを閉じるコード
-
ExcelのVBAです。フォルダ内の...
-
【マクロ】違うフォルダにある...
-
【ExcelVBA】インデックスが有...
-
エクセルのマクロを使ってメー...
-
エクセルのマクロについて教え...
-
複数のエクセルブックをひとつ...
-
【ExcelVBA】zip圧縮されたCSV...
-
Dir関数で複数ブックへ行いたい...
-
Excelのマクロコードについて教...
-
VBAで複数のブックを開かずに処...
-
マクロで最終行を取得したい
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
エクセルVBAが途中で止まります
-
別ブックをダイアログボックス...
-
ワイルドカード「*」を使うとう...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBS Bookを閉じるコード
-
【ExcelVBA】インデックスが有...
-
VBA コードを実行すると画面が...
-
【ExcelVBA】zip圧縮されたCSV...
-
vbaでvbaProjectのパスワード解...
-
VBAで別ブックのシートを指定し...
-
ExcelのVBAです。フォルダ内の...
-
vbaで他のブックに転記したい。...
-
フォルダ内の全てのファイルに...
-
VBAで複数のブックを開かずに処...
-
VBSでExcelのオープン確認
-
VBA 実行時エラー 2147024893
-
【Excel VBA】書き込み先ブック...
-
VBA シート名が一致した場合の...
おすすめ情報
最終的にこのような形にしたいです
ご回答ありがとうございます。
まぎらわしいのですが、ひとつのブックのなかにこれらのシートがあるわけではなく、全て別々のブックです。
①マクロだけ実行するブック
②一枚目の画像のデータがあるブック
③追加で添付した画像のデータがあるブック
とそれぞれ3つ独立しています。
ブック①を実行して、ブック②と③をひらいて閉じるところまではなんとか書けたのですが。。。。
tom04様が回答してくださったマクロをそのまま別シートを指定しているところを別ブックに指定してあげればできますでしょうか。
すみません、再度回答お願いできますでしょうか。
私も回答をまっている間自分でも調べてやってみようと思います!
さらにで申し訳ないのですが、②のブックに不良品以外にも「廃棄」というステータスがある場合、それはマクロを実行した際に③ブックの不良品という列にカンマ区切りで型番が記載されてほしいのですが、こういったことは可能でしょうか・・・?
度々すみません。
一応、別ブックでなく、同ブック内で(表のデータは同じ)回答くださったマクロを貼り付けて実行してみたのですが、以下のエラーがでました。
------------------------------------------------
実行時エラー'1004':
アプリケーション定義またはオブジェクト定義のエラーです
------------------------------------------------
ステップ実行してみると
Range(.Cells(2, "A"), .Cells(lastRow, "A")).ClearContentsへいこうとすると上記のエラーがでました。
何か設定などいるのでしょうか
すみません、ご指摘の通り標準モジュールにしていなかったのが原因でした!(ちゃんと動きました。ありがとうございます。)
>>そして、最初の補足の件ですが
異なるブックが三つあり、一つのブックのマクロで他の二つのブックの操作だけをしたい!っていうコトでしょうか?
その通りでございます。
こちらの話になってしまうのですが、どうしてもそういった作りにしなくてはいけなくて・・・。
ひとまず動いたので、tom04さんのマクロがどういう風に動いているのか自分なりに読み解きたいと思います。
わざわざありがとうございます。
もし、時間がありましたらお願いいたします。厚かましくてすみませんが、お待ちしております。
C列のデータが何種類あっても対応できる方法を提示してくださり、ありがとうございます。
抽出元のC列に廃棄を入れて実行してみました。
私の伝え方が悪く、申し訳ないです。以下の画像のようにしたいです。
後出しで要望をだしてしまい、すみません。
自分のしたいことを纏めると
①一つのブックのマクロで他の二つのブックの操作がしたい。
②データ抽出後、良品列には「良品」の型番しかはいらないが、
不良品列には「良品」以外の型番が全て(不良品、廃棄)などがはいる。