プロが教える店舗&オフィスのセキュリティ対策術

Private Sub MyFind(ByVal src As String, ByRef rng As Range)
Dim r As Range
Set rng = Nothing
For Each r In Range("F5:AJ5")
If r.Text = src Then
Set rng = r
Exit Sub
End If
Next
End Sub
このマクロの意味を、教えてください?

質問者からの補足コメント

  • Tatsu99様
    ありがとうございます
    この度の質問方法で、お気を悪くさせまして、大変申し訳ありません
    大変恐縮ではありますが、再度質問させてもらいました

    前回の回答内容では、実際、マクロが実行できないため、どこが原因か、マクロ内容を理解したく再度の質問となりました

      補足日時:2018/09/27 02:21
  • Tatsu99様
    夜分に、大変恐縮します

    マクロは、矢印を引くコードの所で止まっているようです
    デバックは以下のコードの所に印があります


    With ActiveSheet.Shapes.AddLine(org.Left + 0, _
    c.Top + 7, dst.Left + 0, c.Top + 7).Line
    .EndArrowheadStyle = msoArrowheadTriangle
    .ForeColor.RGB = RGB(0, 0, 128)
    .Weight = 3
    End With

      補足日時:2018/09/27 02:39
  • Tatsu99様
    夜分に、大変恐縮します

    マクロは、矢印を引くコードの所で止まっているようです
    デバックは以下のコードの所に印があります


    With ActiveSheet.Shapes.AddLine(org.Left + 0, _
    c.Top + 7, dst.Left + 0, c.Top + 7).Line
    .EndArrowheadStyle = msoArrowheadTriangle
    .ForeColor.RGB = RGB(0, 0, 128)
    .Weight = 3
    End With

      補足日時:2018/09/27 02:39
  • Tatsu99様
    返信遅くなり、申し訳ありません
    寝落ちてました

    以下を提示します
    1.①のc.Valueの内容 : 2018/09/25 06:00
    2.その横のE列の内容(終了時間) : 2018/09/26 17:45
    3.②のorgの値 ; nothing
    4.③のdstの値 : nothing

      補足日時:2018/09/27 07:38
  • Tatsu99様

    orgとdstの所にマウスをあてると、nothingになります
    c.textの所では、2018/09/25 6:00
    c.offset(0, 1)の所では、2018/09/26 17:45
    になります

      補足日時:2018/09/27 07:58
  • Tatsu99様

    すみません、又、補足します

    With ActiveSheet.Shapes.AddLine(org.Left + 0, _
    c.Top + 7, dst.Left + 0, c.Top + 7).Line

    上記のorg.Leftの所では、(オブジェクト変数またはwith ブロックが設定されていません)と表示されます

      補足日時:2018/09/27 08:03
  • Tatsu99様
    実は、ガンチャート表の範囲を大きくしたため現在のマクロは、以下となります
    申し遅れました、失礼しました

    https://ideone.com/wF8Bej

    内容的には、送信しましたマクロと変わりなく、
    矢印を選択的に色を変えるマクロを追加しております

    時刻の欄では、最初、o列の開始時刻を入力すると、p列の終了時刻は計算式で設定しています
    そして、o列の日付が変わった欄(行下)も計算式で設定されており、連続で日時が変わる設定となっております

    入力した日時は、正常に表示されています

      補足日時:2018/09/27 09:48

A 回答 (9件)

少しややこしい内容のサブルーチンのようです。


人の好き好きたらか、書き方は、なんとも言いようがありませんが、
F5:AJ5 の間で、文字列src  と一致しているセルがあれば、そのセルを格納せよ、という意味です。
ちなみに、ByValは、値渡し、ByRef は、参照渡し。参照渡しで、セルのオブジェクトを確保しています。

Private Sub MyFind(ByVal src As String, ByRef rng As Range)
Dim r As Range
Set rng = Nothing
For Each r In Range("F5:AJ5")
 If r.Text = src Then
  Set rng = r
  Exit Sub
 End If
