Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3148 / 13644 ツリー ←次へ | 前へ→

【63894】選択ボックス作成について ひいろ 09/12/29(火) 18:21 質問[未読]
【63895】Re:選択ボックス作成について kanabun 09/12/29(火) 19:20 発言[未読]
【63896】Re:選択ボックス作成について ひいろ 09/12/29(火) 20:20 質問[未読]
【63897】Re:選択ボックス作成について kanabun 09/12/29(火) 21:30 発言[未読]
【63898】Re:選択ボックス作成について ひいろ 09/12/29(火) 22:16 質問[未読]
【63899】Re:選択ボックス作成について kanabun 09/12/30(水) 0:22 発言[未読]
【63900】Re:選択ボックス作成について kanabun 09/12/30(水) 0:37 発言[未読]

【63894】選択ボックス作成について
質問  ひいろ  - 09/12/29(火) 18:21 -

引用なし
パスワード
   エクセルのプルダウンメニューは文字が小さいのでVBAで選択ボックスを作っています。
そこで,別シートに選択項目を羅列し,メインシートのセルを選択したときに
別シートの選択項目を呼び出し,そこから選べるようにしたいのですが…
作ってみたものの,表示される項目と表示されない項目があります。
ちなみに,ウィンドウは表示されるのですが中身がカラなのです。
原因がお分かりの方教えてもらえませんか?

Sub Worksheet_SelectionChange(ByVal target As Excel.Range)
  If ActiveCell.Row > 11 Then
    If ActiveCell.Column = 2 Then
      Call dspName(1)
  Elself ActiveCell.Column = 4 Then
    Call dspName(2)
  Elself ActiveCell.Column = 6 Then
    Call dspName(4)
  Elself ActiveCell.Column = 8 Then
    Call dspName(5)
  Elself ActiveCell.Column = 10 Then
    Call dspName(4)
  Elself ActiveCell.Column = 12 Then
    Call dspName(5)
  Elself ActiveCell.Column = 13 Then
    Call dspName(6)
  End If
End If
End Sub

(1),(2),(4)はきちんと表示されるのですが,それ以外がウィンドウは出てくるのですが肝心の項目が表示されないので,選択できない状態です。

【63895】Re:選択ボックス作成について
発言  kanabun  - 09/12/29(火) 19:20 -

引用なし
パスワード
   ▼ひいろ さん:
>
>(1),(2),(4)はきちんと表示されるのですが,それ以外がウィンドウは出てくるのですが肝心の項目が表示されないので,選択できない状態です。

インデントがずれていて読みにくいのですが、
こういう構文ですよね?
Sub Worksheet_SelectionChange(ByVal target As Excel.Range)
  If Target.Row > 11 Then
    Select Case Target.Column
     Case 2:   Call dspName(1)
     Case 4, 10: Call dspName(2)
     Case 6:   Call dspName(4)
     Case 8, 12: Call dspName(5)
     Case 13:   Call dspName(6)
    End Select
  End If
End Sub

呼び出し先の dspNameプロシージャのほうは
どうなっていますか?

【63896】Re:選択ボックス作成について
質問  ひいろ  - 09/12/29(火) 20:20 -

引用なし
パスワード
   >呼び出し先の dspNameプロシージャのほうは
>どうなっていますか?

人のプログラムを改良している初心者なもんで…
プロシージャみつけました。

Sub dspName(retu As Integer)
Dim temp1 As String
Dim gyo As Integer

gyo = 3
UserForm1.Show(vbModeless)
UserForm1.IstChoice.Clear

