Excel VBA質問箱 IV

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

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


10052 / 13646 ツリー ←次へ | 前へ→

【23960】ユーザーフォームが表示されない okb 05/4/8(金) 16:53 質問[未読]
【23963】Re:ユーザーフォームが表示されない Jaka 05/4/8(金) 17:36 発言[未読]
【23966】Re:ユーザーフォームが表示されない okb 05/4/8(金) 18:34 発言[未読]
【23979】Re:ユーザーフォームが表示されない okb 05/4/8(金) 22:51 質問[未読]
【23985】Re:ユーザーフォームが表示されない ichinose 05/4/9(土) 9:38 発言[未読]
【23989】Re:ユーザーフォームが表示されない okb 05/4/9(土) 11:24 発言[未読]
【23992】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 13:25 回答[未読]
【23994】Re:ユーザーフォームが表示されない okb 05/4/9(土) 15:22 質問[未読]
【23995】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 15:37 回答[未読]
【23996】Re:ユーザーフォームが表示されない okb 05/4/9(土) 15:48 質問[未読]
【23997】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 15:51 回答[未読]
【23998】Re:ユーザーフォームが表示されない okb 05/4/9(土) 16:04 質問[未読]
【23999】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 16:20 回答[未読]
【24000】Re:ユーザーフォームが表示されない okb 05/4/9(土) 16:46 発言[未読]
【24001】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 17:28 回答[未読]
【24008】Re:ユーザーフォームが表示されない okb 05/4/9(土) 22:03 発言[未読]
【24010】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 22:38 回答[未読]
【24012】Re:ユーザーフォームが表示されない okb 05/4/9(土) 22:57 発言[未読]
【24014】Re:ユーザーフォームが表示されない ウッシ 05/4/9(土) 23:09 回答[未読]

【23960】ユーザーフォームが表示されない
質問  okb  - 05/4/8(金) 16:53 -

引用なし
パスワード
   いつも、お世話になります。
はじめて、ユーザーフォームを作ってみたのですが、うまくいきません。
1つのリストボックスと2つのコマンドボタンだけの単純なものです。

入力し易くするため、あらかじめRANGEを選択していたとき、イベントが発生しないようなんですが、どうすれば発生させることが出来るでしょうか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Count = 1 And Target.Row > 16 Then
      If Target.Column = 6 Then
         MsgBox ("OK")
         For Each C In Worksheets("現場名").Range("C5:C304")
           If C.Value = ActiveCell.Offset(0, -1).Value Then
               現場名フォーム.Show
           End If
         Next C
      End If
  End If
End Sub
RANGEをあらかじめ、選択していないときはイベントは発生します。

次の質問は、フォームが表示されたあとの処理です。

Private Sub UserForm_Initialize()
  Dim i As Long
  With Worksheets("現場名")
    For i = 5 To 304
      If .Cells(i, 3).Value = ActiveCell(0, -1).Value Then
        現場名リスト.AddItem .Cells(i, 4).Value
      End If
    Next i
  End With
  If 現場名リスト.ListCount = 0 Then  '該当するデータがない場合
      MsgBox ("???")
  End If
End Sub
MsgBox ("???")は表示されないのですが、リストにデータが表示されません。
どこが、まずいのでしょうか?

Private Sub 現場名リスト_Click()
  With 現場名リスト
    ActiveCell(0, -1).Value = .List(.ListIndex, 0)
  End With
  Unload 現場名フォーム
End Sub
上は実行していません。

Private Sub 現場名入力_Click()
  Unload 現場名フォーム
  Call 現場名の入力
End Sub
上は、動作します。

Private Sub 閉じる_Click()
  Unload 現場名フォーム
End Sub
1回で閉じず、2ないし3回目のクリックで閉じるのはなぜなんでしょうか?

以上、よろしくお願いします。

【23963】Re:ユーザーフォームが表示されない
発言  Jaka  - 05/4/8(金) 17:36 -

引用なし
パスワード
   こんにちは。

>入力し易くするため、あらかじめRANGEを選択していたとき、イベントが発生しないようなんですが、どうすれば発生させることが出来るでしょうか?

ブックオープン時に適当なセルを選択してから、再度入力する所を選択しなおせばいいと思います。
もう帰りますから、これだけですみません。

【23966】Re:ユーザーフォームが表示されない
発言  okb  - 05/4/8(金) 18:34 -

引用なし
パスワード
   >ブックオープン時に適当なセルを選択してから、再度入力する所を選択しなおせばいいと思います。
