2024年5月19日日曜日

栽培するのが簡単でも、持て余し気味になって泣きつかれた植えたのが運の尽き ー 除草剤(ガーデニング)

         
マンションの中庭で新しい植栽をすることになり、今ある植物を伐採しました。
やや、日当たりの悪い場所のせいで、定植したら剪定もしないほったらかしだ。

しかも、繁殖力の強いキンシバイ、ガザニア、ドクダミがごちゃごちゃと繁茂。
見栄えが悪くて、黄色のキンシバイに白いガザニアだけでは、実に単調な花壇。

これに、邪魔な雑草の代名詞のドクダミまで参入して混乱の極みのジャングル。
なので、マンション住人でつくるガーデニング友の会が、立ち上がりましたな。

週末の一時間で、畳一畳分をきれいにするつもりでしたが、これが大誤算です。
他の花壇の整備もあったので、このエリアは、自分と上さんだけで作業を開始。

幸い備品の鍬が使えたので、根っこの掘り起しに重宝しましたが出るわ出るわ。
しかも、地下茎の縦横無尽に走っていて、最後は手で引っこ抜いて駆除します。

この地下茎と根っこは、完全に取り切れませんでしたが体力の限界で手仕舞い。
後は、五月の連休中に様子を見て、改めて、個人的に駆除しようと言う考えね。

この時には、除草剤でも使ってみるかと考えて、百均のセリアで二本を購入だ。
ただ、効能書きを読むと、直接、植物の葉に散布して枯らしてしまう種類だな。

となれば、既に地上の葉っぱは、刈り取ってしまったので、必要ではないかも。
そう思って無駄な買い物かと思いましたが、こんなツイートも発見したのです。

 ワイが盆栽屋時代に習った除草の仕方。

  1 草を根元まで刈る
  2 株の切り口に除草剤の原液をハケなどで塗る

 ↑コレだけで大体の除草はピンポイントで効きます。
  ワイが試した時にはギシギシからドクダミからミントも効いたので
  ほぼ間違いなし。
  他の草には影響出ないし。
   
        
なるほど、地下にまだ残っている、茎や根っこに除草剤の原液を塗りつけよう。
そうすれば、残っている根っこもお陀仏になってくれそうで、連休中にお試し。

この百均で購入したのは、商品名が”グリホ7”で、成分はグリホサホート41です。
世界で最も使われている除草剤らしいのですが、他方、不思議なサイトも発見。

それが上掲のキャプチャーで、通販に偽装しているものの完全ディスッている。
百均の商品を一本三万円以上で販売するなど、怪しさも伝わる詐欺サイトだぜ。

ただ、百均の領収書まで見せつけていて、何だが謎のサイトが二つも存在した。
メーカーへの執拗な営業妨害とも受け止められかねない感じもして気味が悪い。

というわけで、成分が土に残留する農薬と違って、グリホは分解が早いらしい。
EUの評価では、ヒトでの遺伝毒性はないと思われるという結論がだされておりますので、ガーデニング用にちょっぴり使う程度なら、そ心配には及ぶまいと考える自分なのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



2024年5月17日金曜日

厚塗りのオーケストレーションから生まれる彩度の低い渋い音作りを、独自の魅力と理解するかどうかのことだろう - 庄司紗矢香(バイオリニスト)

        
最近はテレビが全くつまらなくなり、晩御飯の後で視ることもなくなりました。
上さんなどは、ドラマがあるとその時間帯だけテレビを点けて視聴する感じね。

昔は、家のリビングで、誰が視ているのかわからないのにテレビが点いていた。
チャンネルは、家族の好みで切り替えられたり、喧嘩になった時代が懐かしい。

もはや、つまらない以外の何者でもなくなったのが、テレビだという感じです。
その代わり、PCでユーチューブでも見ておけば、退屈しのぎにはなりますなあ。

チャンネルもたくさんあるし、収録時間も短い上に、後で視直すこともできる。
一人暮らしを始めた若者の部屋には、テレビが無いと言う話は当たり前の時代。

だから、この期に及んで、テレビ番組の話で盛り上がる気など毛頭ありません。
まあ、ユーチューブでチャンネルを検索しながら、暇つぶしで視るのが今時だ。

