Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2007)
選択したセルの上端、左端からの距離
投稿日時: 19/12/25 14:36:00
投稿者: o_taroh

UserFormの位置を選択したセルの位置に移動したいのですがRange().TopやLeftでは行、列番号やメニュウバーなどの幅は加味されてないような気がします、Windows画面の最上端、最左端からの距離を得る方法をお願いします。

回答
投稿日時: 19/12/25 17:07:16
投稿者: よろずや

Option Explicit
 
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDc As Long, ByVal nIndex As Long) As Long
Private Declare Sub ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDc As Long)
 
Private Const LOGPIXELSX As Long = &H58
Private Const LOGPIXELSY As Long = &H5A
Private Const PPI As Long = 72 ' ポイントパーインチ
 
Private mDpiX As Long ' ドットパーインチ
Private mDpiY As Long
Private myHeight As Single
Private myInsideHeight As Single
Private myWidth As Single
Private myInsideWidth As Single
 
Private Sub GetDeviceDpi()
    Dim hwnd As Long, hDc As Long
    hwnd = Application.hwnd
    hDc = GetDC(hwnd)
    mDpiX = GetDeviceCaps(hDc, LOGPIXELSX)
    mDpiY = GetDeviceCaps(hDc, LOGPIXELSY)
    Call ReleaseDC(hwnd, hDc)
End Sub
 
Private Sub UserForm_Initialize()
    myHeight = Me.Height
    myInsideHeight = Me.InsideHeight
    myWidth = Me.Width
    myInsideWidth = Me.InsideWidth
    Call GetDeviceDpi
End Sub
 
Private Sub UserForm_Layout()
    Dim A1Left As Single, A1Top As Single
    With ActiveWindow
        A1Left = .PointsToScreenPixelsX(0) * (PPI / mDpiX)
        A1Top = .PointsToScreenPixelsY(0) * (PPI / mDpiY)
        Me.Left = A1Left + Range("B2").Left * (.Zoom / 100!) - 5.25
        Me.Top = A1Top + Range("B2").Top * (.Zoom / 100!)
        Call UserForm_Zoom(.Zoom)
    End With
End Sub
 
Private Sub UserForm_Zoom(Percent As Integer)
    Me.Height = (myHeight - myInsideHeight) + myInsideHeight * Percent / 100#
    Me.Width = (myWidth - myInsideWidth) + myInsideWidth * Percent / 100#
End Sub
 
です。

投稿日時: 19/12/27 10:46:03
投稿者: o_taroh

よろずやさん対応ありがとうございます、やはりドット単位で処理しなければならないようですが、せっかく書いてくれたプログラムが私には難解で、ほとんど理解できないのですが、もしわがままを許してもらえれば具体的に、例えばセルH5の右にセルの上端とフォーム上端をそろえて表示するとすれば、よろずやさんが提示してくれたプログラムをどのように使うのか教えてくれるとありがたいのですが如何でしょうか?

回答
投稿日時: 19/12/27 11:39:12
投稿者: よろずや

Range("B2") と書いてある所(2か所)を
Range("H5") にすればいいです。

回答
投稿日時: 19/12/27 11:42:40
投稿者: よろずや

セルH5の右にということは、I5のLeft、Top ということかな。

投稿日時: 19/12/27 13:54:59
投稿者: o_taroh

ありがとうございます、I5セルのトップにUserFormのトップが張り付けばでいいです
お恥ずかしい限りですが、H5をクリックしてSelectionChangeのイベントでRow,Columnの値を得た後の処理の流れが解りません、よろしくお願いいたします。

回答
投稿日時: 19/12/27 16:12:31
投稿者: よろずや

UserForm のモジュールに記述します。
 
どこかで UserForm1.Show を実行すると、
 
UserForm_Initialize
GetDeviceDpi
UserForm_Layout
UserForm_Zoom
 
の順に実行され I5 セルの左上に貼りつきます。
 
 

投稿日時: 19/12/27 17:35:02
投稿者: o_taroh

よろずやさん,大変ありがとうございました解決することが出来ました。
私も、もう少し勉強してスキルアップしようと思います。