電子書籍の厳選無料作品が豊富!

Windows7 Excel2007でマクロ作成中の初心者です。
やりたいことは、リストボックスからシートを選択し、そのシートを削除する。
削除したら、リストボックスの中の、シート選択状態を解除し、その項目だけを
削除することです。
以下のコードで出来たのですが、これを統合して一個のコードにしたいです。
どうしたらよろしいでしょうか。


Private Sub 顧客削除_Click()
Dim i As Integer
Dim btn
Dim name As String
With 顧客リスト
For i = 0 To .ListCount - 1
If .Selected(i) Then
name = .list(i) '選択されたリストを変数に格納
btn = MsgBox("本当に、 " & name & " さんを削除していいですか?", _
vbYesNo, "削除の確認")
If btn = vbYes Then
Application.DisplayAlerts = False
Worksheets(Mid(.list(.ListIndex - 0), InStr(.list(.ListIndex - 0), " ") + 1)).Delete
Application.DisplayAlerts = True
リストボックスの項目削除
End If
End If
Next i
Worksheets(1).Activate
End With
ActiveWorkbook.Save
Application.ScreenUpdating = True
End Sub
-----------------------------
Sub リストボックスの項目削除()
Dim i As Integer
For i = 顧客リスト.ListCount - 1 To 0 Step -1
If 顧客リスト.Selected(i) Then
顧客リスト.RemoveItem (i)
Exit For
End If
Next i
End Sub

A 回答 (2件)

>それぞれのシートの名前が顧客の名前になっています。


ですよね。

Dim i As Integer
Dim btn
Dim name As String
With 顧客リスト
Application.DisplayAlerts = False

For i = 0 To .ListCount - 1
If .Selected(i) Then
name = .list(i) '選択されたリストを変数に格納
btn = MsgBox("本当に、 " & name & " さんを削除していいですか?", _
vbYesNo, "削除の確認")
If btn = vbYes Then
Worksheets(name).Delete
End If
End If
Next i

.Clear
For i = 2 To Worksheets.Count
.AddItem Sheets(i).name
Next

Application.DisplayAlerts = True
Worksheets(1).Activate
End With


Private Sub UserForm_Initialize()
With 顧客リスト
For i = 2 To Worksheets.Count
.AddItem Sheets(i).name
Next
End Sub

で十分ではないでしょうか?
Sheets(1)は削除しないものとしてです。
Application.DisplayAlerts = False
もFor~Nextの外側で十分ですね。
位置側に書くと何度もパソコンに無駄な動作をさせてしまいますね。

この回答への補足

お世話になります。今試してみました。
一番上のシート--顧客の名前が表示されませんが
削除等は完璧にできました。
Private Sub UserForm_Initialize()
Dim i As Integer
With 顧客リスト
For i = 2 To Worksheets.Count - 3
.AddItem Sheets(i).name
Next
End With
End Sub
今まで使っていたコードで修正していただくとあありがたいです。これだとすべての顧客がInitialize時に表示されるので・・以下のコードに入れ替えて実行するとエラーになります。

Private Sub UserForm_Initialize()
Workbooks("請求").Activate
Dim i As Integer
Const EXCEPT_NAME = "分類●経理●一覧●"
For i = 1 To Worksheets.Count - 3
If InStr(EXCEPT_NAME, Worksheets(i).name & "●") = 0 Then
顧客リスト.AddItem i & " " & Worksheets(i).name
End If
Next i
End Sub

補足日時:2013/03/19 06:41
    • good
    • 0
この回答へのお礼

教えていただいた、コードを1行一句ためしてみました。
なんとうまくできました。ありがとうございました。

お礼日時:2013/03/20 09:57

前回回答したものです。

少し補足をしてください。
顧客リストはどうやって取得しているのですか?
どこかのセルにリストがあって、ROWSOURCEで指定しているのか
Private Sub UserForm_Initialize()
を使ってVBAで取得しているのか
それと、顧客リスト=シート名ではないのか
と云う疑問がありますが、違っていますか?

この回答への補足

すいません。Private Sub UserForm_Initialize()
を使ってVBAで取得しています。
30以上のシートがあり、それぞれのシートの名前が顧客の名前になっています。

補足日時:2013/03/18 21:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!