質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

6551閲覧

vbaにおける可視セルの選択(複数行の場合)

LUCIA

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/05/01 10:12

編集2018/05/01 10:14

質問させていただきます。
Excelでデータベースを作成中です。(来店記録のようなものです)
現在、A列に名前、B列に住所が入っており、C列には日付、D列には○か☓が必ず入る予定の構造になっております。
現在は入力作業中で、C列が去年以前、かつD列が空白という条件でオートフィルタをかけています。

別途、ユーザーフォームを用意しており、コマンドボタンを押すと、AB2列分(アンバサンドで繋げて、名前と住所を一括表示)×アクティブセルのある行以降の可視行5つ分のデータがテキストBOX1〜5に入るようにしたいのですが、範囲指定がうまく行きません。
loop文の中に
entirerow.hidden=False〜の条件を入れて、そこから下方向にoffsetしようと思いましたが、飛び飛びのため、なかなかぴったり五行選択することができず困っています。(3行だったり7行だったりバラバラです)
最終目的は、テキストBOXの横にあるドロップダウンリストから○×を選ぶと、対応する行のD列にその値が入るようにすることです。
列の非表示はありませんので、可視行の選択→テキストBOXに代入、さえできれば、最後の部分はなんとかなりそうな気がします。(横にずらすだけで終わりそうな気がします)

何か良い方法はありますでしょうか?

vbaに詳しい方、どうぞお力をお貸しいただけたら幸いです。

【これまでにやってみたこと】
getfromclipboardと、gettextプロパティを使って、選択可視行のデータをクリップボードに抜き出し→改行コードでSPLIT→for next文で順番に代入する流れ
テキストBOXのオブジェクト名は後ろに1〜5がつくだけで一定ですが、抜き出したデータを配列に入れたとき、変数カウントのスタートが0からになるので、一つずれて出力されてしまった上に、改行を表すマークまで一緒に表示されてしまっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

別途、ユーザーフォームを用意しており、コマンドボタンを押すと、AB2列分(アンバサンドで繋げて、名前と住所を一括表示)×アクティブセルのある行以降の可視行5つ分のデータがテキストBOX1〜5に入るようにしたいのですが、範囲指定がうまく行きません。

SpecialCells(xlCellTypeVisible) で可視セルのみ取得できます。

vba

1Private Sub CommandButton1_Click() 2 Dim r As Range, c As Range, n As Long, EndR As Range 3 4 Set EndR = Cells(Rows.Count, 1).End(xlUp) 5 6 If EndR.Row < ActiveCell.Row Then 7 MsgBox "データのあるセルを選択してください。" 8 Exit Sub 9 ElseIf EndR.Row = ActiveCell.Row Then 10 Set r = Cells(ActiveCell.Row, 1) 11 Else 12 Set r = Range(Cells(ActiveCell.Row, 1), EndR).SpecialCells(xlCellTypeVisible) 13 End If 14 15 For Each c In r 16 n = n + 1 17 Me("TextBox" & n) = c.Value & c.Offset(, 1).Value 18 If n = 5 Then Exit For 19 Next 20 21 For n = n + 1 To 5 22 Me("TextBox" & n) = "" 23 Next 24End Sub

追記

最終目的は、テキストBOXの横にあるドロップダウンリストから○×を選ぶと、対応する行のD列にその値が入るようにすることです。

この仕様にも対応するようにしてみました。

vba

1Option Explicit 2 3Private Sub CB_Change() 4 With Me.ActiveControl 5 If .Tag <> "" Then Cells(.Tag, 4).Value = .Value 6 End With 7End Sub 8 9Private Sub ComboBox1_Change() 10 CB_Change 11End Sub 12 13Private Sub ComboBox2_Change() 14 CB_Change 15End Sub 16 17Private Sub ComboBox3_Change() 18 CB_Change 19End Sub 20 21Private Sub ComboBox4_Change() 22 CB_Change 23End Sub 24 25Private Sub ComboBox5_Change() 26 CB_Change 27End Sub 28 29Private Sub CommandButton1_Click() 30 Dim r As Range, c As Range, n As Long, EndR As Range 31 32 Set EndR = Cells(Rows.Count, 1).End(xlUp) 33 34 If EndR.Row < ActiveCell.Row Then 35 MsgBox "データのあるセルを選択してください。" 36 Exit Sub 37 ElseIf EndR.Row = ActiveCell.Row Then 38 Set r = Cells(ActiveCell.Row, 1) 39 Else 40 Set r = Range(Cells(ActiveCell.Row, 1), EndR).SpecialCells(xlCellTypeVisible) 41 End If 42 43 For Each c In r 44 n = n + 1 45 Me("TextBox" & n).Value = c.Value & c.Offset(, 1).Value 46 Me("ComboBox" & n).Tag = c.Row 'コンボボックスのTagに行インデックスを格納 47 If n = 5 Then Exit For 48 Next 49 50 For n = n + 1 To 5 51 Me("TextBox" & n).Value = "" 52 Me("ComboBox" & n).Tag = "" 53 Next 54End Sub 55 56Private Sub UserForm_Initialize() 57 Dim i As Long 58 59 For i = 1 To 5 60 With Me("ComboBox" & i) 61 .AddItem ("○") 62 .AddItem ("×") 63 End With 64 Next 65End Sub

投稿2018/05/01 13:31

編集2018/05/02 07:53
hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LUCIA

2018/05/02 08:24

回答ありがとうございます!無事に思ったとおりの動作をするユーザーフォームができあがりました。大変お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問