Next
End Sub

例えば、実行ファイルでは、見つけたら、その文字列の先頭に、「!」をつけるようにメインコードを作ってみました。

Sub Test1()
Dim rng As Range
Dim src As String
src = "abc"
MyFind src, rng
rng.Value = "!" & rng.Value
End Sub
    • good
    • 0
この回答へのお礼

WindFaller様
ありがとうごさいました
そして、大変失礼し、大変申し訳ありません
先日、質問した回答者様とコンタクトを取りたくて、再度、質問をしてしまいました

懇切丁寧なご回答で、質問内容は理解できました

お礼日時:2018/09/27 02:07

前回の回答者です。

(Private Sub MyFindの作者です)
前回の質問は、下記URLです。
https://oshiete.goo.ne.jp/qa/10741686.html
(質問者へお願いです。今後このような質問をするときは、前回のURLも提示するようにするようにしてください。そうすると他の回答者も
前後関係が判るので回答しやすくなります)

本来のソースの問題の箇所は、
Set org = Range("F5:AJ5").Find( _
What:=c.Value, LookAt:=xlWhole)
Set dst = Range("F5:AJ5").Find( _
What:=c.Offset(0, 1).Value, LookAt:=xlWhole)
となっています。
要はここで何をしているかというと、
①c.valueにマッチするセルをF5:AJ5の範囲で検索し、そのセル位置をorgにセットする。
②cの右隣のvalueにマッチするセルをF5:AJ5の範囲で検索し、そのセル位置をdstにセットする。
ということをやっています。
これと同じことをMyFindで行っています。
但しc.valueで検索するのではなく、c.textで検索するのが重要な点です。
c.valueとc.textの違いは、c.valueが内部データを示すのに対し、c.textは表示されているままのデータを示します。
今回は、2018/9/1 6:00のようなデータが設定されますが、c.valueは43344.25の数値です。c.textは"2018/9/1 6:00"の文字列です。
c.valueで検索すると00:00:00のデータで検索が失敗します。その為、c.textで検索するようにしています。
何故、00:00:00の場合のみ失敗するのは判りません。(調査していません)
その為、わざわざ、失敗する方法をとるよりは、確実に成功する方法をとったのが、MyFindによる検索になります。
MyFindの呼び出しは、
Call MyFind(c.Text, org)
Call MyFind(c.Offset(0, 1).Text, dst)
で行っています。
①c.Textを指定して、マッチするするセルを検索し、そのセル位置をorgにセットする。
②cの右隣のTextにマッチするセルを検索し、そのセル位置をdstにセットする。
ということを行います。
検索範囲は、F5:AJ5であることが、今回決まり切っているので、MyFindの中でその範囲を検索するようにしています。
(パラメータで与えても構いませんが、今回はMyFindの内部で範囲を決め打ちしています。
このMyFind自体が汎用的なプロシージャではないので、これで必要十分かと)

このプロシージャの機能の説明は、No1のかたが説明されているので、まさにその通りとしか言いようがありません。
Private Sub MyFind(ByVal src As String, ByRef rng As Range)
srcがc.Textで渡された文字列になります。入力のみなので、ByValと記述します。
rngが検索して見つかったセルになります。これは、そのセルを返すので、ByRefと記述します。
見つからなければ、nothhingを返します。
If r.Text = src Then
でsrcと比較しているのはセルのTextであることに注意してください。(If r.Value = src Thenではありません)
不明点があれば補足ください。
    • good
    • 0

>前回の回答内容では、実際、マクロが実行できないため、どこが原因か、マクロ内容を理解したく再度の質問となりました


「実際、マクロが実行できないため」とはどのようなことでしょうか。
前回の質問のように、実行すると、エラーが発生するということでしょうか。
そうであれば、どのようなデータの場合にエラーが発生するのでしょうか。
また、エラー発生時のソースの箇所も同じでしょうか。(デバッグをクリックした時、黄色で表示される行です)
    • good
    • 0

