
No.5ベストアンサー
- 回答日時:
個人的には
>For シートNo = 2 To Worksheets.Count
>Set a_Sht = Sheets("一覧")
この Set a_Sht ~ はループ(For To~Next)の中で何度も実行せず、ループの前で1回だけで良いと思います。
シートの選択が固定されてますしね。
SheetsとWorksheetsは厳密には違いますので(今はあまり意識して使われないかもですが)、Worksheetsに統一が宜しいのでは?
Set a_Sht = Worksheets("一覧") '←ここ
For シートNo = 2 To Worksheets.Count
'★Set a_Sht = Sheets("一覧")
あ、でもシートをSelectとかしているってなら上記はまずいかもですが、その先が不明なので・・・
No.4
- 回答日時:
No3の方のアドバイスに従い、Dictionaryオブジェクトをつかってみました。
Public Sub 個数梱包設定()
Dim ws1 As Worksheet '一覧シート
Dim ws2 As Worksheet '左から4番目以降のシート
Dim maxrow1 As Long '一覧シート最大行
Dim maxrow2 As Long '左から4番目以降のシートの最大行
Dim row1 As Long '一覧シート行番号
Dim row2 As Long '左から4番目以降の行番号
Dim dicT As Object 'Dictionary キー:コード+品名 値:一覧シートの行番号
Dim key As String 'Dictionaryのキー
Dim i As Long
Set dicT = CreateObject("Scripting.Dictionary") ' Dictionay定義
Set ws1 = Worksheets("一覧")
maxrow1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row 'A列 最終行を求める
'Dictionaryを作成
For row1 = 3 To maxrow1
key = ws1.Cells(row1, "A").Value & "|" & ws1.Cells(row1, "E").Value
dicT(key) = row1
Next
'左から4番目以降のシートを右へ順番に処理する
For i = 4 To Worksheets.Count
Set ws2 = Worksheets(i)
maxrow2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row 'A列 最終行を求める
For row2 = 4 To maxrow2
key = ws2.Cells(row2, "A").Value & "|" & ws2.Cells(row2, "B").Value
'コード+品名が一覧シート内にあるなら設定する
If dicT.exists(key) = True Then
row1 = dicT(key)
ws1.Cells(row1, "F").Value = ws2.Cells(row2, "C").Value '個数設定
ws1.Cells(row1, "G").Value = ws2.Cells(row2, "D").Value '梱包設定
End If
Next
Next
MsgBox ("完了")
End Sub
No.3
- 回答日時:
>4) 4番目のシートG列の値を
D列ではなくて?
それと画像と実際のセル開始位置(シート名:”一覧”)は違うのですか?
多分Dictionaryオブジェクトを使うと楽だと思いますよ。
まだ未経験であれば最初はきついかもですけど、過去質で Dictionary を検索しExcelの質問を探し出してみるとかですかね。
と同時にネット検索をして基本的な使い方『 VBA Dictionaryオブジェクト 』を知ることが先かな。
No.2
- 回答日時:
面倒なんでワークシート名を全部取得すれば良い。
そのあと、それを使って処理をする。
・・・
Dim i As Long
Dim SheetsCnt As Long
'これでワークシートの数を取得できる。
'ThisWorkbook.Sheets.Count
'ここから全てのワークシート名を取得する。
SheetsCnt = ThisWorkbook.Sheets.Count
For i = 1 To SheetsCnt
Debug.Print Sheets(i).Name
'シート名をセルの上に表示する。
'Cells(i, 1).Value = Sheets(i).Name
Next
・・・
こんな感じ。
取得したシート名をセルの上に表示するなら、コメントにした
'Cells(i, 1).Value = Sheets(i).Name
これをコメントアウトしてください。
No.1
- 回答日時:
まずは選択するための条件を「箇条書き」にしてみましょう。
そのうえで、どの順番に条件を比較すれば良いかを決め、
1、その順番に対象を比較する。
2、条件が満たされたらコピーする。
3、比較対象が他にあれば1へ戻り、無ければ終了。
こんなコードにすればいい。
とりあえず「箇条書き」から始めてみましょう。
・・・余談・・・
ここは「代わりに作ってください」と作業依頼する場所ではありません。
自力で解決できるようになるためのアドバイスをもらう場所です。
もしも代わりに作ってもらうことを希望しているのであれば、他の有料サイトを利用するようにしましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】2つのシートの値を比較...
-
Worksheets メソッドは失敗しま...
-
文字列の結合を空白行まで実行
-
【VBA】複数行あるカンマ区切り...
-
VBAで、離れた複数の列に対して...
-
vba 2つの条件が一致したら...
-
複数情報が入っている1行を、複...
-
R言語で、列名でループ
-
URLのリンク切れをマクロを使っ...
-
VBAの初心者なのですが、「並び...
-
IIF関数の使い方
-
列の最終行までのセルと1つ隣の...
-
VBAの質問です msg = ws.Cel...
-
VBAを使って検索したセルをコピ...
-
VBAで、特定の文字より後を削除...
-
Cellsのかっこの中はどっちが行...
-
B列の最終行までA列をオート...
-
Changeイベントでの複数セルの...
-
C# 列の挿入
-
DataGridViewに空白がある場合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA sum ワークシートChange
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
URLのリンク切れをマクロを使っ...
-
【VBA】2つのシートの値を比較...
-
rowsとcolsの意味
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
B列の最終行までA列をオート...
-
VBAでのリスト不一致抽出について
-
複数の列の値を結合して別の列...
-
VBA 何かしら文字が入っていたら
-
VBAのFind関数で結合セルを検索...
-
エクセル 2つの表の並べ替え
-
DataGridViewに空白がある場合...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
【VBA】複数行あるカンマ区切り...
-
ExcelVBAでテキストルーレット...
おすすめ情報
<コピーの条件>
1)4番目のシートA列のコードと一覧シートA列を照合し一致
2)4番目のシートB列の品名と一覧シートのE列を照合し一致<1)2)が一致したら>
3) 4番目のシートC列の値を一覧シートF列へ貼り付ける
4) 4番目のシートG列の値を一覧シートG列へ貼り付ける
5)5番目以降のシートで1)から4)を繰り返す
頭を整理して下記コードを書いたのですがシート名100001の転記しか出来ず、他のシートを繰り返す記述が分かりません。どのように変えたら良いか教えてください。
Dim a_Sht As Worksheet
Dim b_Sht As Worksheet
Dim MyList() As Variant
Dim LastRow As Long
Dim i As Long
Dim j As Long
Set a_Sht = Sheets("一覧")
Set b_Sht = Sheets("100001")
b_Sht.Select
MyList = b_Sht.Range("A2", Range("A" & Rows.Count). _
End(xlUp)).Resize(, 4).Value
LastRow = a_Sht.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LastRow
For j = 1 To UBound(MyList)
If a_Sht.Cells(i, 1) = MyList(j, 1) And _
a_Sht.Cells(i, 2) = MyList(j, 2) Then
a_Sht.Cells(i, 6) = MyList(j, 3)
a_Sht.Cells(i, 7) = MyList(j, 4)
End If
Next j
Next
下記へ変更し結果は得られたのですがあってますでしょうか。ご指摘があれば教えてください。
Dim a_Sht As Worksheet
Dim b_Sht As Worksheet
Dim MyList() As Variant
Dim LastRow As Long
Dim i As Long
Dim j As Long
Dim シートNo As Long
For シートNo = 2 To Worksheets.Count
Set a_Sht = Sheets("一覧")
Set b_Sht = Worksheets(シートNo)