意味が、わかりません。
オープン時の選択範囲を選択範囲を変更することは出来ません。
伝票の共通部でなく、明細部で行ごとにイベントを発生させたいのです。

【23979】Re:ユーザーフォームが表示されない
質問  okb  - 05/4/8(金) 22:51 -

引用なし
パスワード
   かなり、解決しました。
>入力し易くするため、あらかじめRANGEを選択していたとき、イベントが発生しないようなんですが、どうすれば発生させることが出来るでしょうか?
これが、解決しません。
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>  If Target.Count = 1 And Target.Row > 16 Then
>      If Target.Column = 6 Then
>         MsgBox ("OK")
>         For Each C In Worksheets("現場名").Range("C5:C304")
>           If C.Value = ActiveCell.Offset(0, -1).Value Then
>               現場名フォーム.Show
                Exit Sub
                上が抜けていました。
>           End If
>         Next C
>      End If
>  End If
>End Sub
>RANGEをあらかじめ、選択していないときはイベントは発生します。
あらかじめ、選択したときの対応策はないでしょうか?

>次の質問は、フォームが表示されたあとの処理です。
>If .Cells(i, 3).Value = ActiveCell(0, -1).Value Then
これをつぎのようにすろとOKでした。
If StrComp(.Cells(i, 3).Value, ActiveCell.Offset(0, -1).Value, vbTextCompare) = 0 Then
>       

【23985】Re:ユーザーフォームが表示されない
発言  ichinose  - 05/4/9(土) 9:38 -

引用なし
パスワード
   okb さん、Jakaさん、おはようございます。

>かなり、解決しました。
>>入力し易くするため、あらかじめRANGEを選択していたとき、イベントが発生しないようなんですが、どうすれば発生させることが出来るでしょうか?
>これが、解決しません。


SelectionChangeイベントはセルの選択に変化が起こったタイミングで
発生しています。
よって、Jakaさんは、

>ブックオープン時に適当なセルを選択してから、再度入力する所を選択しなおせばいい
>と思います。

というようにコードの中でセルの選択に変化を与えるコードを書いてみては?

とおっしゃったのですよ!!

で、そのコードをどのようにどこに記述するかは、このご質問では、
はっきりとは記述できないんです。

例えば、シートの選択を切り替えたとき、アクティブなセルが
>>  If Target.Count = 1 And Target.Row > 16 Then
>>      If Target.Column = 6 Then


この範囲だったときにはイベントを実行させたいのであれば、

Private Sub Worksheet_Activate()
  Dim rng As Range
  Set rng = ActiveWindow.RangeSelection
  Range("a1").Select '範囲外のセルを一度選択する
  rng.Select '元に戻す
End Sub

とすれば、SelectionChangeイベントは発生します。

ブックをオープンしたときにというのであれば、
同じようなコードを

Workbook_Openイベントにて記述する事になります

【23989】Re:ユーザーフォームが表示されない
発言  okb  - 05/4/9(土) 11:24 -

引用なし
パスワード
   いまいち、理解できないのですが、やりたいことはブックオープン時、またはマクロでRANGEを選択後、アクティブセルが列=6 行>17でイベントを実行したいという
ことなんですが...。
 

【23992】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 13:25 -

引用なし
パスワード
   こんにちは

▼okb さん:
>いまいち、理解できないのですが、やりたいことはブックオープン時、またはマクロでRANGEを選択後、アクティブセルが列=6 行>17でイベントを実行したいという
>ことなんですが...。
> 

「いまいち、理解できない」という台詞は回答者側のものだと思います。
こういう事でしょうか?

Private Sub Workbook_Open()
'ブックオープン時
  Dim r As Range
  With ActiveCell
    If .Row > 16 Then
      If .Column = 6 Then
        Set r = .Cells
        Application.EnableEvents = False
        Range("A1").Select
        Application.EnableEvents = True
        r.Select
      End If
    End If
  End With
End Sub

Sub test()
'マクロでRANGEを選択後、アクティブセルが列=6 行>17でイベントを実行
'例えばセルF18の場合
  Dim r As Range
  If ActiveCell.Address = Range("F18").Address Then
    Application.EnableEvents = False
    Range("A1").Select
    Application.EnableEvents = True
    Range("F18").Select
  End If
End Sub

【23994】Re:ユーザーフォームが表示されない
質問  okb  - 05/4/9(土) 15:22 -

引用なし
パスワード
   すみません。
質問に仕方がまずのでしょうか?
具体的には、オープン時、
Private Sub Workbook_Open()
   Sheets("請求書").Select
   Call 入力
End Sub
Sub 入力()
  Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
