質問: sheets("計算表").range("b37:i37").value sheets("在庫票").printout copies:=1 case else msgbox "商品棚番号不一致です" end select end sub
回答: no3です。 来週水曜まではエクセル環境がないので検証もできず、スマホからの回答のため、方法論と解説だけになってしまうことを、先にお断りしておきます。 どなたか別のかたが、具体的な回答を示してくださるかも知れません。 さて、no2で示した sheets("計算表").range("b7:i7").offset(row = def(n - 1)).value の方式は、棚番号によってb7:i7からm行分シフトした行の値を参照させるという考え方で、棚番号ごとのシフト行数(m)を最初に配列で定義しておくというものです。 ご提示のコードの場合、 row = def(n - 1) が、定義した配列名になっていないので、存在しない配列defを参照しようとしてエラーになっていると思われます。 また、配列の定義内容も上述の内容(=シフト行数)にはなっていませんね。 配列の内容は棚番号順に定義しておく必要がありますが、逆の参照になってしまっているように見受けられます。 一方で、添付の図を見ると、no3の回答で予想したようにc列に棚番号が示されているようですので、わざわざ同じような内容を配列で定義するよりも、c列の情報を利用するno3で示した方法の方が良さそうに感じられます。 コードのメンテナンスを考慮してもその方が良いのではないでしょうか。 no3にもかきましたが、具体的な処理としては、与えられた棚番号をc列から検索して、見つかった行番号のb列からi列までの値を使用するようにすれば良いと考えられます。 検索はワークシート関数のmatchを利用しても出来ますし、vbaのfindメソッドでも良いと思います。 ただし、棚番号に欠番があるとのことですので、検索してヒットしない場合も想定した処理にしておく必要があります。 ひとまずはこの程度で・・・