- ベストアンサー
ユーザーフォームから可視セルを隣のセルに移動したい
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ANo.1です。 個人的な好みもありますが、ユーザーフォームは何かをそこで入力させたりする場合に使う場合が多いので、メッセージを表示したりボタンを一つ押すだけのフォームはあまり見ませんね。 ユーザーフォームを使うんなら、県の選択もユーザーフォーム中でやった方がしっくりします。 ユーザーフォームを使わないなら、メッセージはMsgboxで出して、マクロはシート上に張り付けたボタンで起動が良いと思います。 一応、県の選択もユーザーフォーム上で行う場合のサンプルです。 Z列とAA列を作業列として使用しています。 Private Sub UserForm_Initialize() 'C列の重複無LISTをZ列に作成 With Worksheets("Sheet1") .Columns("Z:AA").ClearContents .Range("C:C").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("Z1"), Unique:=True nList = .Cells(Rows.Count, 26).End(xlUp).Row End With 'ListBoxに重複無Listをセット With ListBox1 .RowSource = "Sheet1!Z2:Z" & nList .ColumnHeads = True .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption End With End Sub Private Sub CommandButton1_Click() '選択されたもののリストをAA列に作成 j = 1 For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) Then Worksheets("Sheet1").Range("AA" & j) = ListBox1.List(i) j = j + 1 End If Next i If j = 1 Then Hide Exit Sub End If '選択された県のA列の値をB列に With Worksheets("Sheet1") For k = 2 To .Cells(Rows.Count, 1).End(xlUp).Row sTraget = .Range("C" & k).Value If WorksheetFunction.CountIf(.Range("AA1:AA5"), sTraget) > 0 Then .Cells(k, 2) = .Cells(k, 1) .Cells(k, 1) = "" End If Next k End With Hide End Sub
その他の回答 (1)
- mt2008
- ベストアンサー率52% (885/1701)
1.メッセージはセルのコメントで表示しましょう。 2.オートフィルタ終了のイベントはありませんので、自動で次の処理に進むのは無理です。 オートフィルタ後に、マクロを手動で動かすようにします。 3.オートフィルタ後の処理は以下の様なマクロになります。 Sub Sample() With ActiveSheet If .AutoFilterMode Then If .AutoFilter.Filters(1).On Then For Each c In .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible) If c.Row <> 1 Then Cells(c.Row, 2) = Cells(c.Row, 1) Cells(c.Row, 1) = "" End If Next c .Range("C1").AutoFilter Field:=1 Else MsgBox ("オートフィルターで絞り込まれていません") End If End If End With End Sub
補足
早速の回答ありがとうございます。 これは、CSVファイルからデータを取り込むマクロの途中で、ユーザーフォームを挿入して処理を一旦止めてユーザーに選択をしてもらいたいのです。 オートフィルター終了のイベントが無いとのことですが、そのためにユーザーフォーム上のOKボタンをクリックしたら、後のマクロを走らせるようにしたいと思うのですが、いかがでしょう。
お礼
ありがとうございます。 ユーザーフォームを使う方法、メッセージボックスを使う方法、両方検討してみます。 これでようやく、懸案が解決しそうです。