With Worksheets("職員情報")
Do Until(.Cells(gyo,retu).Value ="")
If retu = 1 Then
If .Cells(gyo,retu).value<>.Cells(gyo -1,retu).Value Then
UserForm1.IstChoice.AddItem(.Cell(gyo,retu).Value)
End If
Elself retu = 2 Then
tmp1 = Cells(ActiveCell.Row, ActiveCell.Column - 2)
If tmp1 = .Cells(gyo, retu - 1) Then
UserForm1.IstChoice.AddItem(.Cells(gyo,retu).Value)
End If
Elself retu = 4 Then
tmp1 = .Cells(8,5)
If tmp1 = .Cells(gyo, retu - 1) Then
UserForm1.IstChoice.AddItem(.Cells(gyo,retu).Value)
End If
End If
gyo = ryo + 1
Loop
End With
End Sub

となっていました。
もう完全にキャパシティを越えてしまいました。
ご教授願います。

【63897】Re:選択ボックス作成について
発言  kanabun  - 09/12/29(火) 21:30 -

引用なし
パスワード
   ▼ひいろ さん:

>プロシージャみつけました。
>
>Sub dspName(retu As Integer)
>Dim temp1 As String
>Dim gyo As Integer
>
>gyo = 3
>UserForm1.Show(vbModeless)
>UserForm1.IstChoice.Clear
>
>With Worksheets("職員情報")
>Do Until(.Cells(gyo,retu).Value ="")
>If retu = 1 Then
>If .Cells(gyo,retu).value<>.Cells(gyo -1,retu).Value Then
>UserForm1.IstChoice.AddItem(.Cell(gyo,retu).Value)
>End If
>Elself retu = 2 Then
>tmp1 = Cells(ActiveCell.Row, ActiveCell.Column - 2)
>If tmp1 = .Cells(gyo, retu - 1) Then
>UserForm1.IstChoice.AddItem(.Cells(gyo,retu).Value)
>End If
>Elself retu = 4 Then
>tmp1 = .Cells(8,5)
>If tmp1 = .Cells(gyo, retu - 1) Then
>UserForm1.IstChoice.AddItem(.Cells(gyo,retu).Value)
>End If
>End If
>gyo = ryo + 1
>Loop
>End With
>End Sub
>
>となっていました。
>もう完全にキャパシティを越えてしまいました。

あの、提示のdspNameプロシージャは
コンパイルエラーで実行できませんが?

>Elself retu = 2 Then

ElseIf retu = 2 Then
のコピーミスですか??
その部分を直せば、原因は明白です。

> (1),(2),(4)はきちんと表示されるのですが,
コードをよ〜〜く読んでください。

If retu = 1 Then

ElseIf retu = 2 Then

ElseIf retu = 4 Then

と書いてあるだけですよ!(^^)


> それ以外がウィンドウは出てくるのですが
それは プロシージャの最初で
無条件で
> UserForm1.Show(vbModeless)
と表示しているからですよね

【63898】Re:選択ボックス作成について
質問  ひいろ  - 09/12/29(火) 22:16 -

引用なし
パスワード
   >あの、提示のdspNameプロシージャは
>コンパイルエラーで実行できませんが?
>
>>Elself retu = 2 Then
>は
> ElseIf retu = 2 Then
>のコピーミスですか??
>その部分を直せば、原因は明白です。

会社のPCはセキュリティ上データの移動ができないので
ソースをみて打ち直したのでタッチミスです。

>
>> (1),(2),(4)はきちんと表示されるのですが,
>コードをよ〜〜く読んでください。
>
> If retu = 1 Then
>
> ElseIf retu = 2 Then
>
> ElseIf retu = 4 Then
>
>と書いてあるだけですよ!(^^)

5,6については4をコピーしてそれぞれ5,6に数字だけ変えたのですが
やっぱりユーザーフォームしか出てこず,肝心な中身が表示されません。
>
>
>> それ以外がウィンドウは出てくるのですが
>それは プロシージャの最初で
>無条件で
>> UserForm1.Show(vbModeless)
>と表示しているからですよね

すみません。勉強不足で…
ここを変えればいいのでしょうか?

【63899】Re:選択ボックス作成について
発言  kanabun  - 09/12/30(水) 0:22 -

引用なし
パスワード
   ▼ひいろ さん:

