Excel VBA質問箱 IV

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

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


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

【59733】Spreadsheetコントロールの操作について いのっち 09/1/5(月) 11:47 質問[未読]
【59735】Re:Spreadsheetコントロールの操作について ichinose@今年初投稿 09/1/5(月) 19:32 発言[未読]
【59743】Re:Spreadsheetコントロールの操作について いのっち 09/1/6(火) 18:47 お礼[未読]
【59750】Re:Spreadsheetコントロールの操作について ichinose 09/1/7(水) 8:22 発言[未読]
【59754】Re:Spreadsheetコントロールの操作について... ichinose 09/1/7(水) 10:00 発言[未読]
【59755】Re:Spreadsheetコントロールの操作について... いのっち 09/1/7(水) 11:39 お礼[未読]
【59756】Re:Spreadsheetコントロールの操作について Yuki 09/1/7(水) 11:43 発言[未読]
【59757】Re:Spreadsheetコントロールの操作について Yuki 09/1/7(水) 11:46 発言[未読]
【59759】Re:Spreadsheetコントロールの操作について ichinose 09/1/7(水) 12:52 発言[未読]

【59733】Spreadsheetコントロールの操作について
質問  いのっち  - 09/1/5(月) 11:47 -

引用なし
パスワード
   明けましておめでとうございますm(_._)m 早々質問ですが、よろしくお願いいたします。

「ボタンを押すと、小窓が開いて別シートの内容が見える」というのを作成しようと思いました。「Microsoft Office Spreadsheet 9.0」(EXCEL2000)で、シートの中身は当初思っていたリンクではなくて丸丸内容をコピーぺして、ボタンを押すとその表が見える所まではできました。以下、質問です。

質問1・この小窓を開いたまま、本体のエクセル表の入力するにはどうしたら良いのでしょうか?(いまだと、小窓を開いたままだと(閉じないと)入力できません)

(補足)質問2・小窓内のスプレッドシート部分はレイアウトしたまま表示されてOKなのですが、スプレッドシート右下角の斜め3本線をドラックするとスプレッドシートの大きさが変更できてしまいます。そんなに気にはならないのですが、これは固定できますか?

【59735】Re:Spreadsheetコントロールの操作につい...
発言  ichinose@今年初投稿  - 09/1/5(月) 19:32 -

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


>
>「ボタンを押すと、小窓が開いて別シートの内容が見える」というのを作成しようと思いました。「Microsoft Office Spreadsheet 9.0」(EXCEL2000)で、シートの中身は当初思っていたリンクではなくて丸丸内容をコピーぺして、ボタンを押すとその表が見える所まではできました。以下、質問です。
>
>質問1・この小窓を開いたまま、本体のエクセル表の入力するにはどうしたら良いのでしょうか?(いまだと、小窓を開いたままだと(閉じないと)入力できません)

小窓って何ですか? 
ユーザーフォームにスプレッドシートを配置したと言うことですか?
出来ているコードの提示がないので上記の記述だと想像も難しいのです。

ユーザーフォームだとした場合

Sub sample()
  UserForm1.Show vbModeless
End Sub

↑は、ユーザーフォーム名が UserForm1 の場合です。

これでユーザーフォームを表示した状態でシートの入力が可能になります。

>
>(補足)質問2・小窓内のスプレッドシート部分はレイアウトしたまま表示されてOKなのですが、スプレッドシート右下角の斜め3本線をドラックするとスプレッドシートの大きさが変更できてしまいます。そんなに気にはならないのですが、これは固定できますか?

事前設定でも可能ですが、

ユーザーフォーム(UserForm1)のモジュールに

Private Sub UserForm_Initialize()
  Spreadsheet1.AutoFit = True
End Sub

↑は、配置したスプレッドシートコントロール名が、Spreadsheet1の場合です。

これでスプレッドシートコントロールの大きさは固定されます。

【59743】Re:Spreadsheetコントロールの操作につい...
お礼  いのっち  - 09/1/6(火) 18:47 -

引用なし
パスワード
   ichinoseさん、こんにちは、解答ありがとうございました。(質問が言葉足らずですみませんでした、以後気をつけます。おっしゃる通り「小窓」はUserForm1のことです)。

>  UserForm1.Show vbModeless

上記でばっちり出来ました。

>  Spreadsheet1.AutoFit = True

固定できました、ありがとうございます。(今まで、左下の操作部分をFrame1を上にのっけて回避していましたが、ぴったりになりました)

