エクセル VBA Rangeの落とし穴

仕事関連のお手伝いで,使うエクセルVBAをいじってます。久しぶりに,ドツボにはまりました。ある方のHP
を参考にした(丸ぱくり)サーチのプロシャージャでのことです。

Public Function Search(ByVal Rng As Range, ByVal keyWord As Variant, ByVal Whole As Boolean) As Range
'   引数:
'       Rng:検索範囲 (例) ActiveSheet.Range ("A1:Z500")
'       KeyWord:検索する値 (例) "リンゴ",10,7.85
'       Whole:完全一致→True 部分一致→False (例)True
'   戻り値
'       Rangeオブジェクト 見つからなかった場合は「Nothing」

'   検索範囲内の「KeyWord」を検索する関数です。
'   検索範囲を一つずつ判定し、最初に一致したセル範囲を返します。
'   完全一致と部分一致対応できます。
'   非表示のセルも検索かけます
'   検索結果はセル範囲一つだけです。複数の場合が良ければ「search_List」関数を使ってください
'   https://www.hokkyokun.com/vba-search-vs-findmethod/
    Dim r As Range    
    '完全一致
    If Whole Then
        For Each r In Rng
            If r.Value = keyWord Then
                Set Search = r
                Exit Function
            End If
        Next
        
    '部分一致
    Else
        For Each r In Rng
            If InStr(r.Value, keyWord) > 0 Then
                Set Search = r
                Exit Function
            End If
        Next
    End If  
    '見つからなかった時の処理
    '適宜変更してもらって構いません    
    Set Search = Range("XFD1048576")    'Range(1048576,16384)を返す--最終セル
End Function

この関数を呼び出すのに,次のようなサブルーチンを使いました。

Private Sub CommandButton7_Click()
    Dim Hani, kensakukekka As Range
    Set Hani = Range(Worksheets("マスター").Cells(2, 5), Worksheets("マスター").Cells(96, 5))
    MsgBox Worksheets("マスター").Cells(2, 5) & Worksheets("マスター").Cells(96, 5)
    kensakukekka = Search(Hani, "リンゴ", True)
    MsgBox kensakukekka     
End Sub

このサブルーチンはうまくいきました。しかし,

 MsgBox kensakukekka

の部分を,

 MsgBox kensakukekka & kensakukekka.Row

にするとエラーになるのです。考えられる,修正を加えましたが,エラーは,直りませんでした。
下記加えた,kensakukekka.Row は,検索結果の入っている,行番号を返すはずなのですが,エラーになり
ます。訳が分かりませんでしたので,お助け掲示板かなと思っていたのですが,ふと気がつきました。
気がつくまで,半日無駄にしました。原因は,分かってみると,簡単なのですが,呼び出しのサブルーチン
に使っていた,

kensakukekka = Search(Hani, "リンゴ", True)

が違っていたのです。Range の設定には, Set をつけてやる必要があったのです。

Set kensakukekka = Search(Hani, "リンゴ", True)

のように,Set を入れると無事思った動作になりました。 Range を扱う時は,Set を入れることを失念
したための大ポカでした。
半分?動いたので,大丈夫と思っていたのが大間違いでしたが,たちが悪いですね。エラーなら全部エラー
になればいいのになんて思いました。

エクセルーVBAー「何もしない」命令

仕事のお手伝いで使うVBAのプロシャージャの修正をしています。
変更があったときになるべく修正をしなくていいようなものを模索しています。また,同時に,後で見たとき
に何をやってるのか分かるような視認生を有効にできるように心がけていますが,両立させるのは,結構手間
がかかります。

今まで,先行受付については,期間については,手動で加減していましたが,期間についても,プロシャージ
ャに入れることにしました。
下記のようなものを考えました。

 If DateValue(sousin) < DateValue("2030/01/22") Then             'ハワイ支部会員先行受付
          If syubetu = "会員" And InStr(sibu, "ハワイ") > 0 Then
                  '何もしない
           Else
                 objmailItem.Move objFolder_kikangai
           End If
  End If

このように書いていました。必要なのは,先行受付の期間では,該当しないメールを期間外のホルダーに移動
するのですが,先行受付に該当するメールには,何もしなくて,それ以外を期間外ホルダーに移すと考えた方
がわかりやすいです。(最も,私にとってはです・・・・。)
if の部分では,なにもしなくて,else で該当しないメールの処理をする,という記述ですが,この方法だ
と,処理が増えていくことを考えると下記のように NOT を使う記述がいいとのことでした。

If DateValue(sousin) < DateValue("2030/01/22") Then             'ハワイ支部会員先行受付
          If Not(syubetu = "会員" And InStr(sibu, "ハワイ") > 0) Then
                objmailItem.Move objFolder_kikangai
          End If
End If

該当する条件を考えて,それに NOT をつけて,(該当しない条件にする)この方が,いいかもですね。

