Excel VBA質問箱 IV

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

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


36558 / 76732 ←次へ | 前へ→

【45353】Re:集計されたシートについて。
発言  飛ばない豚  - 06/12/20(水) 13:06 -

引用なし
パスワード
   ▼無頼斎 さん:
> それを避けるべく、当該シートが集計されている場合は、"集計されています"や
> "集計を解除してから、貼り付けて下さい"などのメッセージボックスを、
> 貼り付ける作業の前に入れたいのです。できますでしょうか?

すみません。貼り付けの前にメッセージ出力する方法は分かりません。
(Worksheet_BeforChangeイベントが無いので出来ないかもしれません)


代替案を考えてみました。

当該シートがアクティブになった際、
集計がされていれば、クリップボードをクリアする。

という方法です。

集計の判定は、OutlineLevelプロパティを使ってみました。
なので、「集計方法」により使えないかもしれません。

'==== ワークシートモジュールに書く =====
Private Sub Worksheet_Activate()
  Dim myCB As Variant
  
  If Range("A3").CurrentRegion.Rows(2).OutlineLevel <> 1 Then
  '見出し行が3行目を想定 --> 4行目のOutlineLevelを判定
    
    myCB = Application.ClipboardFormats
    If Not myCB(1) Then
      MsgBox "集計をはずすまで、貼り付けできません"
    End If
  
    Call sub_OfficeClipboardClear
  End If
End Sub
'===========================


クリップボードクリアは、検索すると結構出てきます。
一応、よさげなものをパクってきました。

'==== 標準モジュールに =========================
Option Explicit


'Microsoft Office のライブラリに参照設定要(既定で参照済み)
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
    (ByVal hWnd As Long, ByVal dwId As Long, _
    riid As Any, ppvObject As Any) As Long
Const OBJID_CLIENT = &HFFFFFFFC
Private Declare Function IIDFromString Lib "ole32" _
    (lpsz As Any, lpiid As Any) As Long
Const IID_IAccessible = "{618736E0-3C3D-11CF-810C-00AA00389B71}"
Private Declare Function FindWindowEx Lib "user32" _
    Alias "FindWindowExA" _
    (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As Long
'クリップボードクリア
Private Declare Function OpenClipboard Lib "user32" _
    (ByVal hWndNewOwner As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
'

Sub sub_OfficeClipboardClear()
  Dim IID(0 To 3) As Long
  Dim acc As IAccessible
  Dim h As Long
  
  Application.CommandBars("worksheet menu bar").Controls("編集(&E)") _
      .Controls("Office クリップボード(&B)...").Execute
     
  Application.Visible = True
  Application.Wait Now + TimeSerial(0, 0, 0.5)
  
  h = FindWindowEx(Application.hWnd, 0, "EXCEL2", vbNullString)
  h = FindWindowEx(h, 0, "MsoCommandBar", "作業ウィンドウ")
  h = FindWindowEx(h, 0, "MsoWorkPane", vbNullString)
  h = FindWindowEx(h, 0, "bosa_sdm_XL9", vbNullString)
  
  
  ' ウィンドウからIAccessibleを取り出す
  IIDFromString ByVal StrPtr(IID_IAccessible), IID(0)
  If AccessibleObjectFromWindow( _
        h, OBJID_CLIENT, IID(0), acc) < 0 Then
    Exit Sub  ' エラー時
  End If
  
  'すべてクリアボタンの実行。
  acc.accDoDefaultAction 2&
  Set acc = Nothing
  
  'クリップボードクリア
  If OpenClipboard(0) Then
    EmptyClipboard
    CloseClipboard
  End If
  
End Sub
'===========================


欠点として、「貼り付けの際」ではなく、「シートがアクティブになった際」に
処理してます。

よって、クリップボードにデータがあると、貼り付けるつもりがなくても、
強制的にクリアされます。

また、クリップボードクリアの際(シートがアクティブの際)に、
作業ウィンドウが表示されます。
このウィンドウの消し方は分かりませんでした。(分かる方、ヘルプです)


オフィスクリップボードは使わないよ、というのであれば、
Sub内は、最後の5行のみで良いです。
その場合は、作業ウィンドウは表示されません。


とりあえず、今の私のスキルでは、この方法が精一杯です。
一応、参考までに。
1 hits

【45077】集計されたシートについて。 無頼斎 06/12/12(火) 11:34 質問
【45085】Re:集計されたシートについて。 飛ばない豚 06/12/12(火) 14:18 発言
【45329】Re:集計されたシートについて。 無頼斎 06/12/19(火) 16:57 発言
【45353】Re:集計されたシートについて。 飛ばない豚 06/12/20(水) 13:06 発言
【45472】Re:集計されたシートについて。 無頼斎 06/12/25(月) 20:53 お礼
【45607】Re:集計されたシートについて。 通ってみた 07/1/6(土) 13:12 回答
【45610】Re:集計されたシートについて。 飛ばない豚 07/1/6(土) 16:27 発言
【45659】Re:集計されたシートについて。 通ってみた 07/1/9(火) 13:02 発言
【45678】Re:集計されたシートについて。 通ってみた 07/1/10(水) 13:20 発言

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