※追加質問ですみませんが、今、UserForm1が固定の大きさ(プロパティのHeight200,Width500位)なのですが、UserForm1が表示された時、ユーザーが自由に大きさを変えられるようにすることは可能でしょうか?(SpreadSheetの方の兼ね合いもあるかもしれませんネ)。

【59750】Re:Spreadsheetコントロールの操作につい...
発言  ichinose  - 09/1/7(水) 8:22 -

引用なし
パスワード
   おはようございます。


>※追加質問ですみませんが、今、UserForm1が固定の大きさ(プロパティのHeight200,Width500位)なのですが、UserForm1が表示された時、ユーザーが自由に大きさを変えられるようにすることは可能でしょうか?

>(SpreadSheetの方の兼ね合いもあるかもしれませんネ)。
これは、ありますね!!ユーザーフォームだけ大きくしても意味ないものね!!
本格的にやると大変ですねえ。

一例として、

新規ブックにて、ユーザーフォーム(UserForm1)だけを作成してください。
一例ですから、コントロールはコードで配置しますから、何も配置しないでください。


標準モジュールに

'=============================================================
Option Explicit
Sub samp()
  UserForm1.Show vbModeless
End Sub


作成したUserform1のモジュールには

'===============================================================
Option Explicit
Private s_w As Double
Private s_h As Double
Private WithEvents sp_h As MSForms.SpinButton
Private WithEvents sp_v As MSForms.SpinButton
Private spd As Spreadsheet
'=============================================================
Private Sub sp_h_SpinDown()
  Me.Width = Me.Width - 6
  spd.Width = spd.Width * Me.Width / s_w
  reset_spin
End Sub
'=============================================================
Private Sub sp_h_SpinUp()
  Me.Width = Me.Width + 6
  spd.Width = spd.Width * Me.Width / s_w
  reset_spin
End Sub
'=============================================================
Private Sub sp_v_SpinDown()
  Me.Height = Me.Height + 6
  spd.Height = spd.Height * Me.Height / s_h
  reset_spin
End Sub
'=============================================================
Private Sub sp_v_SpinUp()
  Me.Height = Me.Height - 6
  spd.Height = spd.Height * Me.Height / s_h
  reset_spin
End Sub
'=============================================================
Private Sub reset_spin()
    With sp_h
     .Width = 54
     .Height = 24
     .Left = Me.Width - .Width - 50
     .Top = Me.Height - .Height - 25
    End With
    With sp_v
     .Width = 24
     .Height = 54
     .Left = Me.Width - .Width - 12
     .Top = Me.Height - .Height - 50
    End With
End Sub
'=============================================================
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  If sp_h Is Nothing Then
    With Me
     Set sp_h = .Controls.Add("Forms.SpinButton.1", , True)
     Set sp_v = .Controls.Add("Forms.SpinButton.1", , True)
    End With
    reset_spin
  Else
    Controls.Remove sp_h.Name
    Controls.Remove sp_v.Name
    Set sp_h = Nothing
    Set sp_v = Nothing
  End If
End Sub
'=============================================================
Private Sub UserForm_Initialize()
  With Me
    .Width = 425
    .Height = 350
    s_w = .Width
    s_h = .Height
  End With
  Set spd = Controls.Add("OWC.Spreadsheet.9", , True)
  With spd
    .Left = 0
    .Top = 0
    .Width = 200
    .Height = 150
    .AutoFit = True
  End With
  Set sp_h = Nothing
  Set sp_v = Nothing
End Sub


以上です。sampを実行してみてください。

Userform1には、スプレッドシートが表示されていますよね?

ユーザーフォームのスプレッドシート以外の箇所をダブルクリックしてください。
隅にスピンボタンが表示されます。

クリックして下さい。ユーザーフォームのサイズが変更されます。
(再度、ダブルクリックすると、スピンボタンが消えます)

今回は、スプレッドシートだけですが、他にコントロールがあれば、
その制御もしなければなりません。

試してみてください。

【59754】Re:Spreadsheetコントロールの操作につい...
発言  ichinose  - 09/1/7(水) 10:00 -

引用なし
パスワード
   訂正です。

