• ベストアンサー

ユーザーフォームから可視セルを隣のセルに移動したい

ExcelのVBAを走らせて 状態(1)まで来たところでユーザーフォームをモードレスで表示する。 ユーザーフォームのラベルには、"選択しない県はオートフィルターのチェックを外して下さい。"と表示して、選択をしてもらう。 状態(2)になったら、要素1の可視セルの数値を隣の要素2乗せるに移動する。→状態(3) オートフィルターを解除する。→状態(4) 以上のようにしたいのですが、コードの書き方を教えて下さい。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.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

sumin2009
質問者

お礼

ありがとうございます。 ユーザーフォームを使う方法、メッセージボックスを使う方法、両方検討してみます。 これでようやく、懸案が解決しそうです。

その他の回答 (1)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

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

sumin2009
質問者

補足

早速の回答ありがとうございます。 これは、CSVファイルからデータを取り込むマクロの途中で、ユーザーフォームを挿入して処理を一旦止めてユーザーに選択をしてもらいたいのです。 オートフィルター終了のイベントが無いとのことですが、そのためにユーザーフォーム上のOKボタンをクリックしたら、後のマクロを走らせるようにしたいと思うのですが、いかがでしょう。

関連するQ&A