特に、クラシック音楽の作品を紹介する番組が豊富なので、時々聞いたりする。
今回、探し当てたのは、バイオリニストの庄司紗矢香さん独奏による協奏曲ね。

ドイツのフランクフルト放送交響楽団と共演ですが、シューマンの作品なんだ。
演奏される機会がさほど多くないのですが、それでも昔よりは増えて来ました。

録音に残しているソリストもいるぐらいなので、レアというほどでもないかな。
ただ、最近の演奏活動が少し地味目だった、庄司紗矢香が健在なのは良かった。

十代で、パガニーニ国際コンクールに優勝したのが、二十年以上も昔の話です。
それから、若い頃は盛んに活躍していて、ユーチューブ動画も多くありました。

ところが、その後は露出が減っていたような気もしましたが、最近は復調かな。
既に四十代になって、このまま年齢に応じた円熟味を増して欲しいと思います。

というわけで、最近はドラマなどでもシューマンの交響曲が紹介されていたな。
”さよならマエストロ”では、第3番”ライン”が使われていましたが、巷間ではオーケストレーションがうまくないと酷評される向きもある中で、今現在でも演奏される点で、作品としては完成されているからだろうとも思うのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



2024年5月15日水曜日

実用になさないような関数の使い道を探そうてとして、諦めて代替策で乗り切ると言う現実 ー Kill関数(VBAマクロ)

          
VBAでコードを書いていて、ファイルを削除するコードでかなり苦労しました。
ロジックは、ファイル名を変更して保存後、元のファイルを削除する考えなの。

元のファイルもタイムスタンプが付いていて、名称が日々変わるので厄介です。
先ず、元ファイルをダウンロードフォルダーから、ブックのフォルダへコピペ。

それから、色々な操作の後で、作業をした日付のタイムスタンプを加えて保存。
この仕事は日課なので、元のファイルはどうしても作業後に削除しておきたい。

それで、ファイルの削除関数と言えば”Kill”ですが、問題はファイルの指定方法。
フルパスでファイル名を、ダブルコーテーション引用符で括っておく必要です。

 Kill "C:\Book1.xlsx"

 Sub test()
 Dim str As String
   str = ""
     str = str & "C:\作業フォルダ\"
       str = str & "Book1.xlsx"
   Kill str
 End Sub

このような記述がネットでよく見られますが、この括りを変数で扱えないのか。
シンプルな構文ですと、文字列変数で実際に代入して実行しても動作はします。

ただ、複雑なコードの中で書くと、この変数の指定をしても実行ができません。
そんな事態が発生してしまい、理由が良く分かりませんが、解決策が必要です。

考えられるのは、実行プログラムで削除するブックを、かなり操作しています。
元ファイルを日付付きで別に保存した後で、元ファイルを削除する手法なんだ。

ただ、挙動を観察すると削除された形跡がないので、動いているのか不明なの。
なので、色々考えた挙句、Name関数で元のファイルを別フォルダに移します。

この削除フォルダでファイル一覧を掛けて、全ファイルを削除すると言う手法。
これならば、Kill関数を使わなくても大丈夫で、代わりにFileSystemObjectだ。

Sub FileMove()
Dim FSO As Object, Fle As Object, str As String, str2 As String
str = ""
  str = str & ThisWorkbook.Path
    str = str & "\"
  str2 = ""
    str2 = str2 & ThisWorkbook.Path
      str2 = str2 & "\削除\"
        str2 = str2 & ""
  Set FSO = CreateObject("Scripting.FileSystemObject")
    For Each Fle In FSO.GetFolder(str).Files
      If InStr(Fle.Name, ThisWorkbook.Name) > 0 Then GoTo Skip
        str = str & Fle.Name 'InStr関数で、開いているブックを回避
          str = str & ""
            str2 = str2 & Fle.Name
              str2 = str2 & ""
        Name str As str2 'Name関数で同じファイル名で別フォルダに移動
Skip:
    Next Fle
    Set FSO = Nothing
End Sub

Sub FileDelete()
Dim FSO As Object, Fle As Object, str As String
  str = ""
    str = str & ThisWorkbook.Path
      str = str & "\削除\"
        str = str & ""
  Set FSO = CreateObject("Scripting.FileSystemObject")
    For Each Fle In FSO.GetFolder(str).Files
        Fle.Delete 'Kill関数を使わないで削除
    Next Fle
  Set FSO = Nothing
