Excel VBA質問箱 IV

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

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


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

【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 発言[未読]

【45077】集計されたシートについて。
質問  無頼斎  - 06/12/12(火) 11:34 -

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

無頼斎です。また、よろしくお願いします。

データタブの集計により、集計されたシートに誤って

別シートからコピーされないようにするためには、

どのようなマクロを入れたら良いでしょうか?

下は、コピーのマクロです。

よろしく、ご教示下さい。

Sub コードコピー3()
'
' コードコピー3 Macro
' マクロ記録日 : 2006/4/28 ユーザー名 : 無頼斎
'

'
  Range("G2:M2291").Select
  Selection.Copy
  Sheets(Array("code(3)", "受験級(3)", "総金額(3)")).Select
  Sheets("受験級(3)").Activate
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Sheets(Array("code(3)", "受験級(3)", "総金額(3)")).Select
  Sheets("総金額(3)").Activate
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Sheets(Array("code(3)", "受験級(3)", "総金額(3)")).Select
  Sheets("code(3)").Activate
  Application.CutCopyMode = False
  Range("A2").Select
  Sheets("code(3)").Select
  Range("A2").Select
End Sub

【45085】Re:集計されたシートについて。
発言  飛ばない豚  - 06/12/12(火) 14:18 -

引用なし
パスワード
   ▼無頼斎 さん:

今ひとつ、やりたい事が理解しきれてませんが、

>別シートからコピーされないようにするためには、
>どのようなマクロを入れたら良いでしょうか?

「シートの保護」ではダメなのでしょうか。

【45329】Re:集計されたシートについて。
発言  無頼斎  - 06/12/19(火) 16:57 -

引用なし
パスワード
   飛ばない豚さん、ご返信ありがとうございました。

遅れてすいません(TдT)。

当該シートは、別シートへコピーしたり、されたりする必要があるので、

シート保護をしてしまうと、都合が悪く作業の度に、シート保護・解除を

繰り返さなければなりません。

それを避けるべく、当該シートが集計されている場合は、"集計されています"や

"集計を解除してから、貼り付けて下さい"などのメッセージボックスを、

貼り付ける作業の前に入れたいのです。できますでしょうか?


▼飛ばない豚 さん:
>▼無頼斎 さん:
>
>今ひとつ、やりたい事が理解しきれてませんが、
>
>>別シートからコピーされないようにするためには、
>>どのようなマクロを入れたら良いでしょうか?
>
>「シートの保護」ではダメなのでしょうか。

【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行のみで良いです。
その場合は、作業ウィンドウは表示されません。


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

【45472】Re:集計されたシートについて。
お礼  無頼斎  - 06/12/25(月) 20:53 -

引用なし
パスワード
   ありがとうございました。

大変ご苦労おかけいたしました。

なんとか、やってみます。

【45607】Re:集計されたシートについて。
回答  通ってみた  - 07/1/6(土) 13:12 -

引用なし
パスワード
   飛ばない豚さん

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

ではなくて、モーグからの一言を添えて欲しいのですが。

元スレのGoogleのキャッシュ
www.google.co.jp/search?q=cache:www2.moug.net/bbs/exvba/20061015000010.htm

>   Application.Visible = True
>   Application.Wait Now + TimeSerial(0, 0, 1)

は、 目視確認のために入れただけで不要です。

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

該当するウィンドウにWM_CLOSEメッセージを送信すれば
いいようです。

IAccessibleについては、
Active Accessibility 2.0 SDK Tools
でGoogle検索すると出てくる「AccExplorer32.exe」とか、
オブジェクト ブラウザで、
右クリックから「非表示のメンバを表示」で確認できると思います。

ちなみにVB6では
「C:\WINDOWS\system32\oleacc.dll」への参照設定が必要になります。

たまたま、検索でヒットしたのでレスをしましたが、
こちらのサイトを拝見することは、ほとんどありません。

