エクセルVBAでリストボックスとコマンドボタンの操作方法

このQ&Aのポイント
  • エクセルVBA初心者の方からの質問です。ユーザーフォームに配置されたリストボックスとコマンドボタンについて操作方法を教えてほしいとのことです。
  • 質問者はリストボックスから選択された項目を取得し、それに応じてセルの内容を削除するVBAコードを作成しています。しかし、最終行のセルを削除する場合に罫線も一緒に削除されてしまう問題が発生しているようです。
  • 質問者は、最終行のセルを削除する際には罫線は残したままにしたいと考えています。そのために、消去対象のセルが最終行のセルであるかどうかを判定する条件式を作成したいとのことです。
回答を見る
  • ベストアンサー

エクセルVBAについて質問です。初心者です。

エクセルVBAについて質問です。初心者です。 ユーザーフォームにリストボックスとコマンドボタンを1つずつ配置しています。  A列 B列 りんご 1 みかん 2 (りんご、みかん、1、2を太い罫線で四角に囲んでいます)    リストボックスには「りんご」と「みかん」が入っていて、りんごを選びコマンドボタンを押すと、「りんご」と「1」のセルが消去され、上方向にセルをずらすようにしています。 「みかん」を選びコマンドボタンを押すと「みかん」と「2」のセルが消えるのですが、そのとき「みかん」と「2」のセルの下段に引いている罫線まで消えてしまうのです。これを阻止する方法を教えていただけないでしょうか。 以下はコードです。 Private Sub CommandButton1_Click() Range("A1").Offset(ListBox1.ListIndex).Delete Shift:=xlUp Range("A1").Offset(ListBox1.ListIndex, 1).Delete Shift:=xlUp Unload UserForm1 End Sub おそらくこれに 「もし消去対象のセルが最終行のセルであれば With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With これを行いなさい」という感じのコードを作ればいいと思うのですが、『もし消去対象のセルが最終行のセルであれば』の部分がうまく作れません…。 なおA列、B列の文字・値はどんどん増えていく可能性があるので最終行を使っています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

こんな感じで Private Sub CommandButton1_Click() If Cells(Rows.Count, 1).End(xlUp).Row = 1 Then Range("A1").Offset(ListBox1.ListIndex).ClearContents Range("A1").Offset(ListBox1.ListIndex, 1).ClearContents Else Range("A1").Offset(ListBox1.ListIndex).Delete Shift:=xlUp Range("A1").Offset(ListBox1.ListIndex, 1).Delete Shift:=xlUp End If Unload UserForm1 End Sub 参考まで

kamioni
質問者

お礼

自分でああでもない、こうでもないといろいろコードをいじってたら出来ました!出来たとき思わずうなり声が上がりました! いろいろお手数おかけしましたm(__)m

kamioni
質問者

補足

丁寧な回答をいつもありがとうございますm(__)m 「ClearContents」を使うとセルに書かれている文字はなくなりますが、罫線等は残ったままになってしまいます。「みかん」「2」と書かれているセルに色も塗ってあるので、最終行を消すコードはやはり「Delete Shift:=xlUp」でないとマズイと思います…。 セルを消去したとき、それが最終行であれば最終行の上段に罫線を、または最終行-1の下段に罫線を引くというようにしたいのですが…。もうちょっとで出来そうなのですが、出来ません…。

