過去ログ

                                Page     784
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼ユーザーフォームの表示位置  自己満足 03/2/19(水) 19:08
   ┗Re:ユーザーフォームの表示位置  bykin 03/2/23(日) 12:11
      ┗おお...  自己満足 03/2/24(月) 12:57

 ───────────────────────────────────────
 ■題名 : ユーザーフォームの表示位置
 ■名前 : 自己満足
 ■日付 : 03/2/19(水) 19:08
 -------------------------------------------------------------------------
   こんにちは。

どこかで見たような題名ですが過去ログとはちょっと違うので悩んでいます。お助けください。

セルをクリックしたその位置にユーザーフォームを表示したいのです。
(マウスカーソルを追って来るような感じ)

Itemを登録したコンボボックスとOKボタンだけが有るセルと同じくらいの大きさのユーザーフォーム UF1 を作って以下で試してみましたが...
1.Cells(Target.Row, Target.Column).Topの後にプラスマイナスの補正を行うとそれらしく追って来てくれるのですが、スクロールさせてクリックすると画面外に表示されるようです。
2..TOP=の値は1行目のセルからの距離?のようで値が100から550(ポイント?)の範囲外になると画面外に出るようです。取得した値を引いたり割ったりして補正してみたのですが画面内に表示する事は出来てもカーソルを追ってくれません。

マウスカーソル位置を取得出来れば良いのでしょうが、ピタッ!と追ってくるように出来ないものでしょうか。(当然、クリックした時だけUF1を表示させたい)

ちなみに、セル高さは19.5(ポイント?)で画面上では50行から78.5行まで見えます。
(50行より上方は非表示やウインドウ枠の固定で見えなくなっています)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With UF1
    If Target.Count < 2 Then
      If Target.Row >= 59 Then
          .Top = Cells(Target.Row, Target.Column).Top
          .Left = Cells(Target.Row, Target.Column). Left
          .Show 0
        Else
          .Hide
      End If
    End If
  End With
End Sub
 ───────────────────────────────────────  ■題名 : Re:ユーザーフォームの表示位置  ■名前 : bykin  ■日付 : 03/2/23(日) 12:11  -------------------------------------------------------------------------
   こんにちわ。もう見てへんかな?

>セルをクリックしたその位置にユーザーフォームを表示したいのです。
クリックってのは右クリックでええのかな?
ウィンドウ枠の固定をやってへんかったら

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  Load UserForm1
  With Application
    UserForm1.Left = ActiveCell.Left + .Width - .UsableWidth + .Left + ActiveWindow.Left
    UserForm1.Top = ActiveCell.Top + .Height - .UsableHeight + .Top + ActiveWindow.Top
  End With
  UserForm1.Show
  Unload UserForm1
  Set UserForm1 = Nothing
End Sub

これで、ほぼアクティブセルに近いとこに表示されると思うねんけど、
ウィンドウ枠を固定してまうとちょっと難しいみたいやね。
で、↓こんな感じでどうでっしゃろか?

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  Const OffsetX = 0
  Const OffsetY = 0
  Dim LastPaneFirstCell As Range
  Dim VisibleLeft As Single
  Dim VisibleTop As Single
  Dim TargetLeft As Single
  Dim TargetTop As Single
  Dim TargetPane As Integer
  Dim i As Integer
  Cancel = True
  If Target.Cells.Count > 1 Then
    MsgBox "複数セル選択時は右クリックできません", vbCritical
    Exit Sub
  End If
  With ActiveWindow
    For i = 1 To .Panes.Count
      With .Panes(i)
        If Not Intersect(Target, .VisibleRange) Is Nothing Then
          With .VisibleRange.Item(1)
            VisibleLeft = .Left
            VisibleTop = .Top
          End With
          TargetPane = i
          Exit For
        End If
      End With
    Next
    TargetLeft = Target.Left
    TargetTop = Target.Top
    Select Case .Panes.Count
      Case 2
        With .Panes(1).VisibleRange
          If ActiveWindow.Panes(2).VisibleRange.Item(1).Row = 1 Then
            Set LastPaneFirstCell = .Cells(1, .Columns.Count).Offset(0, 1)
          Else
            Set LastPaneFirstCell = .Cells(.Rows.Count, 1).Offset(1, 0)
          End If
        End With
        If TargetPane = 2 Then
          TargetLeft = TargetLeft + LastPaneFirstCell.Left - VisibleLeft
          TargetTop = TargetTop + LastPaneFirstCell.Top - VisibleTop
        End If
      Case 4
        With .Panes(1).VisibleRange
          Set LastPaneFirstCell = .Item(.Cells.Count).Offset(1, 1)
        End With
        If TargetPane = 2 Or TargetPane = 4 Then
          TargetLeft = TargetLeft + LastPaneFirstCell.Left - VisibleLeft
        End If
        If TargetPane = 3 Or TargetPane = 4 Then
          TargetTop = TargetTop + LastPaneFirstCell.Top - VisibleTop
        End If
    End Select
  End With
  Load UserForm1
  With Application
    TargetLeft = TargetLeft + .Width - .UsableWidth + .Left + ActiveWindow.Left + OffsetX
    TargetLeft = .WorksheetFunction.Min(TargetLeft, .Left + .Width - UserForm1.Width)
    TargetTop = TargetTop + .Height - .UsableHeight + .Top + ActiveWindow.Top + OffsetY
    TargetTop = .WorksheetFunction.Min(TargetTop, .Top + .Height - UserForm1.Height)
  End With
  With UserForm1
    .Left = TargetLeft
    .Top = TargetTop
    .Show
  End With
  Unload UserForm1
  Set UserForm1 = Nothing
End Sub

一応端っこのセルで右クリックした時にフォームが画面からはみ出ないようにしてます。
表示位置の微調整は OffsetX OffsetY の定数でやってください。

試してみてな。
ほな。
 ───────────────────────────────────────  ■題名 : おお...  ■名前 : 自己満足  ■日付 : 03/2/24(月) 12:57  -------------------------------------------------------------------------
   bykin さん、こんにちは。
ご回答ありがとうございます。
(神は見捨てていなかった。涙涙)
朝から一生懸命TESTしていましたので遅れちゃいましてすみません。

!!出来ました。!!

Panes...?なんのこっちゃ。
で意味不明でも出来ちゃう所がすごいです。

>ウィンドウ枠の固定をやってへんかったら
...の方は
なんだか下の方のセルになると画面外に出ているみたいで、少し解読が必要のようです。

ほんと助かりました、ありがとうございます。

<<< このマクロを試してみようとお考えの方に >>>
1,ユーザーフォームのStartUpPositionプロパティーを「0-手動」にする事。
2,ユーザーフォームの高さはできるだけ低く作成する事。
3,もしユーザーフォームが画面外に表示されてしまい
シートへカーソルが戻らなくなったら Alt+f4
を押してユーザーフォームを消してください。
以上3点に注意してください。
TEST時にこれで ??? におちいってしまいました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 784