------------------------
'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
Const WM_CLOSE = &H10
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" _
    (ByVal hWnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long

Sub test()

  Dim IID(0 To 3) As Long
  Dim acc As IAccessible
  Dim h As Long, hWnd As Long
  
  Application.CommandBars("worksheet menu bar").Controls("編集(&E)") _
      .Controls("Office クリップボード(&B)...").Execute

  h = FindWindowEx(Application.hWnd, 0, "EXCEL2", vbNullString)
  hWnd = FindWindowEx(h, 0, "MsoCommandBar", "作業ウィンドウ")
  h = FindWindowEx(hWnd, 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
  
  ' 作業ウィンドウ(MsoCommandBar)を閉じる。
  PostMessage hWnd, WM_CLOSE, 0, 0

End Sub

【45610】Re:集計されたシートについて。
発言  飛ばない豚  - 07/1/6(土) 16:27 -

引用なし
パスワード
   ▼通ってみた さん:

失礼しました。
おっしゃるとおり、コードは 通ってみたさん のものを頂戴しております。
(一応、ちょっとだけ別のコードを追加しておりますが)
勝手に使用した事により不快に思われたのであれば、お詫びします。


リンクで済ませようかと悩んだのですが、どこかのサイト(確かモーグだったかと思います)
にて、他の掲示板へのリンクは、マルチポストを誘発するので良くない、というのを
見かけ、また、ここもリンクできないようにされているので、同じような理由だろうと
考え、リンクを貼らず、頂戴したコードを載せる事にしました。

キーワードと共に「検索して」にしようかとも思いましたが、分かりづらそうだったので、
それもやめました。

ダラダラ言い訳してしまいましたが、以後気をつけます。


> たまたま、検索でヒットしたのでレスをしましたが、
> こちらのサイトを拝見することは、ほとんどありません。
ということなので、もうご覧にならないかもしれませんが、
申し訳ありませんでした。

【45659】Re:集計されたシートについて。
発言  通ってみた  - 07/1/9(火) 13:02 -

引用なし
パスワード
   ▼飛ばない豚 さん:
 
ご返信頂きまして、ありがとうございます。 

> > また、クリップボードクリアの際(シートがアクティブの際)に、
> > 作業ウィンドウが表示されます。
> > このウィンドウの消し方は分かりませんでした。(分かる方、ヘルプです)
>
> 該当するウィンドウにWM_CLOSEメッセージを送信すれば
> いいようです。

>   ' 作業ウィンドウ(MsoCommandBar)を閉じる。
>   PostMessage hWnd, WM_CLOSE, 0, 0

        ↓
        
>   Application.CommandBars("Task Pane").Visible = False

に変更してください。(めっちゃ、恥ずかしいです)

Office クリップボード(作業ウィンドウ)を非表示にしたい
www2.moug.net/bbs/exvba/20070107000010.htm
より

後、井川さんが指摘されている
> あと、提示されているURLで書かれているコードでは、
> 作業ウィンドウがフローティング表示されている場合や
> ウィンドウ上部に固定されている場合のことは
> 考慮していないようですので、そのような場合には
> クリアできないと思います。
> 必要ならば、それらの状況も考慮したコードにされた方が
> よろしいかと思います。
については、
面倒そうなので、修正は勘弁してください。

【45678】Re:集計されたシートについて。
発言  通ってみた  - 07/1/10(水) 13:20 -

引用なし
パスワード
   > 後、井川さんが指摘されている
> > あと、提示されているURLで書かれているコードでは、
> > 作業ウィンドウがフローティング表示されている場合や
> > ウィンドウ上部に固定されている場合のことは
> > 考慮していないようですので、そのような場合には
> > クリアできないと思います。
> > 必要ならば、それらの状況も考慮したコードにされた方が
> > よろしいかと思います。
> については、
> 面倒そうなので、修正は勘弁してください。

プロの方達から、回答を頂けましたので
URL(になってませんが)を載せておきます。

最終的には、APIも要らず、
随分スッキリとした形になりました。(スゴイです)

Re: Office クリップボード(作業ウィンドウ)を非表示にしたい
www2.moug.net/bbs/exvba/20070109000028.htm

では、失礼致します。

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