End Sub

この方法を実際に実行すると、フォルダ移動のファイルが削除されていました。
ただ、パスも含めたファイル名を、文字列変数で指定するので少しややこしい。

Kill関数に比べても複雑になりますが、ファイル指定が変数なので使いやすい。
というわけで、汎用性の高いコードは、なるべく変数を使って実行したいもの。

コードの記述が長くなりますが、一度サンプルを作っておけば、同じ事例が出ても使いまわせるわけで、コード記述のノウハウは、非常に重要なのだと分かったのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



2024年5月13日月曜日

別のブックを開いて、そこからデータを引っ張ってくる手法をよく使いますが、それなりに工夫が必要だな ー オブジェクト変数(VBAマクロ) 

         
もし、複数ブックを開き、各々にある複数シートをVBAで操作するとします。
もちろんマクロを書いたブックは、コードだけを利用するプログラムなのです。

 Workbooks("ブック名").Worksheets(”シート名”).Range("A1")

基本的には、上のようなコードであれば、ブックとシートを特定できるのです。
ただ、記述が冗長になるし、変数を使って特定できれば記述は簡単になるんだ。

なので、開いているブックを特定するため、オブジェクトの変数を設定したい。
それと、操作したブック名にタイムスタンプをつけて、フィル名が変わるかも。

これを加味して工夫してみたのが、次のようなコードになり意外に役立ちます。
このコードの工夫ですが、Instr関数とオブジェクト変数の”Set”の使い方です。

Sub sample()
Dim wb As Workbook, wb1 As Object, wb2 As Object
  For Each wb In Workbooks
    If InStr(wb.Name, "ファイル名の先頭文字一部") = 1 Then Set wb1 = wb
    If InStr(wb.Name, "ファイル名の先頭文字一部") = 1 Then Set wb2 = wb
  Next wb
    Debug.Print wb1.Name
      Debug.Print wb2.Name
End Sub

それに、マクロ例文で、If文中で”Set”を定義づけても、特に問題はありません。
ちゃんと動作しますが、ネットの例文では、こういう書法の仕方がないんだな。

次に、InStr関数は、文字列の中に指定した文字列があるかどうかを判別します。
含まれていれば、何文字目かにあるか数値を表すので、この例では先頭の意味。

含まれていなければ、”0”になりますが、使い道のある関数なのでよく使います。
これでブックは特定できましたが、ワークシートも同じく変数で定義づけ可能。 

Option Explicit
Dim wb As Workbook, wb1 As Workbook, wb2 As Workbook
Dim ws As Worksheet, ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet

Sub sample() '二つの開いているブックに変数で定義
  For Each wb In Workbooks
    If InStr(wb.Name, "UsrFrm") = 1 Then Set wb1 = wb
    If InStr(wb.Name, "ShuffleExcel") = 1 Then Set wb2 = wb
  Next wb
    Debug.Print wb1.Name
      Debug.Print wb2.Name
End Sub

Sub sample2() '定義された一つのブックの各シートに変数で定義
  For Each ws In wb1.Worksheets
    If ws.Name = "Sheet1" Then Set ws1 = ws
    If ws.Name = "Sheet2" Then Set ws2 = ws
    If ws.Name = "Sheet3" Then Set ws3 = ws
  Next ws
End Sub

Sub sample3() '定義された一つのブックの各シートに変数で定義
  wb1.Activate
    ws3.Activate
      Range("A1").Select
End Sub

上の構文は、プロシージャ共通の変数に設定するため、モジュール先頭で記述。
変数が各プロシージャへ渡り継がれて行き、最後にセル範囲を首得しています。

ところで、”Set”で定義するオブジェクト変数には、包含関係が存在しています。
上位のVariant型から、Object型、 特定のオブジェクト型へ固有の指定になる。

まあ、最低限、Workbook、Worksheet、Range、3つは覚えておきましょう。
もし、型の指定が難しかったら、ObjectもVariantでも構わないとは思います。

というわけで、コードはあくまでもサンプルに過ぎなくて実用には工夫が必要。
ネットで紹介したコードを見ても、教科書的なサンプルコードが多いだけなので、その組み合わせを工夫することで、自分にとって実用的なコードが見いだされるというわけなのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村