楽天市場ーーお気に入り店ーーー偽サイト(危険)

久しぶりに,アルミ板を購入しようと思い,楽天市場の「秘密基地」を検索。残念ながら,削除されてしまっ
たようです。ついでに,登録済みのお気に入り店を見てみると,結構削除されているお店があります。楽天か
から撤退したのか,それとも倒産したのかは分かりませんが,時とともに当たり前ですが変化するんですね。

久しぶりに楽天にアクセスするのに,検索でトップにきた URL をクリックしたら,

の画面にでくわしました。
消しても消しても出てくる,しつこいサイトです。初めての方は面食らうでしょうね。このHPを消すには,
ブラウザを停止するしかないので,慌てず,

 Ctrl+Alt+Delte

で,タスクマネージャをたち上げ,該当するブラウザを右クリック,出てくる画面で「停止」をクリックして
ブラウザを停止してしまえばOKです。引っかかる方いるんでしょうね。年のために,ウイルススキャンを
をして終了ですね。このサイトは,表示されているURLと実際のURLがちがうようです,ここをクリック
すると,下記にジャンプさせられるようです。間違っても,下記のURLにアクセスしないでくださいね。

https://app8kkk06.z13.web.core.windows.net/werrx01USAHTML/index.html?bcda=(0101)-20298-84253&gclid=CjwKCAjw6c63BhAiEiwAF0EH1Ba0MvwIQKA9k6_cjoRx1_m6Reut0B7BtLAa3GJD8JJDOUMzBQhj_hoCc6AQAvD_BwE&id=5

明らかに楽天のアイコンとは違うアイコンが表示されるので,要注意ですね。
下記の写真の上の「楽天」が偽物で,表示は,正式な楽天の URL ですが,楽天の上にマウスをのせると
全く違うURLがしめされるのですが。

注意喚起が必要ですね。

CDOによるメール送信ーエクセル VBA IPロック

CDOを使うと,エクセルVBAから,OUTLOOK等を経由しなくてもメールが送れるということを知りました。
そこで,下記のサイトを参考(コピペ)にして,トライしてみることにしました。

下記のコピペのプロシャージャyの必要な部分を自分の環境に合わせてやってみましたが,メールが送れま
せんでした。CDOそのものが使えないのかとも思いましたが,2024年現在お使いの方いるということで設
の定間違いだろうと検討をつけてあれこれやりました。

VBAを使ってスクレイピングの結果をメール送信する(さくらのレンタルサーバー使用)

Function SendSakuraMail(kenmei As String, mozi As String, address As String) As Boolean

    Dim objCDO As New CDO.Message

    On Error GoTo Errlabel    'エラー処理

    With objCDO

        With .Configuration.Fields
            .Item(cdoSMTPServer) = "****.sakura.ne.jp"
            .Item(cdoSendUsingMethod) = cdoSendUsingPort
            .Item(cdoSMTPServerPort) = 587                          '送信サーバーのポート番号
            .Item(cdoSMTPConnectionTimeout) = 15                    'タイムアウト
            .Item(cdoSMTPAuthenticate) = cdoBasic                   'SMTP認証
            .Item(cdoSMTPUseSSL) = False                            'SSL
            .Item(cdoSendUserName) = "--------@****.sakura.ne.jp"
            .Item(cdoSendPassword) = "?????????????????"
            .Item(cdoLanguageCode) = CdoCharset.cdoShift_JIS        '文字セット指定
            .Update '設定を更新
        End With
        With .Fields
            '重要度、通常は以下のどちらかで良いでしょう
            .Item("urn:schemas:mailheader:X-Priority") = 1
            .Item("urn:schemas:mailheader:X-MsMail-Priority") = "High"
            .Update '設定を更新
        End With
        .MDNRequested = False                   '開封確認
        .MimeFormatted = True                   'MIMEを使って書式設定
        .From = "------------@-----------.jp"
        .To = address                           '関数の引数で受け取った送信先
        .CC = ""
        .Subject = kenmei                       '関数の引数で受け取った件名
        .TextBody = mozi                        '関数の引数で受け取ったメール本文
        .Send                                   '送信
    End With
    Set objCDO = Nothing
    SendSakuraMail = True
    Exit Function
Errlabel:
  SendSakuraMail = False      '何かしらのエラーの場合はfasleをreturanする

End Function

結果,無事,メールを送ることができました。
原因は,送信メールアドレスのドメインを,初期のものにしていませんでした。

     誤 *********.jp——-取得独自ドメイン
     正 ***.sakura.ne.jp—初期ドメイン

といっても,無事送れたのは,1回だけです。頭を悩ましましたが,1時間後にまた送信成功。
おかしいなと思い,あれこれ検索してみると,下記のような記事を見つけました。

特定の時間に一定時間メールの送受信ができない

この記事の中に,

