続続編☆エクセルのオブジェクト内の文字列検索についてです。



◇-続続編☆エクセルのオブジェクト内の文字列検索についてです。 -がみかみ(6/9-21:55)No.4328
 ┗Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 -o2ka(6/10-00:32)No.4340
  ┗Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 -がみかみ(6/10-09:29)No.4352
   ┗Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 -がみかみ(6/10-16:04)No.4367
    ┗Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 -がみかみ(6/10-19:53)No.4378
     ┗おかしいですね・・・-o2ka(6/10-21:48)No.4391
      ┗Re:おかしいですね・・・-がみかみ(6/11-00:39)No.4406
       ┗Re:おかしいですね・・・-がみかみ(6/11-00:48)No.4408
        ┣Re:おかしいですね・・・-o2ka(6/11-01:18)No.4409
        ┃┗Re:おかしいですね・・・-o2ka(6/11-01:33)No.4412
        ┗Re:おかしいですね・・・-kei100(6/11-01:19)No.4411
         ┗なんとか-がみかみ(6/11-10:55)No.4418
          ┣Re:なんとか-がみかみ(6/11-13:17)No.4421
          ┗Re:なんとか-o2ka(6/11-21:05)No.4446
           ┗Re:なんとか-がみかみ(6/12-00:12)No.4456
            ┗Re:なんとか-o2ka(6/12-00:51)No.4461
             ┗ありがとうございました。-がみかみ(6/12-10:01)No.4474

▲このページのトップに戻る
4328続続編☆エクセルのオブジェクト内の文字列検索についてです。 がみかみ 6/9-21:55

メーカー名:関連性なし
OS名:Windows98
パソコン名:不明
ソフト名:
--
http://pasokoma.jp/bbs3/pslg3701.html
http://pasokoma.jp/bbs3/pslg4069.htmlの過去ログを指しています。
(まちゅ@管理人補足H18.10.27)
----------
お疲れ様です。
以前の質問が過去ログ落ちしたようなので、
もう一度質問させて頂きます。
EXCEL2000です。
毎度で申し訳ないんですが、お願いします。
(記事番号 3701、4069)

エクセルではセル内の普通の文字列に関しては検索可能でありますが、
オブジェクト(例えばテキストボックス)内の
文字列検索はできるのでしょうか?
自分でもヘルプ等で確認しましたが、
いまいちできるのかどうか、定かでありません。
プラグインなどのソフト等使えば検索可能になったりするのかどうか、
ご存知の方教えてください。お願いします。
そして、マクロを使うことにしました。
以下のソースは自分が調べたものをo2kaさんが作り直してくれたものです。
お世話になってます。

これだと、検索するオブジェクトに色がついていると、
ヒット後に検索後の色が消えてしまうのです。
なんとか色づけをせずに、検索をかける手段教えてくれないでしょうか?

Sub Test3()
 Dim shp As Object
 Dim s As String
 Dim i As Integer
 Dim ss As String

 i = 0

 On Error Resume Next
 s = InputBox("検索する文字列を入力して下さい")
 If s = "" Then Exit Sub

  For Each shp In ActiveSheet.DrawingObjects

   If InStr(1, shp.Text, s, 1) Then
    If Error <> "" Then
     On Error GoTo 0
     On Error Resume Next
     GoTo RAST
    End If
    shp.Select
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 13
    ActiveWindow.SmallScroll Down:=0