End Sub

入力時、行>16 列=6で次のイベントを発生させたいのですが、Call 入力としているため、イベントが発生しません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Count = 1 And Target.Row > 16 Then
       If Target.Column = 6 Then
          'MsgBox ("OK")
          For Each C In Worksheets("現場名").Range("C5:C304")
            If C.Value = ActiveCell.Offset(0, -1).Value Then
                    現場名フォーム.Show
               Exit Sub
            End If
          Next C
      End If
   End If
End Sub

次のマクロをどのように、組み合わせばイベントが発生するのでしょうか?
Private Sub Workbook_Open()
'ブックオープン時
  Dim r As Range
  With ActiveCell
    If .Row > 16 Then
      If .Column = 6 Then
        Set r = .Cells
        Application.EnableEvents = False
        Range("A1").Select
        Application.EnableEvents = True
        r.Select
      End If
    End If
  End With
End Sub

【23995】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 15:37 -

引用なし
パスワード
   こんにちは

>Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
で選択した時はアクティブセルはD3になります。

複数セルが選択されていてもアクティブセルは常に単一です。
そこを誤解されているのでは?

実際のところ、Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36")を選択すると
「Worksheet_SelectionChange」で指定した範囲に該当するセルは「F16:F36」に
なりますけど、どちらにしても「If Target.Count = 1」で弾かれますよね?

【23996】Re:ユーザーフォームが表示されない
質問  okb  - 05/4/9(土) 15:48 -

引用なし
パスワード
   >「Worksheet_SelectionChange」で指定した範囲に該当するセルは「F16:F36」に
>なりますけど、どちらにしても「If Target.Count = 1」で弾かれますよね?
Call 入力 を実行しているため、イベントが発生しないので、どうすればいいか
という質問なんですが…。

【23997】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 15:51 -

引用なし
パスワード
   こんにちは

▼okb さん:
>>「Worksheet_SelectionChange」で指定した範囲に該当するセルは「F16:F36」に
>>なりますけど、どちらにしても「If Target.Count = 1」で弾かれますよね?
>Call 入力 を実行しているため、イベントが発生しないので、どうすればいいか
>という質問なんですが…。

Call 入力 を実行しているため、イベントが発生しないのではない、と回答している
のですが・・・。

【23998】Re:ユーザーフォームが表示されない
質問  okb  - 05/4/9(土) 16:04 -

引用なし
パスワード
   >Call 入力 を実行しているため、イベントが発生しないのではない、と回答している
>のですが・・・。
なかなか、かみ合わないですね。
下記をいまのオープンマクロに組み合わせて、イベントを発生させるには、
どうすればいいんでしょうか?
Private Sub Workbook_Open()
'ブックオープン時
  Dim r As Range
  With ActiveCell
    If .Row > 16 Then
      If .Column = 6 Then
        Set r = .Cells
        Application.EnableEvents = False
        Range("A1").Select
        Application.EnableEvents = True
        r.Select
      End If
    End If
  End With
End Sub

【23999】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 16:20 -

引用なし
パスワード
   こんにちは

>なかなか、かみ合わないですね。
反省して下さい。

>Call 入力 を実行しているため、イベントが発生しない
とokbさんは言っているのに、
>Private Sub Workbook_Open()
>'ブックオープン時
>  Dim r As Range
>  With ActiveCell
>    If .Row > 16 Then
>      If .Column = 6 Then
>        Set r = .Cells
>        Application.EnableEvents = False
>        Range("A1").Select
>        Application.EnableEvents = True
>        r.Select
>      End If
>    End If
>  End With
>End Sub
これを使っても仕方ないですよね?
このコードを提案したのは

>具体的には、オープン時、
>Private Sub Workbook_Open()
>   Sheets("請求書").Select
>   Call 入力
>End Sub
>Sub 入力()
>  Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
>End Sub

という説明を見る前の事です。

>Call 入力 を実行しているため、イベントが発生しない
のではなくて、イベントは発生しているが「Sub 入力」で複数セル範囲を選択して
いるため先程説明したとおり「Worksheet_SelectionChange」の中の
「If Target.Count = 1」で弾かれてしまうのが真相です。

では、どうするかと言うと「Worksheet_SelectionChange」のコードを修正すれば
いいのです。

ただし、複数セル範囲が選択されたときにその中に
「Worksheet_SelectionChange」で指定した範囲のセルが含まれているとして
どんな処理をすればいのかはokbさんにしか分りませんので、その部分を説明し直して
下さい。

【24000】Re:ユーザーフォームが表示されない
発言  okb  - 05/4/9(土) 16:46 -