さくらのレンタルサーバではセキュリティ対策により、パスワード認証を続けて失敗した、
あるいはその他、攻撃とみなされるようなアクセスがあった場合に、接続元のグローバル
IPアドレスから以下のプロトコルでのサーバへの接続を一定時間制限させていただくことが
あります。

というような記述がありました。その症状として,

・毎週、休暇明けの月曜日8:00~9:00にメールの送受信ができない。
・断続的に1時間程度メールの送受信ができない時間が発生する。

ということで,これに当てはまるのかなと納得いたしました。

結論として,何度も間違た設定で接続したので,IP ロックがかかってしまったと,考えるのがいいようです。

===追記===
サクラのレンタルサーバーでの動作確認をする過程で,gmail.yahoo のメールでも試しました
が,どちらもだめでした。yahoo については,すでに,二段階認証になっていたので,だめかなと思
ってました。gmail については,わずかな期待もっていましたが,gmail については,
「安全性の低いアプリ」からの接続は,順次廃止されるようで,gmail のアカウント内で作成
した「アプリパスワード」が必要なようです。

マキタ(Makita) 充電式スプリット草刈機 MUX18DZ+A-53089 +A-71744

芝刈りをするのに,必要な道具をそろえましたが,今年は,思い切って,マキタのマキタ(Makita) 充電式スプ
リット草刈機を使い始めました。
一式を買うのではなく,表題の三つの型番のものを,安いところさがして,別々に購入しました。

この刈り払い機は,全体を刈るのではなく,際刈りに使ってます。あれこれ,試しましたが,これが一番いい
ようです。ただ,先端には,山善 草刈機用 替え刃 マジカルカッター MC-200 をつけています。これは,前に
使ってた日立工機(差し込み式ナイロンコード)の同型のものの後釜です。

https://www.amazon.co.jp/gp/product/B00WQBK1TQ/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1

下に円盤のないナイロンコードだと,切りすぎる心配がありますが,円盤がついているので,ある程度加減が
できます。この刈り払い機を使うに当たって,純正のバッテリーと充電器,サードパーティーの電池を充電器
をそろえました。

純正のバッテリー一個では,心許なかったのでの購入ですが,さすが,純正のものをそろえられませんでし
た。サードパーティのものは,純正の1/4程度で購入できます。ただ,サードバーティーのものは,刈り
払い機には,無理無理つけるようになるので,アダプターも購入しました。

マキタ(Makita) バッテリアダプタBAP18E A-72067

サードパーティーのものは,純正のものより,厚みがあるので,次の写真の赤の矢印の幅がぎりぎりで,無理
矢理押し込むようになるためです。

ちなみにサードパーティのバッテリーは,評判のいい,waitley のものですが,純正の充電器は,急速充
なので,充電器も併せて購入した訳です。

バッテリーの刈り払い機は,その目的が際刈りなので,長い時間使うわけではないので,充電さえしておけ
ば,エンジンのものと違ってお手軽に使えます。

芝刈りーー今年第19回目

少し間があきましたが,今年19回目の芝刈りです。今日は,始まったののおそかったので,暗くなってきた
ので途中で終わりにしました。また明日続きです。
撮影では,自動で,フラッシュがたかれました。ピントも合っていませんね。遠くが暗く見えます。

ある資格更新ーーー手数料

本日,ある資格の資格更新の手続きをしました。高いのでびっくり。

更新手数料   19,800円
振り込み手数料    203円
証明写真費用   1,000円
返信用葉書切手     85円
書類送付費用     490円
合計      21,578円

資格は5年間有効ですが,きっと,また,値上がりしているんでしょうね。
    

芝刈りーー今年第18回目

今年18回目の芝刈り。汗をかきました。今回は,前回からちょっと間があきました。刈り後を見ると,ある
場所だけ茶色くみえるところがあります。もしかして,この部分は,成長が早くて,軸狩りになってるのでし
ょうか。ちょっとわかりませんがよく見るとサッチが軸に沢山ついているようです。
成長が終わって,茶色くなってきたら,今年は,きっちり,サッチをとりたいと思います。

「ノータッチ泡ハンドソープ」の修理

ミューズのノータッチ泡ハンドソープを使ってましたが,急に赤LEDが点滅するようになりました。ダメもと
で分解修理することにしました。
検索すると諸兄のサイトに分解方法がでてましたので,分解しました。
分解している過程で,赤外線LEDから出ている配線が,根本から断線していました。これが原因?と,手持ち
のものと交換してみました。
見事,復活。
交換した赤外線LEDをよっくみると,洗剤がかかるのか,内部まで,腐食していました。

結構故障をするようで,YouTubeにも,修理方法があれこれ,掲載されています。

修理にあたって,もとの部品を再利用するつもりでしたが,写真の左側(-側)が根本から腐食しておれてい
たので,手持ちの赤外線LEDを使いました。