- ベストアンサー
VBAについて
皆様、こんにちは。 VBAを使って会計シートを作っていますが、初心者なので、色々と悩んでいます。今回、コンボボックスにセールをリンクして、コンボボックスで選ばれた値に合わせてシートの行を増やしたいですが、どうすればいいでしょうか?例えば、linked cellは2の場合は、 Range("D25:G27").Select Selection.Insert Shift:=xlDown 3の場合は Range("D25:G28").Select Selection.Insert Shift:=xlDown などのようにしたいですが、誰か詳しい方が教えてくだされば非常に助かります。どうぞよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No1です。 >IcValueとはなんですか? 値がどこにあるのか不明でしたので、その内容(数値)がlcValueという変数に取り込まれていると仮定して… という意味で適当に作成した変数名です。(回答文をもう一度読んでいただければ、意味が通じると思います) ご提示の補足を見たところ、E28の値のようですので、 IcValue = Range("E28").Value としておけば後半はそのまま使用できるでしょう。 ところで、ご提示のマクロの前半はコンボボックスを作成するマクロになっていますが、このマクロだと、マクロを走らせるたびに新しいコンボボックスが作成されることになりますけど…? (同じ位置に作成されるので、重なって見た目は一つに見えますが) 想像するところ、コンボボックスは手動でひとつだけ作成しておいて、マクロには不要ではないのでしょうか?
その他の回答 (2)
- DOUGLAS_
- ベストアンサー率74% (397/534)
.LinkedCell = "$E$28" で Range("D25:G26").Insert Shift:=xlDown とされたのでは、せっかくの「.LinkedCell」が下方向へ下がってしまって、参照できなくなりますので、「.LinkedCell 」は「"D25:G25"」より下には置かないようにして、例えばそのアドレスを「"$K$22"」とすると、下記のようなことになります。 Sub コンボボックス設置() ActiveSheet.DropDowns.Add(263.25, 310.5, 54.75, 15).Select With Selection .ListFillRange = "$K$23:$K$25" .LinkedCell = "$K$22" .DropDownLines = 8 .Display3DShading = False End With End Sub Sub 行の挿入() Dim MyRows As Byte MyRows = Application.WorksheetFunction.Index(Range("$K$23:$K$25"), Range("$K$22").Value) Range("D25").Resize(MyRows + 1, 4).Insert Shift:=xlDown End Sub
お礼
DOUGLAS_様、ご指摘やプロシージャの説明をどうもありがとうございました。確かに、LinkedCellの位置が間違っていました。 なるほど、行を変数にすればいいですね。ありがとうございました!
- fujillin
- ベストアンサー率61% (1594/2576)
ご提示以外の変数などが不明ですので… lcValueに対象となる値(2~3?)が入っていると仮定して、ベタで書くなら If lcValue=2 Then Range("D25:G27").Insert Shift:=xlDown ElseIf lcValue=3 Then Range("D25:G28").Insert Shift:=xlDown End If みたいな感じ? 必ず挿入する行があって、規則性があるなら Range("D25:G" & (25 + lcValue)).Insert Shift:=xlDown (lcValueは0以上の整数) という方法もあります。
補足
fujillin様、答えてくださってどうもありがとうございます。本当に初心者で申し訳ありませんが、IcValueとはなんですか? 次のように書いてみましたが、うまく動きません。まだ、足りないところがあるでしょうか? ActiveSheet.DropDowns.Add(263.25, 310.5, 54.75, 15).Select With Selection .ListFillRange = "$K$23:$K$25" .LinkedCell = "$E$28" .DropDownLines = 8 .Display3DShading = False End With If IcValue = 1 Then Range("D25:G26").Insert Shift:=xlDown ElseIf lcValue = 2 Then Range("D25:G27").Insert Shift:=xlDown ElseIf lcValue = 3 Then Range("D25:G28").Insert Shift:=xlDown End If End Sub
お礼
fujillin様、ご丁寧に教えていただいてどうもありがとうございました。おかげさまで行を増やす方法などについて理解できました。少しイメージと違って、結局全体のフォームの形を考え直す必要があることがわかりました。大変勉強になりました。