Excel VBA質問箱 IV

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

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


2677 / 13645 ツリー ←次へ | 前へ→

【66563】検索中の文字列を取得したい toshiki 10/9/10(金) 21:52 質問[未読]
【66564】Re:検索中の文字列を取得したい かみちゃん 10/9/10(金) 21:58 発言[未読]
【66591】Re:検索中の文字列を取得したい toshiki 10/9/13(月) 6:38 発言[未読]
【66595】Re:検索中の文字列を取得したい Abyss 10/9/13(月) 14:08 発言[未読]
【66600】Re:検索中の文字列を取得したい toshiki 10/9/13(月) 16:56 お礼[未読]
【66565】Re:検索中の文字列を取得したい kanabun 10/9/10(金) 23:53 発言[未読]

【66563】検索中の文字列を取得したい
質問  toshiki  - 10/9/10(金) 21:52 -

引用なし
パスワード
    現在、Findメソッドで検索後、FindNextで次検索を行っていますが、このとき、ステータスバーに見つかった文字列を表示しています。といいましょうか、正しくは、検索文字列として設定した文字列を表示しているだけですが…。
 したがって、(Excel“備え付け”の)検索ダイアログで検索後、にFindNextを実行すると当然ながらステータスバーには文字列は表示されません。
 ここからが質問ですが、検索ダイアログを次に表示したときに設定されている(前回入力した)文字列を取得することはできませんでしょうか。

【66564】Re:検索中の文字列を取得したい
発言  かみちゃん  - 10/9/10(金) 21:58 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> 検索ダイアログを次に表示したときに設定されている(前回入力した)文字列を取得する

現在どのようなデータをどのようなコードで処理しているのでしょうか?
提示していただくことはできませんか?

   A   B  C
1
2
3
4
5

【66565】Re:検索中の文字列を取得したい
発言  kanabun  - 10/9/10(金) 23:53 -

引用なし
パスワード
   ▼toshiki さん:

> 検索ダイアログを次に表示したときに設定されている(前回入力した)文字列を取得することはできませんでしょうか。

ht tp://www.moug.net/faq/viewtopic.php?t=53772
より

> 取得することは可能ですが、
> その後の作業に依って無駄になるかも知れません。

【66591】Re:検索中の文字列を取得したい
発言  toshiki  - 10/9/13(月) 6:38 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>> 検索ダイアログを次に表示したときに設定されている(前回入力した)文字列を取得する
>
>現在どのようなデータをどのようなコードで処理しているのでしょうか?
>提示していただくことはできませんか?
>
次のような内容です。
フォームを作成し、その中のコンボボックス(ufSrch.cbxSrchString)の文字列を次のようにFindメソッドで検索しています。
 Range(Cells(1, 1), Cells(Rows.Count, Columns.Count - 1)).Columns.Find(What:=SrchStr _
  , After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows _
  , SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate
 Rows(ActiveCell.Row).EntireRow.Hidden = False
 If (ErrNum = 0) _
  Then
  Application.StatusBar = "↓Find! 行列番号:" & CStr(ActiveCell.Row) & "行" & CStr(ActiveCell.Column) _
             & "列(" & Replace(ActiveCell.Address, "$", "") & ") 「" _
             & ufSrch.cbxSrchString & "」 が見つかりました."



次に、別のボタンをクリックすると次のコード(FindNext)が動きます。
 Range(Cells(1, 1), Cells(Rows.Count, Columns.Count - 1)).Columns.FindNext(After:=ActiveCell).Activate
 Rows(ActiveCell.Row).EntireRow.Hidden = False
 Rows(ActiveCell.Row + 1).EntireRow.Hidden = False
 If (ErrNum = 0) Then
  Application.StatusBar = "↓Find! 行列番号:" & CStr(ActiveCell.Row) & "行" & CStr(ActiveCell.Column) _
             & "列(" & Replace(ActiveCell.Address, "$", "") & ") 「" & ufSrch.cbxSrchString _
             & "」 が見つかりました."



しかし、最初にExcelの検索ダイアログで検索して、FindNextメソッドを動かすと"「」が見つかりました。"と(当然ですが)なります。これを避けたいわけです。

【66595】Re:検索中の文字列を取得したい
発言  Abyss  - 10/9/13(月) 14:08 -

引用なし
パスワード
      ↓
「検索ダイアログに入力されている文字列の取得」の
場合なら、以下のような方法でいいと思います。

(サンプル) * 環境がないので、Excel2007ではテストしていません。

Declare Function FindWindowExA Lib "User32" _
 (ByVal h1 As Long, ByVal h2 As Long, _
  ByVal sz1 As String, ByVal sz2 As String) As Long
 
Declare Function GetWindowTextA Lib "User32" _
 (ByVal Hwnd As Long, _
  ByVal lpString As String, _
  ByVal nMaxCount As Long) As Long
 
Declare Function SendMessageA Lib "User32" _
 (ByVal Hwnd As Long, _
  ByVal uMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
 
Const WM_CLOSE& = 16

Sub Test()

 Dim buf As String
 Dim hDlg&, h&, i&
 Const n$ = vbNullString
 
 buf = String$(30, vbNullChar)
 
 CommandBars.FindControl(, 1849).Execute
 hDlg = FindWindowExA(0, 0, n, "検索と置換")
 h = FindWindowExA(hDlg, 0, n, n)
 i = GetWindowTextA(h, buf, 30)
 SendMessageA hDlg, WM_CLOSE, 0, 0
 MsgBox Left$(buf, i)
 
End Sub

【66600】Re:検索中の文字列を取得したい
お礼  toshiki  - 10/9/13(月) 16:56 -

引用なし
パスワード
   ありがとうございました。
(移植性を考えて)Executeメソッド実行後、GetActiveWindowを使うことにしました。
(その瞬間が検索ダイアログの表示直後という保証はないんでしょうけど…)。
いずれにせよ、一瞬ダイアログは表示されますが、しかたないですね。

 CommandBars.FindControl(, 1849).Execute
 hWnd = GetActiveWindow()
 h = FindWindowExA(hWnd, 0, n, n)
 i = GetWindowTextA(h, buf, 30)
 SendMessageA hWnd, WM_CLOSE, 0, 0
 SChr = Left(buf, InStr(buf, Chr(0)) - 1)

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