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

ExcelのVBAを走らせて

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

以上のようにしたいのですが、コードの書き方を教えて下さい。

「ユーザーフォームから可視セルを隣のセルに」の質問画像

A 回答 (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
「ユーザーフォームから可視セルを隣のセルに」の回答画像2
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/04/27 08:38

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
「ユーザーフォームから可視セルを隣のセルに」の回答画像1

この回答への補足

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

補足日時:2012/04/26 17:02
    • good
    • 0

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