If c.Value <> "" Then・・・・①


Call MyFind(c.Text, org)・・・・②
Call MyFind(c.Offset(0, 1).Text, dst)・・・③

その状態で、
②のorgの箇所、
③のdstの箇所
にマウスをあててください。
どちらかがnothingになります。
nothingになったほうの検索がエラーになっています。
orgがなると、開始時間でエラーです。
dstがなると、終了時間でエラーです。
また、①のc.Valueにマウスを当ててください。
それがD列の開始時間です。
1.①のc.Valueの内容
2.その横のE列の内容(終了時間)
3.②のorgの値
4.③のdstの値
を提示してください。
    • good
    • 0

念のため確認ですが


Sub ガントチャート描画2()
呼び出していますね。
Sub ガントチャート描画()を
呼び出してはいけません。
    • good
    • 1

こちらで確認したところ、正常に引けています。

(添付図参照)
念の為確認です。
①D列の2018/09/25 06:00 はきちんと表示されているか。
②E列の2018/09/26 17:45 はきちんと表示されているか。
③開始時間2018/09/25 06:00はF5:AJ5内にきちんと表示されているか。
④終了時間2018/09/26 17:45は③より右側でかつF5:AJ5内にきちんと表示されているか。
を確認してください。
特にF5:AJ5内の時間が、########のようになっていませんでしょうか。(添付図の赤線で囲んだところ)
私が提示した検索方法は、みたままの状態での検索です。見た目が多少でも違っているとエラーになります。
「Private Sub MyFind(B」の回答画像6
    • good
    • 0

F5:AJ5内の時間が、########のようになっていても、あなたが最初に提示されたマクロでは正常に動作します。


########表示の幅が狭いときに発生します。
もし、どうしても########の表示になってしまう箇所が発生するなら、私が提示したマクロは使えません。
あなたが最初に提示されたマクロを使用したほうが良いでしょう。

但し、その場合、00:00:00の時間が正しく検索できない為、エラーになります。
これを解消する為に、姑息な手段ですが、
2018/9/25/ 00:00:01のように秒のところを00でなく01にします。F5:AJ5内も同様にします。
すると、表示上は2018/9/25/ 00:00なので問題ありません。(添付図の赤線で囲んだところ)
これで、あなたが最初に提示されたマクロを実行すると正常に描画できます。
時刻が00:00:00の場合のみ、00:00:01にして登録する方法も1つの解決方法かと。
「Private Sub MyFind(B」の回答画像7
    • good
    • 0

>実は、ガンチャート表の範囲を大きくしたため現在のマクロは、以下となります


>申し遅れました、失礼しました
>https://ideone.com/wF8Bej
このマクロをこちらで試してみました。
問題なく動作しています。

>時刻の欄では、最初、o列の開始時刻を入力すると、p列の終了時刻は計算式で設定しています
>そして、o列の日付が変わった欄(行下)も計算式で設定されており、連続で日時が変わる設定となっております
>入力した日時は、正常に表示されています
入力した日時に対応するR5:BZE5の範囲の日時も正常に表示されていますでしょうか。
R5:BZE5の範囲の日時が#####のように表示されているか、その列が非表示になっていませんか。
非表示でもエラーになります。
    • good
    • 0

No8は無視してください。


https://ideone.com/wF8Bej
こちらでを変えました。
https://ideone.com/7lDjiU
にアップしています。
Textでの比較はいろいろと弊害がありそうなので、Valueの比較に変えています。
この方法なら#####の表示箇所も、非表示の箇所も、00:00:00の箇所も問題なく検索できます。(こちらで試した限りではですが)
    • good
    • 0
この回答へのお礼

Tatsu99様
見事に、マクロは実行できました
本当に、ありがとうございました
数々の無礼をいたしまして、申し訳あらません

今後も、VBAの知識習得に邁進していきます

お礼日時:2018/09/27 12:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!