プログラムの中にセルの値を直接記入しているところがあます。
Select Caseの行の 「Array("101", "102", "103", "104")」のとろです。
プログラムには101, 102, 103, 104ではなくB10~B13を使用したいのですが、うまくできません。
実際には4つだけではなく何十個もあって作業がわずらわしくなるのと、ブックごとに値が異なって
汎用性がないためです。
アドバイスいただけると助かります。
初歩的なことを質問しているかも入れませんが、よろしくお願いいたします。
シート名「表紙」のA列は部品番号(=シート名)でA10:101 A11:102 A12:103 A13:104とします。
これに対応したシートが4つあり、シート名は、「101」「102」「103」「104」とします。
使用者は「表紙」のシートで下記の作業を行います。
B6セルには製造番号(例:AM01-130012)を入力します。
B10~B13セルは「○」「×」を入力規則から選択します
○を選択した隣のC10~C13セルは部品個数で1~9の数値を入力規則から選択します。
○を選択したのと同じ行のD10~L10、D11~L11、D12~L12、D13~L13セルに、
文字列を入れる場合と入れない場合があります。文字列は左のD列から順に入れます。
下記マクロにて「○」となっているシートのみコピーを作成します。(1)
コピーしたシートすべてのB1セルに製造番号を入力します。(2)
D列に文字列があれば、コピーした対応するシートの中のH3~P3セルへ貼り付けます。(3)
C列の値によって、コピーした対応するシートの中のH3~P3セルの値をクリアします。(4)
<表紙のシート>
A B C D E F G H I J K L
5
6 AM01-130012
7
8
9
10 101 × 9
11 102 ○ 3
12 103 ○ 8 A1-1 A1-2 A1-3 A1-4 A1-5 A1-6 A1-7 A1-8
13 104 × 9
<プログラム>
Sub TestSample()
Dim c As Range
Dim 製造番号 As String
Dim flg As Boolean
flg = True
With ThisWorkbook
製造番号 = .Worksheets("表紙").Range("B6").Value
For Each c In .Worksheets("表紙").Range("B10:B13")
If c.Value Like "○*" Then
' ' (1)
If flg Then ' 初めてなら、○に対応したシートを「新しいブックにコピー」
.Worksheets(c.Offset(, -1).Text).Copy
flg = False
Else ' それ以外なら、○に対応したシートをアクティブブックの最後にコピー追加
.Worksheets(c.Offset(, -1).Text).Copy After:=Worksheets(Worksheets.Count)
End If
' ' (2)
' ' コピーしたすべてのシート(のB2)に製造番号を書き込む
Range("B1").Value = 製造番号
' ' (3)
' ' ○の行のD:L を 対応するシートのH3:P3 へ貼り付け
If c.Offset(, 2) <> "" Then ' D列が空でなければ
Range("H3").Value = c.Offset(, 2).Value
Range("I3").Value = c.Offset(, 3).Value
Range("J3").Value = c.Offset(, 4).Value
Range("K3").Value = c.Offset(, 5).Value
Range("L3").Value = c.Offset(, 6).Value
Range("M3").Value = c.Offset(, 7).Value
Range("N3").Value = c.Offset(, 8).Value
Range("O3").Value = c.Offset(, 9).Value
Range("P3").Value = c.Offset(, 10).Value
End If
End If
Next c
End With
' ' (4)
For Each 各シート In Worksheets
With 各シート
.Activate
Select Case ThisWorkbook.Worksheets("表紙").Cells(Application.Match(各シート.Name, Array("101", "102", "103", "104"), 0) + 9, "C").Value
Case "1" '1のときの仕事をする
Range("I3:P3").Select
Selection.ClearContents
Case "2" '2のときの仕事をする
Range("J3:P3").Select
Selection.ClearContents
Case "3" '3のときの仕事をする
Range("K3:P3").Select
Selection.ClearContents
Range("J3").Select
Case "4" '4のときの仕事をする
Range("L3:P3").Select
Selection.ClearContents
Case "5" '5のときの仕事をする
Range("M3:P3").Select
Selection.ClearContents
Case "6" '6のときの仕事をする
Range("N3:P3").Select
Selection.ClearContents
Case "7" '7のときの仕事をする
Range("O3:P3").Select
Selection.ClearContents
Case "8" '8のときの仕事をする
Range("P3").Select
Selection.ClearContents
Case "9" 'do nothing
Case Else
End Select
End With
Next
If flg Then
MsgBox "部品番号が選択されていません。"
Exit Sub
End If
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんなんでもいいかも。
作成例:
sub macro1()
dim s
For Each 各シート In Worksheets
s = 各シート.name
select case application.vlookup(iif(isnumeric(s), val(s), s), worksheets("表紙").range("A10:C13"), 3, false)
case 1
:
まぁでも、
>悩んでいたのは…
やりたいようにやりたいのでしょうから、どうぞお好きに。
作成例:
sub macro2()
dim a
dim i as long
a = application.transpose(worksheets("表紙1").range("A10:A13").value)
for i = 1 to ubound(a)
a(i) = a(i) & ""
next i
(中略)
select case worksheets("表紙").cells(application.match(各シート.name, a, 0) + 9, "C").value
case 1
(後略)
No.1
- 回答日時:
>プログラムには101, 102, 103, 104ではなくB10~B13を使用したい
一連のご相談の一番最初に躓いていた問題点ですが、「文字列の101」と「数値で記入された101」は「別物(等しくない)」というお話は、覚えていますね?
セルに何も考えず101と記入していたのでは、この問題が再発します。そうさせないために(このご相談でぼんやりと示唆されている)あなたのエクセルの実態に応じて、何某か適切な工夫をしてください。
簡単な方法:
B10:B13に「必ず」文字列の書式を施しておき、かつ「絶対に変更されない」よう、必要な措置を行う
簡単な方法:
B10:B13には「数値になり得るモノは必ず数値で」記入されるよう、必要な措置を行う
さらにシート名も「数値化し得るモノは数値に変えて」B10:B13を直接探し、C列を取り出す
あまり簡単ではない方法:
B10:B13の内容を「文字列化して変数に読み込み」、それを手掛かりにC列を参照する
>実際には4つだけではなく何十個もあって作業がわずらわしくなるのと、ブックごとに値が異なって
あなたのエクセルが具体的に事実としてどのようになってるのかあいまいなままなので、(それっぽい回答は多分沢山寄せられると思いますが)どんぴしゃの的確なアドバイスは現時点では得られないでしょう。(ま、可能性として誰かがたまたまビンゴを引いてくれるかも?しれませんけどね。そういう当てモノクイズに振り回されるのも、回答者としては願い下げです。)
この回答への補足
何度も回答いただき、ありがとうございます。
わかりにくい質問をしてしまって申し訳ございません。お詫び申し上げます。
また、肝心なところで質問に誤記がありました。
「プログラムには101, 102, 103, 104ではなくA10~A13を使用したい」の誤りです。
悩んでいたのは下記の方法でした。
あまり簡単ではない方法:
A10:B13の内容を「文字列化して変数に読み込み」、それを手掛かりにC列を参照する。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで別シートの同じ位置...
-
エクセルの下部のシートタブの...
-
EXCELでコピーしたグラフのデー...
-
ワークシートの行が途中から表...
-
エクセルでセルの書式設定がで...
-
Excelで大量の2000個のリストを...
-
エクセルで数式は残したまま他...
-
シート全体を他のブックのシー...
-
VBA アクティブでないシートの...
-
ロックしたセルのコピー&貼り付け
-
Excelで保護のかかったシートの...
-
シート保護してても並び替えを...
-
行の挿入ができなくなった
-
excelで勝手にテキストボックス...
-
EXCELで複数シート作成後、全シ...
-
エクセルで打ち込んだ数字を自...
-
【エクセル】表から条件に合っ...
-
エクセルのマクロでコピー後の...
-
コピー&ペーストすると、VLOOK...
-
エクセルファイルの容量が大き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで別シートの同じ位置...
-
エクセルでセルの書式設定がで...
-
エクセルの下部のシートタブの...
-
EXCELでコピーしたグラフのデー...
-
シート全体を他のブックのシー...
-
ワークシートの行が途中から表...
-
ロックしたセルのコピー&貼り付け
-
excelで勝手にテキストボックス...
-
Excelで保護のかかったシートの...
-
エクセルで数式は残したまま他...
-
VBA アクティブでないシートの...
-
Excelで大量の2000個のリストを...
-
エクセルで打ち込んだ数字を自...
-
シート保護してても並び替えを...
-
【エクセル】表から条件に合っ...
-
【エクセル】数式のセル番地を...
-
シート保護したExcelへの画像貼...
-
コピー&ペーストすると、VLOOK...
-
EXCELで複数シート作成後、全シ...
-
エクセルで多数のシートをまと...
おすすめ情報