>>無条件で
>>> UserForm1.Show(vbModeless)
>>と表示しているからですよね
>
>すみません。勉強不足で…
>ここを変えればいいのでしょうか?

そこは、文字通り、ユーザーフォームを表示しているところですから
何も変更する必要はありません。


>5,6については4をコピーしてそれぞれ5,6に数字だけ変えたのですが
>やっぱりユーザーフォームしか出てこず,肝心な中身が表示されません。

いま dspName の記述を推定しなが記述しなおすと、
以下のようです。
 変数 r は 指定列 retu の3行目から最終データ行までのセル範囲です。
 この範囲は Do〜Loopしなくても求まりますから、この範囲を 変数rに
 代入して
    For Each c In r
      処理
    Next
 のように、列ごとにLoopし 列別の処理をします。

●「retu」 が (1)(2)(4)のCaseについては すでに書いてあります。
★「retu」 が (5)と(6)についても、同様に 処理を書いてください。


Sub dspName(retu As Integer)
 Dim WS As Worksheet
 Dim temp1 As String
 Dim r As Range
 Dim c As Range
 
 UserForm1.Show vbModeless
 UserForm1.IstChoice.Clear
 
 Set WS = Worksheets("職員情報")
 With WS
  Set r = .Range(.Cells(3, retu), .Cells(3, retu).End(xlDown))
 End With
 
 Select Case retu
  Case 1 '--------------- 上と比較 ●
    For Each c In r
     If c.Value <> c.Offset(-1).Value Then
      UserForm1.IstChoice.AddItem c.Value
     End If
    Next
  Case 2 '--------------- 横と比較 ●
    For Each c In r
     If c(1, -1).Value = c(1, 0) Then
      UserForm1.IstChoice.AddItem c.Value
     End If
    Next
  Case 4 ' --------------- 固定セルと比較 ●
    temp1 = WS.Cells(8, 5).Value
    For Each c In r
     If c(1, 0).Value = temp1 Then
      UserForm1.IstChoice.AddItem c.Value
     End If
    Next
  
  Case 5
    For Each c In r
        '--- ここにパラメータが 5 のときの処理を書く ★
    Next
  
  Case 6
    For Each c In r
        '--- ここにパラメータが 6 のときの処理を書く ★
    Next
  
 End Select

End Sub

なお、
> UserForm1.IstChoice
というのは ListBoxコントロールのことで、ほんとうは
lstChoice が正しいのではないかと想像するのですが、
以下では原文のまま (lstChoiceでなく)IstChoice としてあります。

こういうタイプミスは
各モジュール(標準モジュールとか UserFormモジュール)の一番最初

Option Explicit
と宣言を入れておくことにより、コードの中で
lstChoice を IstChoice とタイプしたり、
変数temp1 を tmp1として使用したりすると
「変数が宣言されていません」と
警告が出るので、すぐタイプミスに気がつくようになります。
必ず
Option Explicit
を宣言してからコードを各習慣をつけるようにしてください。

また、掲示板に質問用に出すコードは インデントをきちんとつけた
コードを提示するようにしてください。インデントの付いてないコード
や、実際のコードをコピペしたものでないコードは
それだけで回答が付きにくくなります。

【63900】Re:選択ボックス作成について
発言  kanabun  - 09/12/30(水) 0:37 -

引用なし
パスワード
   上のコードで ぼくは
相対セルの表記を2種類の書き方で書いてしまいました。
一つ目は
>  If c.Value <> c.Offset(-1).Value Then
というOffsetプロパティを使った書き方です。
  c.Offset(-1) というのはセルc のひとつ上のセル
ということで、これはいいですね。

もうひとつは、
>  If c(1, -1).Value = c(1, 0).Value Then
という書き方で、
これは
  セルc の2つ左のセルの値と
  セルc の1つ左のセルの値とが等しかったら
ということで、Offsetプロパティで書けば
  If c.Offset(, -2).Value = c.Offset(, -1).Value Then
ということです。

分かりやすいほうに統一してください。

3148 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free