ss = InputBox("「" & shp.Text & "」が " & shp.Name & " の中に見つかりま
した。 変更するテキストを入れてください。", shp.Name, shp.Text)
    If ss <> "" Then
     Selection.Text = ss
    End If
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9
    If MsgBox("次を検索しますか?", vbYesNo) = vbNo Then Exit Sub
    i = i + 1
   End If

RAST:

  Next shp

  ActiveWindow.SmallScroll Down:=0
  If (i = 0) Then
   MsgBox "「" & s & "」は見つかりませんでした。"
  Else
   MsgBox i & "個の「" & s & "」が見つかりました。"
  End If
End Sub

▲このページのトップに戻る
4340Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 o2ka 6/10-00:32
記事番号4328へのコメント
>これだと、検索するオブジェクトに色がついていると、
>ヒット後に検索後の色が消えてしまうのです。
>なんとか色づけをせずに、検索をかける手段教えてくれないでしょうか?

他の手段を使用して、選択中のオブジェクトを示すようにすれば、いかがでしょうか?
例えば 線の太さを変えるとか、フォントを変えるとか・・・。
 ↑「マクロの自動保存」を実行しながら実際にフォント等を変更してみれば、
  「どのような書き方をすれば、どこがどうなる」というサンプルを取得する
  事ができます

その方法でも都合が悪い場合、「現在のオブジェクトの色」を取得、セーブしておき
従来通り「黄色で表示(元から黄色の場合は、どれが選択されているかわからないけど)」、
if文を抜けるときに「白(Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9)」
ではなく、「セーブしておいた色」を当てはめるようにすれば良いでしょう。

って、文章で書いてわかるかな?


ところで、「○○ が ○○ の中に見つかりました。変更するテキストを入れてください」の
inputboxを「キャンセル」すると テキストがクリアされる事に気が付きましたか?
「ここでキャンセルされたときに、値を残したままLoopを抜けた方が良いのかな〜?」
と気にしつつ そのままの仕様でUPLOADしてしまったんですが・・・。
 ↑ここの仕様を変更したい場合、前回紹介したサイトが参考になるでしょう。
  ただ、「If ss <> "" Then」により ブランク指定ができなくなっているので
  このif文を残している限りは 今の仕様の方が良いのかな、とも思っています

▲このページのトップに戻る
4352Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 がみかみ 6/10-09:29
記事番号4340へのコメント
o2kaさんは No.4340「Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 」で書きま
した。
>>これだと、検索するオブジェクトに色がついていると、
>>ヒット後に検索後の色が消えてしまうのです。
>>なんとか色づけをせずに、検索をかける手段教えてくれないでしょうか?
>
>他の手段を使用して、選択中のオブジェクトを示すようにすれば、いかがでしょうか?
>例えば 線の太さを変えるとか、フォントを変えるとか・・・。
> ↑「マクロの自動保存」を実行しながら実際にフォント等を変更してみれば、
>  「どのような書き方をすれば、どこがどうなる」というサンプルを取得する
>  事ができます
>
>その方法でも都合が悪い場合、「現在のオブジェクトの色」を取得、セーブしておき
>従来通り「黄色で表示(元から黄色の場合は、どれが選択されているかわからないけど)」、
>if文を抜けるときに「白(Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9)」
>ではなく、「セーブしておいた色」を当てはめるようにすれば良いでしょう。
>
>って、文章で書いてわかるかな?
>
>
>ところで、「○○ が ○○ の中に見つかりました。変更するテキストを入れてください」の
>inputboxを「キャンセル」すると テキストがクリアされる事に気が付きましたか?
>「ここでキャンセルされたときに、値を残したままLoopを抜けた方が良いのかな〜?」
>と気にしつつ そのままの仕様でUPLOADしてしまったんですが・・・。
> ↑ここの仕様を変更したい場合、前回紹介したサイトが参考になるでしょう。
>  ただ、「If ss <> "" Then」により ブランク指定ができなくなっているので
>  このif文を残している限りは 今の仕様の方が良いのかな、とも思っています

o2kaさん毎度ありがとうございます。
少し自分なりにやってみて理解不能になったらまた質問したいと
思います。
現段階で解らないことはセーブしといた色とは、
そのオブジェクト固有の色のことをおっしゃっているのでは
ないですよね。例えば、オブジェクトが何種類かあって
それごとに色が違っていた場合、セーブしといた色とはどうやって
取得するんでしょうか?
お願いします。

▲このページのトップに戻る
4367Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 がみかみ 6/10-16:04
記事番号4352へのコメント
がみかみさんは No.4352「Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 」で書きました。
>o2kaさんは No.4340「Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 」で書きま
>した。
>>>これだと、検索するオブジェクトに色がついていると、
>>>ヒット後に検索後の色が消えてしまうのです。
>>>なんとか色づけをせずに、検索をかける手段教えてくれないでしょうか?
>>
>>他の手段を使用して、選択中のオブジェクトを示すようにすれば、いかがでしょうか?
>>例えば 線の太さを変えるとか、フォントを変えるとか・・・。
>> ↑「マクロの自動保存」を実行しながら実際にフォント等を変更してみれば、
>>  「どのような書き方をすれば、どこがどうなる」というサンプルを取得する
>>  事ができます
>>
>>その方法でも都合が悪い場合、「現在のオブジェクトの色」を取得、セーブしておき
>>従来通り「黄色で表示(元から黄色の場合は、どれが選択されているかわからないけど)」、
>>if文を抜けるときに「白(Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9)」
>>ではなく、「セーブしておいた色」を当てはめるようにすれば良いでしょう。
>>
>>って、文章で書いてわかるかな?
>>
>>
>>ところで、「○○ が ○○ の中に見つかりました。変更するテキストを入れてください」の
>>inputboxを「キャンセル」すると テキストがクリアされる事に気が付きましたか?
>>「ここでキャンセルされたときに、値を残したままLoopを抜けた方が良いのかな〜?」
>>と気にしつつ そのままの仕様でUPLOADしてしまったんですが・・・。
>> ↑ここの仕様を変更したい場合、前回紹介したサイトが参考になるでしょう。
>>  ただ、「If ss <> "" Then」により ブランク指定ができなくなっているので
>>  このif文を残している限りは 今の仕様の方が良いのかな、とも思っています
>
>o2kaさん毎度ありがとうございます。
>少し自分なりにやってみて理解不能になったらまた質問したいと
>思います。
>現段階で解らないことはセーブしといた色とは、
>そのオブジェクト固有の色のことをおっしゃっているのでは
>ないですよね。例えば、オブジェクトが何種類かあって
>それごとに色が違っていた場合、セーブしといた色とはどうやって
>取得するんでしょうか?
>お願いします。
>

考えて調べて6時間ほど考えましたが、
一向に前進しません。
お助け下さい。

▲このページのトップに戻る
4378Re:続続編☆エクセルのオブジェクト内の文字列検索についてです。 がみかみ 6/10-19:53
記事番号4367へのコメント
やっと、自分で改造してみましたが、
下記だと、もともと色付きのオブジェクトは問題ないんですが、
今度は以前の色がついていないオブジェクトの場合に、
ヒットした部分を黄色く示してくれなくなってしまいました。
バージョンダウンです。

Sub 図形_最新()
Dim shp As Object
Dim s As String
Dim i As Integer
Dim ss As String

i = 0
On Error Resume Next
s = InputBox("検索する文字列を入力して下さい")
If s = "" Then Exit Sub

For Each shp In ActiveSheet.DrawingObjects

If InStr(1, shp.Text, s, 1) Then
If Error <> "" Then
On Error GoTo 0
On Error Resume Next
GoTo RAST
End If
shp.Select

xx = shp.ShapeRange.Fill.ForeColor.SchemeColor
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 13
ActiveWindow.SmallScroll Down:=0
ss = InputBox("「" & shp.Text & "」が " & shp.Name & " の中に見つかりました。 変更するテキストを入
れてください。 ", shp.Name, shp.Text)

If ss <> "" Then
Selection.Text = ss
End If
Selection.ShapeRange.Fill.ForeColor.SchemeColor = xx
If MsgBox("次を検索しますか?", vbYesNo) = vbNo Then Exit Sub
i = i + 1
End If

RAST:

Next shp

ActiveWindow.SmallScroll Down:=0
If (i = 0) Then
MsgBox "「" & s & "」は見つかりませんでした。"
Else
MsgBox i & "個の「" & s & "」が見つかりました。"
End If
End Sub



▲このページのトップに戻る
4391おかしいですね・・・o2ka 6/10-21:48
記事番号4378へのコメント
>今度は以前の色がついていないオブジェクトの場合に、
>ヒットした部分を黄色く示してくれなくなってしまいました。

こちらでは、きちんと色が付きますが・・・。

ところで、変数の宣言部に
 Dim xx As Integer
を追加した方が、丁寧ですね。
無くても大丈夫なはずだけど・・・、もしかしたらこの宣言が無い事から「xx」の扱いが
おかしくなっているのかも??

▲このページのトップに戻る
4406Re:おかしいですね・・・がみかみ 6/11-00:39
記事番号4391へのコメント
o2kaさんは No.4391「おかしいですね・・・」で書きました。
>>今度は以前の色がついていないオブジェクトの場合に、
>>ヒットした部分を黄色く示してくれなくなってしまいました。
>
>こちらでは、きちんと色が付きますが・・・。
>
>ところで、変数の宣言部に
> Dim xx As Integer
>を追加した方が、丁寧ですね。
>無くても大丈夫なはずだけど・・・、もしかしたらこの宣言が無い事から「xx」の扱いが
>おかしくなっているのかも??

宣言したら色つきのオブジェクトのほうもおかしくなります。
会社でやったらそんな感じだったんですけど。
なにがなにやら。

▲このページのトップに戻る
4408Re:おかしいですね・・・がみかみ 6/11-00:48
記事番号4406へのコメント
がみかみさんは No.4406「Re:おかしいですね・・・」で書きました。
>>ところで、変数の宣言部に
>> Dim xx As Integer
>>を追加した方が、丁寧ですね。
>>無くても大丈夫なはずだけど・・・、

私も感じた所なんですが、なんでこの場合は宣言しなくても、
コンパイル通るんでしょうか??

▲このページのトップに戻る
4409Re:おかしいですね・・・o2ka 6/11-01:18
記事番号4408へのコメント
>>>ところで、変数の宣言部に
>>> Dim xx As Integer
>>>を追加した方が、丁寧ですね。
>>>無くても大丈夫なはずだけど・・・、
>
>私も感じた所なんですが、なんでこの場合は宣言しなくても、
>コンパイル通るんでしょうか??

VBAは、BASIC系の言語だからです。
BASICでは型宣言がされていない場合、その後の記述を元に自動的に型を割り当てま
す。


ところで、良く見たら代入文がこちらで試験的に作成したのと微妙に違う
し・・・。

追加した
 xx = shp.ShapeRange.Fill.ForeColor.SchemeColor

 xx = Selection.ShapeRange.Fill.ForeColor.SchemeColor
に変更してみてください。

「Selection.ShapeRange」は、「今現在選択しているShapeRange」
を指します。
「shp.Select」の後ろで処理しているのですから、「Selection.ShapeRange」
の方が確実かと思います。

▲このページのトップに戻る
4412Re:おかしいですね・・・o2ka 6/11-01:33
記事番号4409へのコメント
>「Selection.ShapeRange」は、「今現在選択しているShapeRange」
>を指します。
>「shp.Select」の後ろで処理しているのですから、「Selection.ShapeRange」
>の方が確実かと思います。

でも、がみかみさんのソースでもこちらでは正常に動くんですよ・・・。
officeのバージョンによって、ShapeRange.Fill.ForeColor.SchemeColorの型が
違うのかな?

こちらでは、Excel97(パッチ当て無し)を使用してテストしています。
 ↑今、ExcelXPをインストールし直すとアクティベし直さないとならないので、
  面倒で(そのうちWinを入れ直す都合上)入れられない・・・

▲このページのトップに戻る
4411Re:おかしいですね・・・kei100 URL6/11-01:19
記事番号4408へのコメント
がみかみさんは No.4408「Re:おかしいですね・・・」で書きました。

>私も感じた所なんですが、なんでこの場合は宣言しなくても、
>コンパイル通るんでしょうか??

BASICだからです・・・

って失礼。
# 実際、BASICも変数を宣言しないで動くでしょ?

VBの場合は、一番上の先頭に
Option Explicit
を書かないと、未知の変数はVariant型として宣言されたことになります。
# よって、普通は、バグ防止の為上記の行を自動的に挿入するように設定します。
## ただし、VBAは上記のが使えるか知りません。(汗)
あと、Dimで as 〜〜 を書かなかった場合でも、Variant型になります。

また、VBは(歴史的に?)、変数は最初から0またはNULLに初期化されます。
# だから、C言語みたく初期化する必要性が低い・・・
# 逆に、最初にflag立てておきたいときは面倒なんだけど(涙)
## あ、.NETからは、改良されたらしいです。

まぁ、C言語と比べて適当でも動くのがミソですが、
それが逆に仇になる場合もしばしば・・・

あ、C言語とのその他の違いとして、変数名の大文字と小文字は、
区別されませんのでご注意を。

あと、Variant型を毛嫌いする方も多いですが、
「何が入ってくるかわからない」場合には有効かと。
そんなに速度も求められないでしょうし・・・
# まさか数万もの中から検索するわけではあるまい。

以上参考までに。
# 参考にならんかも。

▲このページのトップに戻る
4418なんとかがみかみ 6/11-10:55
記事番号4411へのコメント
o2kaさん、kei100さんありがとうございました。
下記でなんとかなりました。
ところで、o2kaさんは「お疲れ」と名前を掛けているのですか?

Sub 図形_最新()
Dim shp As Object
Dim s As String
Dim i As Integer
Dim ss As String
Dim xx As Integer

i = 0
On Error Resume Next
s = InputBox("検索する文字列を入力して下さい")
If s = "" Then Exit Sub

For Each shp In ActiveSheet.DrawingObjects

If InStr(1, shp.Text, s, 1) Then
If Error <> "" Then
On Error GoTo 0
On Error Resume Next
GoTo RAST
End If
shp.Select

With Selection.ShapeRange.Fill
xx = .ForeColor.SchemeColor
.ForeColor.SchemeColor = 13
tf = .Visible '初期値
.Visible = msoTrue
End With
ActiveWindow.SmallScroll Down:=0
ss = InputBox("「" & shp.Text & "」が " & shp.Name & " の中に見つかり
ました。 変更するテキストを入れてください。 ", shp.Name, shp.Text)

If ss <> "" Then
Selection.Text = ss
End If
'元の状態に戻す
With Selection.ShapeRange.Fill
.ForeColor.SchemeColor = xx
.Visible = tf
End With

If MsgBox("次を検索しますか?", vbYesNo) = vbNo Then Exit Sub
i = i + 1
End If

RAST:

Next shp

ActiveWindow.SmallScroll Down:=0
If (i = 0) Then
MsgBox "「" & s & "」は見つかりませんでした。"
Else
MsgBox i & "個の「" & s & "」が見つかりました。"
End If

End Sub

▲このページのトップに戻る
4421Re:なんとかがみかみ 6/11-13:17
記事番号4418へのコメント
と思ったのですが、本番のエクセルシートにグループ化された
オブジェクトがあって、それに対応できません。
検索ヒット後、黄色に色付けして抜けたときに元の色に戻してくれず、
検索ヒットごとに黄色が増えてしまって、
検索終了後は、オブジェクトが真っ黒になってしまいました。
わからないなりにデバックしたのですが撃沈しました。
バグが出てしまいました。対応策はありますでしょうか?
自分もネットで調べてきます。

▲このページのトップに戻る
4446Re:なんとかo2ka 6/11-21:05
記事番号4418へのコメント
>ところで、o2kaさんは「お疲れ」と名前を掛けているのですか?

違いますよ。
本名の書き方を変えただけです。
 ↑出先でも言われる。「なんなの? この"オーツー・・・あぁ!!"」って(笑)

>と思ったのですが、本番のエクセルシートにグループ化された
>オブジェクトがあって、それに対応できません。

困ったな〜・・・。

1) セーブ(後述)用のシートを作成
2) 最初にグループ化されているオブジェクトを探して解除(グループ名も取得しておく)
3) 解除された場合、選択状態になっているオブジェクト名を取得(元に戻すときに使用する)
4) 取得したオブジェクト名/グループ名をセーブ用のシートに書き込んでおく
5) すべてのオブジェクトの共有解除が出来たら、既存の「図形_最新」を呼び出す
6) 「図形_最新」の処理が終わったら、セーブ用のシートに記述された内容を元に
  共有の復元を行う