引用なし
パスワード
   >「Worksheet_SelectionChange」で指定した範囲のセルが含まれているとして
>どんな処理をすればいのかはokbさんにしか分りませんので、その部分を説明し直して
>下さい。
ギブアップです。
これ以上、なにを説明すればいいのかわかりませ。

【24001】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 17:28 -

引用なし
パスワード
   こんにちは

>これ以上、なにを説明すればいいのかわかりませ。
質問者が説明出来ない事を回答出来る人はいないと思いますよ。

現在の「Worksheet_SelectionChange」の処理内容は理解されているのですか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>選択されたセルの個数が「1」かつ選択されたセルの行番号が「16」以上なら処理
>(注)セルの個数を「1」に限定しない場合、複数セル範囲の「Row」は選択された
>   セル範囲の一番上のセルの行番号になります。
  If Target.Count = 1 And Target.Row > 16 Then
>選択されたセルの列番号が「6」の時
>(注)やはり複数セル範囲の場合は「Column」は選択されセル範囲の一番左のセル
    If Target.Column = 6 Then
      MsgBox ("OK")

>ここからが実際の「Worksheet_SelectionChange」によるイベント処理
>Worksheets("現場名").Range("C5:C304")というセル範囲の各セルの値で
>選択されたセル(Target)の左隣のセルの値と同じものが有った時点で
>現場名フォームを表示する。
>つまりイベントが発生しても条件が満たされない場合は現場名フォームは表示されない。
>また、選択されたセルの個数を「1」に限定しない場合は、
>ActiveCellは、選択された複数セル(Target)のうちどこなのか不定です。
>コードで「Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select」とした
>場合 ActiveCellは「D3」になりますが、手作業の場合には一旦複数セルを選択
>した後に TabキーでActiveCell を変更する事が出来てしまいます。
>という訳で、もし複数セル範囲選択でイベント処理する時はそのセル範囲に
>F6以下のセルが複数含まれていた場合にどのセルの値と「C.Value」を比較するのか
>決めなければなりません。
      For Each C In Worksheets("現場名").Range("C5:C304")
        If C.Value = ActiveCell.Offset(0, -1).Value Then
          現場名フォーム.Show
          Exit Sub
        End If
      Next C
    End If
  End If
End Sub

【24008】Re:ユーザーフォームが表示されない
発言  okb  - 05/4/9(土) 22:03 -

引用なし
パスワード
   >>Call 入力 を実行しているため、イベントが発生しない
>のではなくて、イベントは発生しているが「Sub 入力」で複数セル範囲を選択して
>いるため先程説明したとおり「Worksheet_SelectionChange」の中の
>「If Target.Count = 1」で弾かれてしまうのが真相です。
この説明やはり、おかしいと思います。
かみ合わないはずです。
Call 入力で、Selectionしているので、selection changeイベントが発生するはずがありません。
右マウスイベントは、発生するのでOK。
ショートカットか、右マウスイベントで対応します。

【24010】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 22:38 -

引用なし
パスワード
   こんばんは

▼okb さん:
>Call 入力で、Selectionしているので、selection changeイベントが発生するはずがありません。

何故そう決めつけるのですか?

新規ブックを用意して、Sheet1の「Worksheet_SelectionChange」に

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
  If Intersect(Target, Range("F6:F65536")) Is Nothing Then Exit Sub
  MsgBox "Call入力で Selectionしたけど Selection changeイベント発生"
End Sub

として、標準モジュールに

Sub 入力()
  Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
End Sub

として、Sheet1を開いておいて「Sub 入力」を実行してみて下さい。

これで最終回答にします。

【24012】Re:ユーザーフォームが表示されない
発言  okb  - 05/4/9(土) 22:57 -

引用なし
パスワード
   発生しませんよ。
最初のselectを実行したときだけす。
Sub 入力()
  Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
End Sub

【24014】Re:ユーザーフォームが表示されない
回答  ウッシ  - 05/4/9(土) 23:09 -

引用なし
パスワード
   >これで最終回答にします。
と書いたのに・・・・

▼okb さん:
>発生しませんよ。
>最初のselectを実行したときだけす。
ですからそれについては【23992】に書きました。

Sub 入力()
  Application.EnableEvents = False
  Range("A1").Select
  Application.EnableEvents = True
  Range("D3,E7,D10:E10,G13,J14,D17:G36,J17:J36").Select
End Sub

とすればいいです。

応用出来ないなら、より正確に他人に分り易く要望を伝えるのが質問者の義務では?

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