[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データ入力について』(H.I)
1) 各組生徒の名簿はどのようになっているのでしょう? 2) リストボックスからの選択は、単数・複数 のどちらでしょう? 3) 選択されたリストボックスの項目を「どこへ、どのように」表示させるのでしょう? (seiya)
> ...以下同様に2組から6組まで1組のあとに続いてあります どのように以下同様なのですか? (seiya)
横から失礼します「参考です」
FORM上にレイアウトした方がいいのでしょうが、SHEET1へのレイアウトとして作ってみました。 1.まずSHEET1の10行目までをCOMBOBOX1とLIRSTBOX1の配置用エリアとしてCOMBOBOX1とLISTBOX1をレイアウトします。 レイアウト後、LISTBOX1をダブルクリックしてLISTBOX1のプロパティーのLISTSTYLEを1-FMLISTSTYLEOPTIONにしてください。 2.11行目以降をデータエリア用として、A11〜A16に検索すべき名称"1組"〜"6組"を入力します。 3.B列とC列は検索されるデータが入るエリアとします。 B列には検索されるべき"1組"〜"6組"のいずれかが入ります C列には例えば人名とかが入ります *この場合、A列はテーブルの定義でありB、C列はデータです。
4.下記プログラムコード@をSHEET1のコードフォームに貼り付けてください。 5.下記プログラムコードAをTHISWORKBOOKのコードフォームに貼り付けてください
これで動くはずです。 COMBOBOXで"組"を選択すればそれに該当する氏名がLISTBOXに表示され、 LISTBOXに表示された氏名から該当するものをクリックすればSHEET2のA列の2行目から その氏名が記録されてゆきます。
@
Private Sub ComboBox1_Change() 'コンボボックスと同じ内容をリストボックスへ
Dim i As Long
ListBox1.Clear
For i = 11 To 500
If (Cells(i, 2) = "") Then Exit For
If (Cells(i, 2) = ComboBox1) Then ListBox1.AddItem Cells(i, 3)
Next i
End Sub
Private Sub ListBox1_Click() 'リストボックスの内容をSHEET2へ転送
Dim i As Long
For i = 2 To 500
If (Sheet2.Cells(i, 1) = "") Then
Sheet2.Cells(i, 1) = ListBox1
Exit For
End If
Next i
End Sub
Private Sub Worksheet_Activate() 'コンボボックスへ内容をセット
Dim i As Long
ComboBox1.Clear
For i = 11 To 20
If (Cells(i, 1) = "") Then Exit For
ComboBox1.AddItem Cells(i, 1)
Next i
End Sub
A Private Sub Workbook_Activate() Sheet2.Activate Sheet1.Activate End Sub
これは参考にしてください、内容を理解して少し改造をしないとご要望には叶いません。
(mr_mangoos)
データの絞り込みはオートフィルタを使用し 転記には、ダブルクリックイベントを使用するのはどうでしょう。
勝手に「一回選んだら終わりだろ」と言うことで 一度転記した人の行は削除するので、名簿を複製してください。
Sheet1のシートモジュールに貼り付けます。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("A:C")) Is Nothing Then Exit Sub
If Target.Value = "" Then Exit Sub
With Sheets("Sheet2")
.Range("A" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Resize(, 3).Value = _
Range("A" & Target.Row).Resize(, 3).Value
End With
Range("A" & Target.Row).Resize(, 3).Delete shift:=xlUp
End Sub
A:C列の何か入力があるセルをダブルクリックしたとき その行のデータがSheet2へ転記され、該当行は上詰めで削除します。
クラスの絞り込みは、オートフィルタを使って下さい。 各クラスを絞り込む行為を一度マクロの記録に取って於いて、 シート上にボタンを6個配置し、それに割り当てておいても良いかもしれません。
コンボボックスも、リストボックスも使わないので ご参考程度に。
(HANA)
シートの構成次第ではマクロじゃなくても出来そうな気もしますが・・・怪しいですが^^;
一度、表で表してください。必要最小限で構いませんので。(最初の seiya さんの質問ですが・・・)
[A] [B]
[1]
[2]
(1or8)
Combobox, ListBox を使用しないでマクロ無しでできると思います。 入力規則を使用します。
1) B列の各組の対象範囲に名前を付け。「挿入」-「名前」-「定義」
名前に 1組、2組...6組 と付ける。
2) 仮に「組」を選択するセルを D1 として
2) - a D1を選択
2) - b 「データ」-「入力規則」− 入力値の種類(A) で [リスト] を選択
2) - c 元の値(S) に "1組,2組,3組,4組,5組,6組" と入力("を含む)
3) 仮に「生徒」を選択するセルを E1 として
3) - a E1 を選択
3) - b 2) - b
3) - c 元の値(S) に =Indirect(D1) と入力
4) Sheet2に「選択された生徒」を表示させるセルを選択して
=Sheet1!E1
もし、「選択した生徒」をその都度他のセルへ表示となると、少々マクロも入ってきます。 (seiya)
[A] [B] 1 安藤みき 2 井上まお 3 上田馬助 以下同様です。 mr.mangoosさんへ。以下がやり方等不明です。
レイアウト後、LISTBOX1をダブルクリックしてLISTBOX1のプロパティーのLISTSTYLEを1- FMLISTSTYLEOPTIONにしてください 4.下記プログラムコード@をSHEET1のコードフォームに貼り付けてください。 5.下記プログラムコードAをTHISWORKBOOKのコードフォームに貼り付けてください
初心者なので式の意味等もよく判らないなかですが、頑張ってみます。 (H.I)
生徒の名簿は 入力規則を設定するシートのA列に出席番号、B列に名前です。 そのシート名は Sheet1 で想定しています。 (seiya)
お話中失礼します。
Sheet1で選んでSheet2に表示 と言う事でしたので 勝手に データ転記&蓄積 かと思っていましたが その時にSheet1で選んでいるものが その時にSheet2に表示されれば良い だけ なのですかね?
データ蓄積でないなら マクロを使う必要はないと思いますので 無視してください。 失礼しました。
(HANA)
3) - a E1 を選択
3) - b 2) - b
3) - c 元の値(S) に =Indirect(D1) と入力
の部分ですが、その通り実行するとエラー表示が出てその後作業ができません。どうしたらよいのでしょうか。
Hanaさんへ。
文章がつたなくて申し訳ありません。データの蓄積になります。(sheet2に一覧の形で作成したい)
(H.I)
どのようなエラーが出るのですか? それと、データを蓄積するのならVBAコードも必要になります。 (seiya)
SHEET1のA11以降からA16迄"1組","2組","3組","4組","5組","6組"と入力します。(選択条件としてCOMBOBOXに表示する為の定義です。)
SHEET1のB11とC11以降からデータを入力します。
例.
B11以降 C11以降
1組 佐藤寅雄
1組 鈴木猫太
2組 工藤うさぎ
1組 遠藤熊五郎
・ ・
・ ・
>レイアウト後、LISTBOX1をダブルクリックしてLISTBOX1のプロパティーのLISTSTYLEを1-FMLISTSTYLEOPTIONにしてください
表示(V) → ツールバー(T)→ VISUALBASICをクリック(チェックが入ります)→ VBのツールバーが表示されます ツールバーの中からデザインモード(定規・三角定規のボタン)をクリック デザインモードの状態でレイアウトしたリストボックスをダブルクリックするとそのプロパティーが表示されますので その中のLISTSTYLEを変更してください。 デザインモードボタンを再度クリックして実行モードに戻します。
>4.下記プログラムコード@をSHEET1のコードフォームに貼り付けてください。 >5.下記プログラムコードAをTHISWORKBOOKのコードフォームに貼り付けてください
上記と同じ動作でツールバーを表示してVISUAL BASIC EDITORボタンをクリックするとコードフォームが表示されます。 VBAプロジェクトウインドウの階層表示の中からSHEET1をダブルクリックするとSHEET1のコードフォームが表示されます。 そのコードフォームの左上のドロップダウンからWORKSHEETを選択、右上のドロップダウンからACTIVATを選択して@を貼り付けます。 VBAプロジェクトウインドウの階層表示の中からTHIS WORKBOOKをダブルクリックするとTHIS WORKBOOKのコードフォームが表示されます。 そのコードフォームの左上のドロップダウンからWORKBOOKを選択、右上のドロップダウンからACTIVATを選択してAを貼り付けます。
理解して頂けるでしょうか、当方も説明に苦労します。教科書等である程度のご勉強をお勧めします。 不明な点があったら又質問をしてみてください。 (mr_mangoos)
1) B列の各組の対象範囲に名前を付け。「挿入」-「名前」-「定義」
名前に 1組、2組...6組 と付ける
この作業がうまくできてないのかなーー?
B1:B40 を選択 - [挿入] - [名前] - [定義] 名前に 1組 B41:b80を選択 ----------同上------------------- 2組 . . . という感じですが.. (seiya)
B41:b80を選択 ----------同上------------------- 2組 この通りやってみたのですが。(H.I)
vba で Sheet1に ComboBox X 1, ListBox X 1 を配置 (プロパティはすべて規定値にしてください)
Sheet1 の Sheet module へ (シートタブを右クリックして[コードを表示]) 右空白部分に下記コードを貼り付け、x をクリックしてエクセルに戻る
Private Sub Worksheet_Activate()
ComboBox1.Clear '<- 追加
ComboBox1.List = Array("1組","2組","3組","4組","5組","6組")
End Sub
Private Sub ComboBox1_Click()
If ComboBox1.ListIndex = -1 Then Exit Sub
With ComboBox1
ListBox1.List = Range("b" & 40 * .ListIndex + 1).Resize(40).Value
End With
End Sub
Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Sheets("sheet2").Range("a" & Rows.Count).End(xlUp)(2).Value = ListBox1.Value
End Sub
(seiya)
これ以上参加者が増えるとH.Iはんを惑わせるだけかもしれまへんが、なんとか一度 だけの説明で完成でけるよう頑張ってみました。 先ず新しいブックを用意します。
@Sheet1のA41からB280に既にあるデータをコピーします。 A三角定規&鉛筆のアイコンをクリック。 Bハンマー&スパナのアイコンをクリック。 Cコンボボックスをお好きなところへ配置します。 Dリストボックスをお好きなところへお好きな大きさで配置します。
Eそのアイコンをそれぞれクリックして終了します。 F画面の下の方に\Sheet1/が見えますから、そこを右クリックします。 Gコードの表示を選択したらVBEの画面が登場します。 Hその真新しい画面に下のコードをコピペします。
エクセルに戻って ISheet2のA1に出席番号B1に氏名と書き込みます。 これで準備完了ですワ。
Sheet1を開いて コンボボックスをスクロールし、そのどれかを選択した上
リストボックスの生徒名をクリックしていってみてくらはい。
ええ加減なところでSheet2を開いてみると、どうでっか、こんな塩梅で?
順序正しくやってみれば必ずやH.Iはんのお望み通りにデータが抽出でけます、ハイ。
(弥太郎)
'---------------------------
Private Sub Worksheet_Activate()
ComboBox1.Clear
ComboBox1.List = Array("1組", "2組", "3組", "4組", "5組", "6組")
End Sub
Private Sub ComboBox1_Change()
Dim i As Integer
With ListBox1
For i = 1 To 6
Select Case ComboBox1
Case i & "組"
.ListFillRange = "B" & i * 40 + 1 & ":B" & (i + 1) * 40
Exit For
End Select
Next i
End With
End Sub
Private Sub ListBox1_Click()
Dim data
data = Cells(Application.Match(ListBox1, Range("b" & 40 * (ComboBox1 _
.ListIndex + 1) + 1).Resize(40), 0) + _
(ComboBox1.ListIndex + 1) * 40, 1).Resize(, 2).Value
With Sheets("sheet2")
.Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(, 2) = data
End With
End Sub
弥太郎さん、
> Application.Match(ListBox1, Range("b41:b280"), 0)
1) なぜ Range("b41:b280") なのでしょう?
2) Match だと、同姓同名の生徒がいる場合、組が違う場合も出るのでは?
(seiya)
> @Sheet1のA41からB280に既にあるデータをコピーします。 これ、見落としてました。 (seiya)
あっ、さういえばそうでんなぁ・・・。 もすこし考えてみませう。^^ 一発っちゅう訳にはいきまへんでしたなぁ。 240人の中に同姓同名の確率は極めて低いんでっしゃろけど、0やおまへんしなぁ。
あ、それはそうとseiyaはんのコンボボックスはエラーがでまっせ。 (弥太郎)
> あ、それはそうとseiyaはんのコンボボックスはエラーがでまっせ。 あらら、 Clear が抜けているからですかね?... 無くても大丈夫のような気がしたのですが... (seiya)
まぁ昔の単純な名前と違うて最近のモダンな名前からすれば、99.9%同姓同名が 240人の集団に居りますまいとは思うんですけど、一応seiyaはんのイチャモンを解消 しときますワ。^^(上記マクロ改訂済み) 今宵も酔いちゃった^^(弥太郎)
どのように変更したのか、コードを見せてください。 (seiya)
Private Sub ComboBox1_Click()
If ComboBox1.ListIndex = -1 Then Exit Sub
With ComboBox1
ListBox1.List = Range("a" & 40 * .ListIndex + 1).Resize(40,2).Value '<- 変更
End With
End Sub
Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
With ListBox1
Sheets("sheet2").Range("a" & Rows.Count).End(xlUp)(2).Resize(,2).Value = _
Array(.List(.ListIndex, 0), .List(.ListIndex,1))
End With
End Sub
な感じでどうでしょう? (seiya)
Private Sub ComboBox1_Click()
If ComboBox1.ListIndex = -1 Then Exit Sub
With ComboBox1
ListBox1.List = Range("a" & 40 * .ListIndex + 1).Resize(40,2).Value
End With
With ListBox1 '<- 修正
.ColumnCount = 2 '<- 列数の指定
.ColumnWidths = "10;50" '<- 列幅を適当に修正してください,名前だけなら"0;50" とか
End with
End Sub
(seiya)
> また前の質問にようにデータ項目を増やしたい場合はどうすればよいのでしょうか。重ね重ね申し訳ありません。急ぎませんのでよろしくお願いします。
Private Sub ComboBox1_Click()
If ComboBox1.ListIndex = -1 Then Exit Sub
With ComboBox1
ListBox1.List = Range("a" & 40 * .ListIndex + 1).Resize(40,3).Value
End With
With ListBox1 '<- 修正
.ColumnCount = 3 '<- 列数の指定
.ColumnWidths = "10;50;50" '<- 列幅を適当に修正してください,名前だけなら"0;50;0" とか
End with
End Sub
Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
With ListBox1
Sheets("sheet2").Range("a" & Rows.Count).End(xlUp)(2).Resize(,3).Value = _
Array(.List(.ListIndex, 0), .List(.ListIndex,1),.List(.ListIndex,2))
End With
End Sub
勘違いしたようなので、削除して新たにアップしました。
(seiya)
H.Iはん、ごめんなはれや、今日は一日外出しとりました。 お訊ねの件、明日見直してみます。なんせ、もうでけあがってますもんで・・・^^ でけあがらん日はないんか!(弥太郎)
おはようゴザイマス。 先ず初めのご質問ですけど ListBoxのコードに.Resize(,2)と書かれとる所が2ヶ所ありますわなぁ。 これは当該行の2列 ちゅう意味ですワ。((1,2)とと同じ) ですから4列のデータを抽出したければ(,4) と、5列やと(,5)と変更すればOKです 2ヶ所ですよ、でけまっか?
次にSheet2から戻った時の事なんですけど、先刻転送した状態のままComboBox及び ListBoxに表示しておきたいのなら ComboBox1.Clearの行を削除してくらはい。
また両方を未入力状態にしときたいなら
ComboBox1.Clearの下の行に
ListBox1.ListFillRange = ""
を差し込みます。
(弥太郎)
弥太郎さんへ。
早速チャレンジしてみます。
(H.I)
1) ColumnWidths で調整してください。
="0;50;0" にすれば名前だけ。"50;50;50" にすれば3列すべて というように。
2) With ListBox1 '<- 1が抜けていました (seiya)
以上の3点についてお願いします。
seiyaさんへ
やってみます。
(H.I)
また何をやらかしたんでせう? 他に競合するようなマクロは入ってまへんか? 私のコードを活かすには私のコード以外に入れないでやって下さいヨ。 念のためもう一度コードをアップしますワ。 当方では1)も 2)も 3)も 全く発生いたしまへん。 ↑ 当方でも 3)の現象は確認でけました。 (弥太郎) '----------------- はい、確認でけました。(汗 今少しお待ちを・・・
'----------------------------
Sub auto_open()
With Sheets("sheet1")
.ComboBox1.Clear
.ComboBox1.List = Split("1組 2組 3組 4組 5組 6組")
.ListBox1.ListFillRange = ""
End With
End Sub
Alt+F8でVBEを開きます。
挿入→標準モジュールを選択して、その真新しい画面に↑のコードをコピペします。
左のプロジェクト欄にSheet1っちゅうんがありますから、そこをWクリックします。
そこに書かれたコードを全て削除してくらはい。
削除された画面に下のコードをコピペします。
保存した上一旦ブックを閉じ、改めて開いた上試してみておくんなはれ。
(弥太郎)
'-----------------------
Private Sub ComboBox1_Change()
Dim i As Integer
With ListBox1
For i = 1 To 6
Select Case ComboBox1
Case i & "組"
.ListFillRange = "B" & i * 40 + 1 & ":B" & (i + 1) * 40
Exit For
End Select
Next i
End With
End Sub
Private Sub ListBox1_Click()
Dim data
data = Cells(Application.Match(ListBox1, Range("b" & 40 * (ComboBox1 _
.ListIndex + 1) + 1).Resize(40), 0) + _
(ComboBox1.ListIndex + 1) * 40, 1).Resize(, 4).Value
With Sheets("sheet2")
.Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(, 4) = data
End With
End Sub
では、もう一度初めからやりまひょか。
今までのコードは全て削除します。
そして、下のコードをそれぞれのモジュールにコピペしてくらはい。
それと、参考図書と申されてもそれがしの利用した書籍は古くて使いもんになりまへん
やろから、本屋で初歩の本を探してみておくんなはれ。
さらに、ここで指南してらっしゃるせんせぇ方の殆どはこの学校で手頃なテーマを見つ
けて憶えたと聞き及んでおりますし、それがしもまたその例外ではありまへん。
なぁに、その気になれば1年で習得でけまっせ。
(弥太郎)
'標準モジュールへ
'----------------------
Sub auto_open()
With Sheets("sheet1")
.ComboBox1.Clear
.ComboBox1.List = Split("1組 2組 3組 4組 5組 6組")
.ComboBox1.ListIndex = -1 'この行追加
.ListBox1.ListFillRange = ""
End With
End Sub
'--------------
'シートモジュールへ
'----------------
Private Sub ComboBox1_Change()
Dim i As Integer
With ListBox1
For i = 1 To 6
Select Case ComboBox1
Case i & "組"
.ListFillRange = "Sheet3!B" & i * 40 + 1 & ":B" & (i + 1) * 40
flag = True
Exit For
End Select
Next i
End With
End Sub
Private Sub ListBox1_Click()
Dim data
With Sheets("sheet3")
data = .Cells(Application.Match(ListBox1, .Range("b" & 40 * (ComboBox1 _
.ListIndex + 1) + 1).Resize(40), 0) + _
(ComboBox1.ListIndex + 1) * 40, 1).Resize(, 5).Value
End With
With Sheets("sheet2")
.Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(, 5) = data
End With
End Sub
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.