>作成したUserform1のモジュールには
>
> '===============================================================
>Option Explicit
>Private s_w As Double
>Private s_h As Double
>Private WithEvents sp_h As MSForms.SpinButton
>Private WithEvents sp_v As MSForms.SpinButton
Private spd As object ' ←ここのデータの型を変更してください
> '=============================================================
>Private Sub sp_h_SpinDown()
>  Me.Width = Me.Width - 6
>  spd.Width = spd.Width * Me.Width / s_w
>  reset_spin
>End Sub
> '=============================================================
>Private Sub sp_h_SpinUp()
>  Me.Width = Me.Width + 6
>  spd.Width = spd.Width * Me.Width / s_w
>  reset_spin
>End Sub
> '=============================================================
>Private Sub sp_v_SpinDown()
>  Me.Height = Me.Height + 6
>  spd.Height = spd.Height * Me.Height / s_h
>  reset_spin
>End Sub
> '=============================================================
>Private Sub sp_v_SpinUp()
>  Me.Height = Me.Height - 6
>  spd.Height = spd.Height * Me.Height / s_h
>  reset_spin
>End Sub
> '=============================================================
>Private Sub reset_spin()
>    With sp_h
>     .Width = 54
>     .Height = 24
>     .Left = Me.Width - .Width - 50
>     .Top = Me.Height - .Height - 25
>    End With
>    With sp_v
>     .Width = 24
>     .Height = 54
>     .Left = Me.Width - .Width - 12
>     .Top = Me.Height - .Height - 50
>    End With
>End Sub
> '=============================================================
>Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
>  If sp_h Is Nothing Then
>    With Me
>     Set sp_h = .Controls.Add("Forms.SpinButton.1", , True)
>     Set sp_v = .Controls.Add("Forms.SpinButton.1", , True)
>    End With
>    reset_spin
>  Else
>    Controls.Remove sp_h.Name
>    Controls.Remove sp_v.Name
>    Set sp_h = Nothing
>    Set sp_v = Nothing
>  End If
>End Sub
> '=============================================================
>Private Sub UserForm_Initialize()
>  With Me
>    .Width = 425
>    .Height = 350
>    s_w = .Width
>    s_h = .Height
>  End With
>  Set spd = Controls.Add("OWC.Spreadsheet.9", , True)
>  With spd
>    .Left = 0
>    .Top = 0
>    .Width = 200
>    .Height = 150
>    .AutoFit = True
>  End With
>  Set sp_h = Nothing
>  Set sp_v = Nothing
>End Sub
>
>
>以上です。sampを実行してみてください。
>
>Userform1には、スプレッドシートが表示されていますよね?
>
>ユーザーフォームのスプレッドシート以外の箇所をダブルクリックしてください。
>隅にスピンボタンが表示されます。
>
>クリックして下さい。ユーザーフォームのサイズが変更されます。
>(再度、ダブルクリックすると、スピンボタンが消えます)
>
>今回は、スプレッドシートだけですが、他にコントロールがあれば、
>その制御もしなければなりません。
>
>試してみてください。

【59755】Re:Spreadsheetコントロールの操作につい...
お礼  いのっち  - 09/1/7(水) 11:39 -

引用なし
パスワード
   コーディングお手数おかけしました!早速、ためさせていただきました。

面白い動きですネ!!最初、どうしたら大小できるんだろうと思いましたが、ダブルクリックしたらボタンが出現!

教えていただいた、このコードを元にすれば、自分のイメージと近いものになると思いました。

ただ、やはり、VBA標準仕様でないとのことだと思いますので、これ以上コーディングして現在のマクロに組み込んで時間までに完成させるには、私には力量が足りない・・・(^^;今後の課題としてイメージどおりに出来るかはやってみたいと思います、大変参考になりました、ありがとうございますm(_._)m

【59756】Re:Spreadsheetコントロールの操作につい...
発言  Yuki  - 09/1/7(水) 11:43 -

引用なし
パスワード
   ▼いのっち さん:
>
>※追加質問ですみませんが、今、UserForm1が固定の大きさ(プロパティのHeight200,Width500位)なのですが、UserForm1が表示された時、ユーザーが自由に大きさを変えられるようにすることは可能でしょうか?(SpreadSheetの方の兼ね合いもあるかもしれませんネ)。

フォームのサイズ変更とSpreadsheetの位置も自由に動かせるものです。
上記が出来るからSpreadsheetのサイズ変更も可にしてもOKかな?
strClassの値ですがSpreadsheetのバージョンで違うので注意して下さい。

Private Declare Function GetWindowLong Lib "user32" _
          Alias "GetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long) As Long
          
Private Declare Sub SetWindowLong Lib "user32" _
          Alias "SetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long, _
          ByVal dwNewLong As Long)
          
Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION = &HC00000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_SYSMENU = &H80000
Private Const WS_THICKFRAME = &H40000
Private Const WS_OVERLAPPED = &H0
Private Const WS_OVERLAPPEDWINDOW = _
       (WS_OVERLAPPED Or _
       WS_CAPTION Or _
       WS_SYSMENU Or _
       WS_THICKFRAME Or _
       WS_MINIMIZEBOX Or _
       WS_MAXIMIZEBOX)

