Excel VBA質問箱 IV

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

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


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

【62889】シートのカラム幅変更をイベントとして察知する方法 ks.net 09/9/13(日) 4:11 質問[未読]
【62905】Re:シートのカラム幅変更をイベントとして... 超初心者 09/9/14(月) 14:03 発言[未読]
【62908】Re:シートのカラム幅変更をイベントとして... Yuki 09/9/15(火) 8:09 発言[未読]

【62889】シートのカラム幅変更をイベントとして察...
質問  ks.net  - 09/9/13(日) 4:11 -

引用なし
パスワード
   初めまして。ks.netと申します。

ある特定のワークシート上の任意のカラム幅が変更された際、
それを察知して動くプロシージャを作ることは可能でしょうか。

シートAのカラム幅が変更された際、同じ変更をシートBへ自動的に適用するようなプログラムを作りたいと考えています。

【62905】Re:シートのカラム幅変更をイベントとし...
発言  超初心者  - 09/9/14(月) 14:03 -

引用なし
パスワード
   ▼ks.net さん:
列幅の変更を起動条件とすることは出来ないようです。

別案として

アクティブセルを変更したら、
(列幅を確認し、ちがったら)列幅を反映する。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

とか

シートBがアクティブになったら、
シートAから列幅をコピーしてくる。
Private Sub Worksheet_Activate()

とか、にされてはいかがでしょう。


Do〜loop等で監視し続ければ、
列幅の変更も感知出来るとは思いますが、
PCの負担を考えるとおすすめできません。

【62908】Re:シートのカラム幅変更をイベントとし...
発言  Yuki  - 09/9/15(火) 8:09 -

引用なし
パスワード
   ▼ks.net さん:
>初めまして。ks.netと申します。
>
>ある特定のワークシート上の任意のカラム幅が変更された際、
>それを察知して動くプロシージャを作ることは可能でしょうか。
>
>シートAのカラム幅が変更された際、同じ変更をシートBへ自動的に適用するようなプログラムを作りたいと考えています。
SetTimerを使っているのでCPUにはそれほど負担がかかりません。
でも、あんまり実用的ではないですね。お遊び程度で


ThisWorkbookモジュールに
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Timer_End
End Sub


対象のシートモジュールに
Option Explicit
Private Sub Worksheet_Activate()
  Timer_Start
End Sub

Private Sub Worksheet_Deactivate()
  Timer_End
End Sub


標準モジュールに
Option Explicit
Private Declare Function SetTimer Lib "user32" _
            (ByVal hWnd As Long, _
             ByVal nIDEvent As Long, _
             ByVal uElapse As Long, _
             ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32" _
            (ByVal hWnd As Long, _
             ByVal nIDEvent As Long) As Long

Private lngTimerId As Long
Private dblColW()  As Double

Public Sub TimerProc(ByVal lHwnd As Long, _
           ByVal lMsg As Long, _
           ByVal lTimerID As Long, _
           ByVal lTime As Long)
  Dim i  As Long
  On Error GoTo TimerProc_Err
  With Worksheets("Sheet1")
    For i = 1 To .Columns.Count
      If dblColW(i) <> .Columns(i).ColumnWidth Then
        Worksheets("Sheet2").Columns(i).ColumnWidth = .Columns(i).ColumnWidth
        dblColW(i) = .Columns(i).ColumnWidth
      End If
    Next
  End With
  Exit Sub
TimerProc_Err:
  Debug.Print Err.Number, Err.Description
  Err.Clear
  Timer_End
End Sub

Sub Timer_Start()
  Dim i  As Long
  With Worksheets("Sheet1")
    ReDim dblColW(1 To .Columns.Count)
    For i = 1 To .Columns.Count
      dblColW(i) = .Columns(i).ColumnWidth
    Next
  End With
  lngTimerId = SetTimer(Application.hWnd, 1, 300, AddressOf TimerProc)
End Sub

Sub Timer_End()
  Dim lngRtn As Long
  If lngTimerId <> 0 Then
    lngRtn = KillTimer(Application.hWnd, lngTimerId)
    lngTimerId = 0
  End If
End Sub

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