関連するQ&A

  • エクセルVBA初心者です。

    エクセルVBA初心者です。 ユーザーフォームを使ったセルの上書きについて質問があります。(以下は自分が作成済みの内容)   A  B  りんご 1  みかん 2 これらがセルにあります。この中から上書きしたいものを取得します。 ユーザーフォーム1にリストボックスとコマンドボタンを1つずつ設置し、そのリストボックスにA列の文字を入れました。リストボックスの中から上書きしたい文字を選択し、コマンドボタンを押すと、ユーザーフォーム2が表れ、そこには2つのテキストボックスと1つのコマンドボタンがあります。 ここからが分からないのですが、例えば上書きしたい文字に「みかん」を選び、ユーザーフォーム2のテキストボックス1に「バナナ」、テキストボックス2に「3」といれると   A  B  りんご 1  バナナ 3 このようにしたいのです。 実際はもっと複雑な内容のものを作成しております。しかし上記の疑問が解決すれば、今自分が抱えている問題も解決すると思います。 以下はユーザーフォーム1のコードです。これを提示することにより回答される方が楽になるかどうかは分かりませんが、一応提示しておきます。(lstRowを使っている理由はA列とB列の文字・値が増加していく可能性があるため) Private Sub UserForm_Initialize() CommandButton1.Enabled = False    Dim lstRow As Long    Dim i As Long    Dim q As Long ListBox1.Clear ListBox1.ColumnCount = 2 ListBox1.ColumnWidths = "200 pt"    lstRow = Cells(Rows.Count, 1).End(xlUp).Row q = 0      For i = 2 To lstRow With ListBox1 .AddItem .List(q, 0) = Cells(i, "C").Value End With q = q + 1 Next End Sub ============================================================================ Private Sub CommandButton1_Click() UserForm2.TextBox1.Value = Me.ListBox1.Value Unload UserForm1 UserForm2.Show End Sub

  • 【VBA】「同じ文字を含むセルがあるならば」とやりたい

    こんばんは。 エクセル2003を使用しています。 例えば A1→「りんご」 A2→「りんご食べたい」 の場合、 「りんご」は2個以上あります としたいのですがうまくいきません。 Sub 重複() For 行 = 1 To Cells(65536, 1).End(xlUp).Row If Cells.Find(what:=Range("a" & 行), LookAt:=xlPart) Is Nothing Then Else 'あるならば MsgBox Range("a" & 行) & "は2個以上あります" End If Next End Sub これだと取得セルもカウントされてしまうため、必ずMsgBoxが表示されてしまいます。 どうすれば取得セル意外にも取得セルを含むセルがあるかを調べられるのでしょうか? そしてこれは A1→「りんご」 A2→「りんご食べたい」 A3→「みかん」 A4→「みかんはオレンジ」 A5→「バナナ」 ・ ・ ・ と続いており 最終的には →「りんご食べたい」 →「みかんはオレンジ」 →「バナナ」 にしたいのです。 よろしくお願いします。

  • エクセルVBA

    エクセル2003です エクセルの印刷レビュ-までのマクロをおしえてください *A列からQ列までで行は1~150で伸縮します  最終行をA5より下のA列のセルに値が連続で入っている最後が最終印刷範囲行とします *罫線ありです *1ページを30行とします *2ページ目からの先頭行に(A7:Q7)を印刷に入れたい *ヘッダーは右上に日付 *フッダーは右下にページ 現状では罫線で最終行が決まってしまいます 現状コード Sub 印刷() With ActiveSheet.PageSetup .PrintTitleRows = "$7:$7" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = Range("A1:Q1").Resize(Range("A" & Rows.Count).End(xlUp).Row).Address With ActiveSheet.PageSetup .RightHeader = "&""MS Pゴシック,太字 斜体""&14&D" .RightFooter = "&""MS Pゴシック,太字 斜体""&14&P/&N" .PaperSize = xlPaperA4 .Zoom = 75 .PrintErrors = xlPrintErrorsDisplayed End With ActiveWindow.SelectedSheets.PrintPreview End Sub 罫線ではなくA列のセルに文字列等が入っている行を最終行にしたいのですが 教えて頂けないでしょうか? 出来れば説明付きでよろしくお願いします

  • エクセルVBA ListBox選択を反映させる

    いろいろ試みたのですが、分からないので教えてください ・ユーザーフォームにListBox1、ListBox2があります ・やりたいこと ●ListBox1=ListBox2場合、A2にListBox1の値を入力 (ex)ListBox1がH8 (1996)、ListBox2がH8 (1996)の場合、A2に「H8」と入力 ●ListBox1がListBox2と1年違う場合、A2とA3にその間の期間を入力 (ex)ListBox1がH8 (1996)、ListBox2がH9 (1997)の場合、A2に「H8」、A3に「H9」と入力 ●ListBox1がListBox2と2年違う場合、A2とA4にその間の期間を入力 (ex)ListBox1がH8 (1996)、ListBox2がH10 (1998)の場合、A2に「H8」、A3に「H9」、A4に「H10」と入力 ・作成したもの1 Private Sub ListBox1_Change()     With ListBox2     .Clear     Select Case UserForm1.ListBox1.List(ListBox1.ListIndex)     Case "H8 (1996)"       .List = Array("H8 (1996)", "H9 (1997)", "H10 (1998)")     Case "H9 (1997)"       .List = Array("H9 (1997)", "H10 (1998)")     Case "H10 (1998)"       .List = Array("H10 (1998)")     End Select     .ListIndex = 0     End With End Sub ・作成したもの2 If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 End If If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) + 1 = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1987 End If If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) + 2 = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1987 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1986 End If ・困ったこと (1) ListBox1を選択した時、ListBox2の表示を切り替えられるようにしており、選択したように青になっていますが、実際はListBox2を選択していないようです ListBox1をH8にクリックしてから、ListBox2をH9やH10を選択して、再度H8を選択しなおさなければ、エラーになってしまいます (2)ListBox1とListBox2が1年違い、2年違いの場合、うまくいかずセルに入力されない もし分かる方がいらっしゃいましたら、教えてください よろしくお願いします

  • Excel VBA の作り方について【初心者】

    Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)D1セルに「山本」を抜き出して表示 (2)E1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成しております。 Sub macro1() '行数確認 nr = Range("A1048576").End(xlUp).Row For i = 1 To nr '名前抜き出し x = Range("A1").Offset(i - 1) j1 = InStr(x, "【") j2 = InStr(x, "】") Range("D1").Offset(i - 1) = Mid(x, j1 + 1, j2 - j1 - 1) '分表示 x = Range("B1").Offset(i - 1) Range("E1").Offset(i - 1) = Int(x * 24 * 60) Next i End Sub ここまではプログラムが完成しています。 この後、 (4)C列セルに入力されている数値をF列セルにそのまま入力 したい場合には、どの部分にどのようなプログラムを追加すればよいでしょうか? よろしくお願いします。

  • VBE、ユーザーフォームに関して質問があります。VBAを知って1カ月に

    VBE、ユーザーフォームに関して質問があります。VBAを知って1カ月に満たない初心者です。 ユーザーフォームでテキストボックスとコマンドボタンを1つずつ作りました。コマンドボタンを押すとテキストボックスに入れた文字・値がセルB1に入力されるようにしました。続けてテキストボックスに文字・値を入力し、コマンドボタンを押すとB2に入力されるようにしています。 ここからが質問なのですが、 コマンドボタンを押したときにA1に番号を順にふり、さらにセルを罫線で囲みたいのです。図で示すと、  A   B        A   B  _ ___      _ ___  |1|りんご| ⇒ |1|りんご|  - ---      - ---               |2|みかん|                - ---   このような感じです。また、外枠のみを太線にするということが可能であればその方法も教えて下さい。

  • エクセルで結合セルがあるため最終行が解りません。

    エクセルで結合セルがあるため最終行が解りません。 A列2行目と3行目が結合セル(見出し)のためA列の最終行(罫線を除きデータが入ってる行)を求めれなくて困ってます。データは4行目以降から入力していく予定ですが Range("A" & Rows.Count).End(xlUp).Row は2となるため+1で入力行を求めてると3となってしまいます。A4からAの最後の行の範囲で罫線を除く最終行を出せればよいのですが  最初は4 以下順次5 6 7 ‥ どなたかご教示頂けないでしょうか?

  • エクセルVBA

    エクセル2003です エクセルの印刷するマクロをおしえてください *A列からQ列までで行は1~300で伸縮します  最終行をA5より下のA列のセルに値が連続で入っている最後が最終印刷範囲行とします *罫線ありです *1ページを30行とします *2ページ目からの先頭行に(A4:Q4)を印刷に入れたい マクロで印刷設定をした事がないのでさっぱりわかりません *ヘッダーとフッダーも可能でしょうか? 出来れば説明付きでよろしくお願いします

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • エクセルVBA 繰返し処理

    下記のようにA、B列があって、B列の”くさっている”をB列の一番下のセルから順番に調べていき、最後に”くさっている”ものとしてA列の”いちご””りんご”をメッセージボックスに出力するような方法を教えて下さい。 ちなみに列の指定は列全体です。 また、コマンドボックスをクリックした時にこのメッセージがでるようにしたいです。 A列   B列 みかん りんご くさっている いちご くさっている めろん

専門家に質問してみよう