こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

EXCEL VBA Array要素記述を変更したい

プログラムの中にセルの値を直接記入しているところがあます。
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

投稿日時 - 2013-12-08 22:12:07

QNo.8378749

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

(後略)

投稿日時 - 2013-12-10 02:51:04

ANo.1

>プログラムには101, 102, 103, 104ではなくB10~B13を使用したい

一連のご相談の一番最初に躓いていた問題点ですが、「文字列の101」と「数値で記入された101」は「別物(等しくない)」というお話は、覚えていますね?
セルに何も考えず101と記入していたのでは、この問題が再発します。そうさせないために(このご相談でぼんやりと示唆されている)あなたのエクセルの実態に応じて、何某か適切な工夫をしてください。


簡単な方法:
B10:B13に「必ず」文字列の書式を施しておき、かつ「絶対に変更されない」よう、必要な措置を行う

簡単な方法:
B10:B13には「数値になり得るモノは必ず数値で」記入されるよう、必要な措置を行う
さらにシート名も「数値化し得るモノは数値に変えて」B10:B13を直接探し、C列を取り出す

あまり簡単ではない方法:
B10:B13の内容を「文字列化して変数に読み込み」、それを手掛かりにC列を参照する




>実際には4つだけではなく何十個もあって作業がわずらわしくなるのと、ブックごとに値が異なって

あなたのエクセルが具体的に事実としてどのようになってるのかあいまいなままなので、(それっぽい回答は多分沢山寄せられると思いますが)どんぴしゃの的確なアドバイスは現時点では得られないでしょう。(ま、可能性として誰かがたまたまビンゴを引いてくれるかも?しれませんけどね。そういう当てモノクイズに振り回されるのも、回答者としては願い下げです。)

投稿日時 - 2013-12-08 22:58:41

補足

何度も回答いただき、ありがとうございます。
わかりにくい質問をしてしまって申し訳ございません。お詫び申し上げます。
また、肝心なところで質問に誤記がありました。
「プログラムには101, 102, 103, 104ではなくA10~A13を使用したい」の誤りです。

悩んでいたのは下記の方法でした。
あまり簡単ではない方法:
A10:B13の内容を「文字列化して変数に読み込み」、それを手掛かりにC列を参照する。

投稿日時 - 2013-12-09 23:50:56

あなたにオススメの質問