Private Sub UserForm_Initialize()
  Dim strMClass  As String
  Dim strSClass  As String
  Dim strClass  As String
  Dim fhWnd    As Long
  Dim mhWnd    As Long
  Dim shWnd    As Long
  
  strMClass = "ThunderDFrame"
  fhWnd = FindWindow(strMClass, Me.Caption)
  ' フォームのサイズ変更可
  SetWindowLong fhWnd, GWL_STYLE, _
  GetWindowLong(fhWnd, GWL_STYLE) Or WS_OVERLAPPEDWINDOW
  'Spredsheetの移動可
  strSClass = "F3 Server 60000000"
  mhWnd = FindWindowEx(fhWnd, 0&, strClass, vbNullString)
  If mhWnd = 0 Then Exit Sub
  strClass = "ATL:38CAE248"    ' Spreadsheet 10 の時
  strClass = "ATL:10EDB528"    ' Spreadsheet 11 の時
  shWnd = FindWindowEx(mhWnd, 0&, strClass, vbNullString)
  If shWnd = 0 Then Exit Sub
  SetWindowLong shWnd, GWL_STYLE, _
  GetWindowLong(shWnd, GWL_STYLE) Or WS_CAPTION
  'Spredsheetのサイズ変更不可
'  Me.Spreadsheet1.AutoFit = True
End Sub

【59757】Re:Spreadsheetコントロールの操作につい...
発言  Yuki  - 09/1/7(水) 11:46 -

引用なし
パスワード
   ▼いのっち さん:
下記の宣言が抜けていました。

Private Declare Function FindWindow Lib "user32" _
          Alias "FindWindowA" _
          (ByVal lpClassName As String, _
          ByVal lpWindowName As String) As Long
          
Private Declare Function FindWindowEx Lib "user32" _
          Alias "FindWindowExA" _
          (ByVal hWnd1 As Long, _
          ByVal hWnd2 As Long, _
          ByVal lpsz1 As String, _
          ByVal lpsz2 As String) As Long

【59759】Re:Spreadsheetコントロールの操作につい...
発言  ichinose  - 09/1/7(水) 12:52 -

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

APIで出来るんですねえ!!
ならば、

Userform1のモジュールを以下のように変更すれば、


'====================================
Private Declare Function FindWindow Lib "user32" _
          Alias "FindWindowA" _
          (ByVal lpClassName As String, _
          ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" _
          Alias "GetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long) As Long
     
Private Declare Sub SetWindowLong Lib "user32" _
          Alias "SetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long, _
          ByVal dwNewLong As Long)
     
Private Const GWL_STYLE As Long = -16
Private Const WS_THICKFRAME = &H40000
Private s_w As Double
Private s_h As Double
Private spd As Object
'============================
Private Sub UserForm_Initialize()
  Dim strMClass  As String
  Dim strSClass  As String
  Dim strClass  As String
  Dim fhWnd    As Long
  Dim mhWnd    As Long
  Dim shWnd    As Long
 
  strMClass = "ThunderDFrame"
  fhWnd = FindWindow(strMClass, Me.Caption)
  ' フォームのサイズ変更可
  SetWindowLong fhWnd, GWL_STYLE, _
  GetWindowLong(fhWnd, GWL_STYLE) Or WS_THICKFRAME
  With Me
    .Width = 425
    .Height = 350
    s_w = .Width
    s_h = .Height
  End With
  Set spd = Controls.Add("OWC.Spreadsheet.9", , True)
  With spd
    .Left = 0
    .Top = 0
    .Width = 200
    .Height = 150
    .AutoFit = True
  End With
End Sub
'==========================================================
Private Sub UserForm_Resize()
  If Not spd Is Nothing Then
    spd.Width = spd.Width * Me.Width / s_w
    spd.Height = spd.Height * Me.Height / s_h
  End If
End Sub


ユーザーフォームのサイズ変更がスプレッドシートに反映されますね!!

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