- 締切済み
Excel2007 多くの選択肢の中から選択されたものだけを別のシートに表示させたい
エクセル2007を使用しています。 sheet1に100社ほどの会社のリストがあります。A列に社名、B列にフォームコントロールから作成したチェックボックスをつけています。 この中から選ばれた(チェックの入った)3社の社名を、sheet2のA~C列にそれぞれ会社1、会社2、会社3という項目をつけ、その下の行に表示させたいと思っています。 どのような方法があるでしょうか。教えていただけると助かります。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17070)
#3です。 質問者には難しすぎると思うが、興味あれば、参考に。 Sub test01() Dim objOLE As OLEObject Dim i As Long X = Array("", "AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH", "II", "JJ") '画面更新を一時的にOFF Application.ScreenUpdating = False For i = 1 To 3 'コントロールを追加する Set objOLE = Worksheets("Sheet3") _ .OLEObjects.Add("Forms.CheckBox.1") objOLE.Object.Caption = X(i) 'Captionを設定 objOLE.Left = Cells(i + 1, "B").Left '横位置を設定 objOLE.Top = Cells(i + 1, "B").Top '縦位置を設定 objOLE.LinkedCell = "" objOLE.LinkedCell = "A" & (i + 1) Next '画面更新をONに戻す Application.ScreenUpdating = True End Sub これで3つのチェックボックスをシート(Sheet3)のB列のB2以下に貼り付け A2:A5に各々LinkedCellを設定し、好みのCaptionを設定する。Captionの文言はArrayで定義している。 === コントロール群の中のCheckBoxの判別は Sub test01() Dim obj As Object MsgBox Worksheets("Sheet3").OLEObjects.Count For Each obj In Worksheets("Sheet3").OLEObjects 'MsgBox obj.Name 'MsgBox obj.progID If obj.progID = "Forms.CheckBox.1" Then MsgBox obj.progID & "がチェックボックス" End If Next End Sub
- fujillin
- ベストアンサー率61% (1594/2576)
#2です。 ちょっと、いい加減だったので修正しました。 (B列は使用しないようにしました。) ついでに、指定する個数を変更できるようにしてあります。 (nMaxの数値が、選択されるはずの個数です) 個数が違っても、一応コピーしますが(指定個数と選択個数の小さい個数分コピー)、アラートがでます。 Sub test() Dim obj As Object, o As Object, sht As Worksheet Dim tmp() As Long, rwMax As Long, tval As Long Dim nMin As Integer, n As Integer, tind As Integer Dim i As Integer, j As Integer Const sht1 = "sheet1" '//←リストのあるシート名 Const sht2 = "sheet2" '//←表示させるシート名 Const nMax = 3 '//←コピーする会社数の最大 Set sht = Worksheets(sht2) n = 0 With Worksheets(sht1) rwMax = .Cells(Rows.Count, 1).End(xlUp).Row Set obj = .OLEObjects '//チェックボックスを捜査 For Each o In obj If o.progID = "Forms.CheckBox.1" And o.Object.Value = "True" Then If o.TopLeftCell.Row <= rwMax Then n = n + 1 ReDim Preserve tmp(1 To n) tmp(n) = o.TopLeftCell.Row End If End If Next o '//チェックされた会社名をコピー sht.Rows("1:2").ClearContents '//←表示用シートの1,2行をクリア If n < nMax Then nMin = n Else nMin = nMax For i = 1 To nMin tval = rwMax + 1 For j = 1 To n If tmp(j) < tval Then tind = j: tval = tmp(j) Next j sht.Cells(1, i).Value = "会社" & i sht.Cells(2, i).Value = .Cells(tmp(tind), 1).Value tmp(tind) = rwMax + 1 Next i End With '//チェック数の確認 If (n > nMax) Then MsgBox ("選択した個数が多すぎます。(" & n & "個選択)") If (n < nMax) Then MsgBox ("選択した個数が少ないです。(" & n & "個選択)") End Sub
- imogasi
- ベストアンサー率27% (4737/17070)
シート上に貼り付けたコントロールは、そのままではシートのセルの値にならず、扱いにくい。だからエクセルのコントロールのプロパティには、LinkedCellがあるが、 チェックボックスが多数あると、手動で1つ1つLinkedCellの設定が面倒。 VBAでたるにも初心者には難しい。 (1)シート上のチェックボックスの捕らえ方 (2)チェックボックスであることの判別 (3)そのシート内の数 (4)順次A1,A2などにLinkedCelを設定していく方法 (5)もっと言えばコードでチェックボックスを作成し、位置を 適当にセルにあわせる などできないといけないが、難しいだろう。 ーーーー 初心者なのに難しいやり方を採用して、判らないので他人を頼っている。格好よいと思ったのかもしれないが、身の丈にあった方法を使うべきだ。 B列に、抜き出しする会社を指定する「1」などを入れるようにし、 B列に1の入った行をSheet2に抜き出す、とでもするのが相応しい。 これは私が答えている「imogasi方式」による抜き出し方式が使える。 例データ Sheet1 A1:C6 A列 B列 C列 会社名 抜き出し 該当連番 田中商店 今井靴店 1 1 鈴木化成 木村木材 松井衣料 1 2 ーー C2の式 =IF(B2=1,MAX($C$1:C1)+1,"") 下方向に式を複写。 Sheet2に行って A2に =INDEX(Sheet1!$A$1:$A$6,MATCH(ROW()-1,Sheet1!$C$1:$C$6,0),1) ROW()-1は、Sheet2で第2行目から表示させるためー1が必要。 下方向に式を複写する。 多数行に式を複写しておく場合は、#N/Aを出させないよう =IF(ROW()-1>MAX(Sheet1!$C$1:$C$6),"",INDEX(Sheet1!$A$1:$A$6,MATCH(ROW()-1,Sheet1!$C$1:$C$6,0),1)) 結果 今井靴店 松井衣料 Sheet1のC列以右に会社のデータがあっても、式を少し変えれば、Sheet2に持ってこれる。
- fujillin
- ベストアンサー率61% (1594/2576)
細部が不明なところもありますが、説明も面倒なのでとりあえず作ってみました。一応、こんな感じでしょうか? ・リストの順にA、B、C列に記入するために一度チェックしておいてから、 後でコピーする方式にしてあります。 (チェックボックスが順になているとは限らないので) ・B列にはチェックボックスがあるので、セル自体は使用していないと想像 して、チェックがある場合の一時的な控え場所として利用しています。 (" "を記入しています。もしも、セルを利用している場合は、別の列に するか、配列に控えるなどに変更する必要があります。) ・チェックボックスの位置を取得するのにTopLeftCellを使用していますので 左上が他の行に跨っていたりすると、1行をずれて解釈してしまう可能性 があります。 ・>sheet2のA~C列にそれぞれ~~~ sheet2の1行目が「会社1」など、2行目が会社名と解釈しました。 説明はどこまですればよいのかわからないので、とりあえずなしです。 標準モジュールなどにおいて、実行してみてください。 (必ずテスト用のデータでテストしてください) Sub test() Dim obj As Object, o As Object Dim sht As Worksheet, rw As Long, rwMax As Long, n As Integer Const sht1 = "sheet1" '//←リストのあるシート名 Const sht2 = "sheet2" '//←表示させるシート名 Set sht = Worksheets(sht2) n = 0 With Worksheets(sht1) rwMax = .Cells(Rows.Count, 1).End(xlUp).Row .Columns("B").ClearContents Set obj = .OLEObjects '//チェックボックスを捜査 For Each o In obj If o.progID = "Forms.CheckBox.1" And o.Object.Value = "True" Then .Cells(o.TopLeftCell.Row, 2).Value = " " n = n + 1 End If Next o If n <> 3 Then MsgBox ("選択個数が3個ではありません。(" & n & "個選択されています)") Exit Sub End If '//チェックされた会社名をコピー n = 1 For rw = 1 To rwMax If .Cells(rw, 2).Value = " " Then .Cells(rw, 2).Value = "" sht.Cells(1, n).Value = "会社" & n sht.Cells(2, n).Value = .Cells(rw, 1) n = n + 1 End If Next rw End With End Sub
- fujillin
- ベストアンサー率61% (1594/2576)
>フォームコントロールから作成したチェックボックス というのは、コントロールツールのチェックボックスのことですよね? (2003での回答ですが…) ◆方法1 1.各チェックボックスの値を、どこかの列にリンク(ボックスの位置と同じ 行に)させておく。(この列は非表示にしておいても良い) 2.あとはチェックの入っているセルを見て、別シートに表示 (方法は過去の質問に、類似のものが沢山あると思う) ◆方法2 チェックボックスのリンクなどが面倒であれば、全てマクロで片付ける方法 1.sheet1上のチェックボックスを順に調べてチェックが入っていたら、その 位置から行を割り出す。 2.その行のデータをsheet2へ転記する 3.チェックボックスを全て調べたら終わり。 両方の方法とも、「3社の社名」というチェック数が3であることはチェックしていないが、方法2ならこれも簡単にチェックできる。
お礼
早速のご回答ありがとうございます! チェックボックスのリンクは、数が多いので少し手間がかかります。 方法2の具体的なやり方について教えていただけませんでしょうか? ちなみにマクロやVBAは初心者です。。。すみません。