こんな感じになるんだろうけど、これを作成できるようなら VBAのエキスパートだな(笑)。
試しに作ってみようにも、知らない命令だらけだ・・・。

▲このページのトップに戻る
4456Re:なんとかがみかみ 6/12-00:12
記事番号4446へのコメント
そうですかぁ。僕には無理ですね...。なんか別の方法考えられますかね?
すいません、頼ってしまって、ごめんなさい。

▲このページのトップに戻る
4461Re:なんとかo2ka 6/12-00:51
記事番号4456へのコメント
がみかみさんは No.4456「Re:なんとか」で書きました。
>そうですかぁ。僕には無理ですね...。なんか別の方法考えられますかね?

これ以外の方法は考えられないですね・・・。
グループ化されたままだと、テキストの変更もうまくできませんし・・・。

この方法を実現できるようなサンプルの書かれた本なりサイトなりを探すしか
自動で処理を行えるようにする方法は無いでしょう。

ぼくは、ここで give upです。
VBAに詳しい人が身近に居れば、「こんな感じの流れで」って見せれば
スラスラ書けちゃうんでしょうけど・・・。
 ↑さっき書いたヤツ、どこからどこまでループって明確に書いていないので
  ここまでの流れを知らない人がアレを参考にしてコーディングすると
  多分 バグるけど(苦笑)

▲このページのトップに戻る
4474ありがとうございました。がみかみ 6/12-10:01
記事番号4461へのコメント
ご丁寧に感謝しております。
ありがとうございました。
ただ今、本と、サイトで格闘中です。

A1.本ページは参考になりましたか? 又はアドバイスがありますか?
解決 参考になった 参考にならなかった アドバイスする

A2.何度目の訪問ですか?
初めて来た   数度目(2〜4) 5回以上来ている   管理人:

A3.何か一言どうぞ(アドレスは書くことができません)

A4.アドレスがあればどうぞ(1つまで)


↑↑↑↑よろしければ押してください↑↑↑↑

何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり

参考回数投稿日時何か一言