ユーザーフォーム SetFocus VBA エクセル 検索 (2)

間に合わせて作ったVBAが25日の仕事で役に立ちました。いくつか改良点が必要だったので,改良を加えま
した。やはり,複数検索対応が必要で,アクティブセルを目立たせることも使いやすくするためには必要でし
た。どうしようかと思いましたが,リストボックスと組み合わせることで,懸念だった,検索結果の複数項目
を保持することにしました。

上記のようなユーザーフォームで,検索結果をリストボックスに表示するようにしました。結果が単数の場合
はそのまま選択し,複数の場合は,リストボックスで選択するようにしました。
前回・今回のプロシャージャで,使ったのが,Find(keyWord, LookAt:=xlPart) というものですが,これ
は,最初にでてきたものしかヒットしません。前回のプロシャージャでは,FindNext(myCell)との組み合わせ
で,あらかじめ複数検索の対象を把握しておいて,複数検索の対象の場合は,別な検索キーで検索するとい
う,手間をかけてました。リストボックを使うことで,検索結果を全部リストボックスに表示することで,プ
ログラム的にはすっきりしました。検索結果が単数の場合は,リストボックスに表示する必要なないのです
が,複数か単数かの判別をする必要が面倒なので,一律リストボックスに表示して,

複数→選択(手動),単数→プログラムで選択

のようにしました。便利な命令があるのもので,今回のプロシャージャ作成で初めて使いましたが,

sendkeys

というもので,キーボードを押した状態をプログラムで作ることができるものです。今回初めてわかりました
が,もし,以前から分かっていたら,以前作ったプロシャージャももっと楽に作れたかもしれないと思います。
次のような動作をします。ここで使ってる名前は,データ用の架空の名前です。

名前を入力して,リターンキーを押すと,検索結果がリストボックスに表示されると同時に,選択されたセル
が見えるようになります。名前のとなりの数字は,その名前ある行番号です。

ここで矢印キーで選択する項目を移動すると,それにつれて,選択状態になったセルが見えるようになりま
す。選択してリターンキーを押すと,該当する名前のセルが選ばれ,背景が黄色になります。

単数の場合は,リストボックスに表示するのですが,表示と同時にリターンキーを送るので,リストボックは
見えず選択されたなまえの背景が黄色になります。文字の背景をその都度変えているのは,どの項目がアク
ティブになるかの表示でデバック用も兼ねてます。

合わせて,上記のように,アクティブセルの色を変えて,他のセルと区別できるようにしてます。次回,操作
の様子と全プロシャージャを掲載します。

ユーザーフォーム SetFocus VBA エクセル 検索 (3)

動作の様子です。使ってる名前は,データ作成サイトで作成した架空のものです。

以下,プロシャージャの全文です。

 

 

-ThisWorkbook-
Private Sub Workbook_Open()'************************************************
  Application.OnKey "{F3}",   "BK_clere"
End Sub

このサブは,背景色をクリアーする機能を F3キー に割り当てる部分です。

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  Application.ScreenUpdating = True
End Sub

この部分は,アクティブセルを強調するための記述で,条件付き書式と合わせて設定してます。

-UserForm1-
Dim keyWord As String
Dim myRange As Range
Dim myObj As Range

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)'***********************************************
  If KeyCode = vbKeyReturn Then
    If ListBox1.ListCount = 0 Then
      UserForm1.TextBox1.SetFocus
      Exit Sub
    Else
     Range(Cells(ListBox1.List(ListBox1.ListIndex, 1), 4).Address).Interior.ColorIndex = 6 (br /)
     'Rangで単一セルを指定の時はaddressが必要
     Cells(ListBox1.List(ListBox1.ListIndex, 1), 4).Select
     Label1.Caption = "検索結果=" & ListBox1.List(ListBox1.ListIndex, 0)
     ListBox1.Clear
     UserForm1.TextBox1.SetFocus
    End If
  End If
  If KeyCode = vbKeyF1 Then
    Range(Cells(ListBox1.List(ListBox1.ListIndex, 1), 4).Address).Interior.ColorIndex = 0
    Cells(ListBox1.List(ListBox1.ListIndex, 1), 4).Select
    Label1.Caption = "検索結果=" & ListBox1.List(ListBox1.ListIndex, 0)
    ListBox1.Clear
    UserForm1.TextBox1.SetFocus
  End If
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)'*************************** 
  Dim K As Integer   
  keyWord = TextBox1.Text

  If KeyCode = vbKeyF1 Then'F1が押されたとき
    ActiveCell.Interior.ColorIndex = 0
    Label1.Caption = "検索結果の削除"
  End If

  If KeyCode = vbKeyReturn Then 'リターンキーが押されたとき
    If keyWord <> "" Then

      K = fukusu_kensaku(keyWord)

      If K > 1 Then
        Label1.Caption = "検索結果=" & "複数該当"
        UserForm1.ListBox1.ListIndex = 0
      Else
        Label1.Caption = "検索結果=" & "一人該当"
        UserForm1.ListBox1.ListIndex = 0
      End If
    UserForm1.TextBox1.Text = ""
    End If

   UserForm1.TextBox1.SetFocus
  End If
End Sub

Private Sub UserForm_Initialize()'************************************************ 
  TextBox1.Text = ""
  With ListBox1
    .ColumnCount = 2
    .ColumnWidths = "120;50"
  End With

  With TextBox1
    .BackColor = RGB(204, 255, 255)
  End With
End Sub

Private Sub UserForm_Activate()'************************************************ 
  UserForm1.TextBox1.SetFocus
End Sub

Private Sub TextBox1_Change()'************************************************ 
  keyWord = TextBox1.Text
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)'************************************************ 
  With TextBox1
    .BackColor = RGB(255, 255, 255)
  End With
  With ListBox1
    .BackColor = RGB(204, 255, 255)
  End With
End Sub

Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'*********************************************
  With TextBox1
    .BackColor = RGB(204, 255, 255)
  End With
  With ListBox1
    .BackColor = RGB(255, 255, 255)
  End With
End Sub

Private Sub ListBox1_Change()'***********************
  If ListBox1.ListCount >= 1 Then
    Cells(ListBox1.List(ListBox1.ListIndex, 1), 4).Select
  End If
End Sub

-Module1-
Sub macro2()'***********************
  UserForm1.Show vbModeless
End Sub

Function fukusu_kensaku(key_word As String) As Integer'***********************
  Dim myRange As Range
  Dim myObj As Range
  Dim keyWord As String
  Dim K As Integer
  Set myRange = Range(Range("D2"), Cells(Rows.Count, 4).End(xlUp))
  keyWord = key_word
  Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
  K = 0

  If myObj Is Nothing Then
    MsgBox "'" & keyWord & "'はありませんでした"
    Exit Function
  End If
  Dim msg As String
  Dim myCell As Range
  Set myCell = myObj
  Do
    K = K + 1

    With UserForm1.ListBox1
      .AddItem myCell.Value
      .List(K - 1, 1) = myCell.Row
    End With
    myCell.Offset(0, -3).Value = keyWord & K '■■■■欄外に記入

    Set myCell = myRange.FindNext(myCell)
  Loop While myCell.Row <> myObj.Row

  If K > 1 Then
    UserForm1.ListBox1.SetFocus
    Call SendKeys("{DOWN}")
    Call SendKeys("{UP}")
  End If
  If K = 1 Then
    UserForm1.ListBox1.SetFocus
    Call SendKeys("{Enter}")
  End If
  fukusu_kensaku = K
End Function

Private Sub BK_clere()'***********************
  ActiveCell.Interior.ColorIndex = 0
End Sub

Public Sub SendKeys(Keys As String, Optional Wait As Boolean = False)'***********************
  Static w As Object '// WshShellオブジェクト
// WshShellオブジェクトが生成されていない場合
  If w Is Nothing Then
'// WshShellオブジェクトを生成
    Set w = CreateObject("WScript.Shell")
  End If

  Call w.SendKeys(Keys, Wait)
End Sub

 

ユーザーフォーム SetFocus VBA エクセル 検索 (1)

お手伝いの仕事?を楽にするため,また,簡単なVBAを作りました。簡単にできるかと思ったのですが,意外
に難航。なかなか思った動作をしてくれません。意図した動作とは,


のようなユーザーフォームで,クリックをしなくても,テキストボックスに入力できるようにするというもの
です。入力できるようにするには,TextBox1.SetFocus という表現をするのですが,どう書き換えても入力
できるようになりませんでした。ネットでくぐってもこの SetFocus のトラブルは結構あるみたいで,いく
つも出てきますが,明確な解決法には,あたりませんでした。 

最初 Private Sub TextBox1_Change() というイベントに関係することを記載していましたが,だめでした。

そこで,

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

のイベント処理のところに書いたら,やっと思った動作ができました。
SetFocus の命令は,どこに書いても正しい動作をするのではない,ということが,おぼろげながら分かりま
した。

思った動作とは,

 ユーザフォームを自動で表示(クリックしなくても,テキストボックスに入力できる状態に)
 入力後所定の動作が終わったら,また,テキストボックスに入力できる状態に

ということで,次のようなコードで,思った動作ができました。

Dim keyWord As String
Dim myRange As Range
Dim myObj As Range

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Set myRange = Range("D5:D98")
    keyWord = TextBox1.Text
    If KeyCode = vbKeyReturn Then
    Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
    Label1.Caption = "検索結果=「" & myObj.Offset(0, 0).Value & "」" & myObj.Row & "行目"
    myObj.Offset(0, -3).Interior.ColorIndex = 6
    UserForm1.TextBox1.Text = ""
    UserForm1.TextBox1.SetFocus
    End If
    If KeyCode = vbKeyF1 Then
    myObj.Offset(0, -3).Interior.ColorIndex = 0
    Set myObj = Nothing
    Label1.Caption = "検索結果="
    UserForm1.TextBox1.Text = ""
    UserForm1.TextBox1.SetFocus
    End If
   End Sub

Private Sub UserForm_Initialize()
    TextBox1.Text = ""
End Sub

Private Sub UserForm_Activate()
    UserForm1.TextBox1.SetFocus
End Sub

Private Sub TextBox1_Change()
    keyWord = TextBox1.Text
End Sub

 

やっていることは,単に,テキストボックに検索する文字を入力して,検索後,あれば,あった場所の左側の
背景の色を変えるということで,なんのことはありません。エンターキーを押すと,検索して,F1 を押すと
直前に変えた背景をもとに戻すという,単純な動作です。

ただ,今回のものは,検索の対象が,複数ある場合には,対応していません。複数検索に対応させるには,検
索自体はそれほど複雑ではないのですが,背景色を変える対象も複数になるので,それをもとにに戻すとなる
と,背景を変えた場所を何らかの形で記憶していないとだめで,プロシャージャが複雑になりますので,今回
はやめようかと思います。

EZcast ミラーリング ーーーPC iphone

3年ほど前に,iPhoneの画面をテレビに写したくて,EZcastというHDMIのアダプターを購入
しました。当時?,セッティングだけして,しばらく使わないでおきました。

このところ,iphoneでユーチューブを頻繁に見るようになって,その影響で,目もやばいことになって
きましたので,TVの画面でみれば,少しは違うかなということで,また,また,EZ]castを引っ張り
だしてきました。

接続の仕方を忘れてしまったので,ネットでくぐりながら,再接続いたしました。

上記初期画面のSSIDとPasswordでwifyで接続して,iphonでミラリーングをタップすれ
ば,あっけなく接続でき,iphoneの画面をそのまま,TVに写せます。

取説を紛失してしまったので,詳しい仕様は分からないのですが,もしかして,PCの画面もワイヤレスで
TVに写せるかと思い,ネットでくくって見ると,WINDOWS10の場合,標準でミラーリングの機能
があるとのことで,多少,DLするものがありましたが,これもあっけなく写すことができました。

このEZcastのアダプターは,当時,3700円程度でしたが,現在,結構な値段がするようです。

風の大地ーーービックコミックオリジナル連載

昔からビックコミックオリジナルを愛読していました。特に,好きだったのが,「釣りバカ日記」,「三丁目の夕日」,「黄昏流星群」,「風の大地」などで,特に「風の大地」は毎回楽しみに見ておりました。しかし,作者の「かざま鋭二」氏が闘病のため,連載が一時中断されました。しかし,回復することなお亡くなりになってしまいました。そのため,連載は中断されてしまいました。30年以上連載され,続きを読むのが毎回楽しみだったので,残念でなりません。
風の大地は,一人の若者が,プロのゴルファーになって,ツアーを戦っていくものでした。また,何らかの形で連載されなかなと思っています。

銀行もペーパーレス?

今日,用事があって銀行に行ってきました。受付のコーナーにタブレットとリーダーがおいてあるのは前から
分かっていました。そのタブレットで,受付票を発券してもらうことは前に何度かやったのですが,今日は振
り込みをするのに,受け付け票を発券してもらうためにタブレットを操作しました。

振り込みのところをタップすれば,発券してもらえるのかなと思いましたが,操作を続けいくと,

       個人
        ↓
       振り込み
        ↓
       窓口
        ↓
       通帳スキャン
        ↓
       振り込み先銀行
        ↓
       振り込み先支店
        ↓
       振り込み先口座番号
        ↓
       金額

と,なんと今まで伝票に記入していた部分が,全部タブレットで完結してしましました。ここまで終わって,
やっと順番記載されている受付票が発券されました。発券後,すぐに窓口に呼ばれましたが,ここからは今ま
でとほぼ同じで,銀行員での応対でした。ただ,ここでもやりとりにタブレットが使われており,タブレット
を通してのやりとりです。必要な,通帳,身分証,印鑑を提示しましたが,印鑑も朱肉で伝票に押すのではな
く,スキャナーでタブレットに取り込んでいました。

都会の銀行では,全部こんなかんじなんでしょうかね。もう一つの銀行(労金)では,相変わらず,伝票に記
載してのやりとりでした。PC等の操作には慣れていたので,それほど違和感なく操作できましたが,これ,
全然経験のない方は戸惑うでしょうね。

今日は,時代の進歩?に驚かされました。

MDR-CD900ST ヘッドフォン

長年愛用してきたヘッドフォンがあります。
ソニーのMDR-CD900STというスタジオモニター用のヘッドフォンです。

あまり耳が良い訳ではないのですが、あくまでも原音に忠実に再生するということで、長年愛用してきまし
た。特に、現役時代、電車で出張等に出かけるときは、電車内での時間つぶしに、このヘッドフォンで大好
きな音楽を聴いていました。

何年か前に、ジャックと携帯用に改造をお願いしたときに、劣化していたイヤーパッドを交換していただいた
のですが、そろそろまた、交換時期がきたようです。

以前、改造をお願いしたのは、確か、大阪のお店だった
ような気がします。今回は、安上がりにするのに、自分で部品を購入して、DIYをしようと思います。幸い、
ネットでくぐると、イヤーパッドの販売先や、交換方法等もでているので、問題なくできそうです。

今回イヤーパットは、純正のものが欲しいということで、〇azonではなく、あるHPに紹介されていた、
サウンド・ハウスさんに注文しました。2000円以上ということで、送料も代引き手数料も無料で
した。

本日無事部品がとどきました。通常のA4の封筒で届きました。


中身です。made in Tailand とありました。


イヤーパッドを引っ張ると簡単にとれましたが,取り付けるのにちょっと苦労しました。無理矢理引っ張っ
て,広げて取り付けました。

肝臓がフォアグラ寸前?

いつも12月に受けている特定健康診断の結果,肝臓の精密検査に・・・・。結果,肝臓に脂肪並びに繊維が
たまっていてフォアグラ寸前?との診断でした。20年以上前から,脂肪肝の傾向だとはいわれていたのです
が,甘い物好き,間食好き,がたたったのでしょうかね。それに,この数ヶ月,夜食と称して,夜10時過ぎ
ご飯を食べたのがきいたのかもしれません。「非アルコール性肝脂肪障害」の立派な診断名をいただきまし
た。

 どうも,貧乏性らしく,等分を肝臓にため込む傾向があるようで,糖尿病にならずに,肝臓の疾患になった
ようです。まあ,もうちょっと,いろいろやりたいので,生活の見直しということで,夜食をやめる,運動を
するということにしました。

 運動不足は前々から感じていて,ウォーキングをしていたのですが,寒くのこのところ途絶えていましたの
で,再開することになりました。ウォーキングも,ただ歩くのだけではなく,インターバルウォーキングがい
いと推奨されているようなので,それに取り組むことに。

 以前もやっていたのですが,実施するにあたって,便利な時計を引っ張りだしてきました。

もう廃盤になっていますが,TIMERS11というカシオのサッカー審判用の時計です。インターバルウォ
ーキングは,3分間の速歩,3分間の並足,を繰り返すのですが,この時計のインターバルタイマーを使うと
設定した時間でカウントダウンしてくれて,0になるとバイプレーション(ブザー)で区切りを通知してくれ
ますので,無理なく続けることができます。この時計,廃盤になってしまったのが残念です。メルカリやヤフ
オクでは,結構な値段で出品されているようです。

 早速,今朝,一回りして,汗をかいてきました。さて,続けるとフォアグラの脂肪肝どうなるでしょうか・・・・・。

Arduino—再び(4)–LCD Keypad Shield

あれこれやって、思った動作ができるようになりました。やろうとしてたのは、arduinoで、リニアステージの
ステッピングモーターをパルスを送ることで動かすことでした。今回は、TB6600というドライバーを経由し
て、制御しました。結線等は、例によって、諸兄のHPを参考にしました。
このドライバーには、

     ENA- ⇒⇒デジタル11番ピン
     ENA+ ⇒⇒5V

     DIR- ⇒⇒デジタル12番ピン
     DIR+ ⇒⇒5V

     PUL- ⇒⇒デジタル13番ピン
     PUL+ ⇒⇒5V

の6本の接続が必要ですが、プラス側に接続してもマイナス側に接続しても動くようでしたが、aruduinoで
は、+端子は一律5Vに落として、-の端子の方をそれぞれに結線しました。TB6600の内部配線がどうなって
るのか気になるところです。

動作させているところです。パルスを設定して、SELECTボタンで動かしてます。パルスの数値を+と-の設定にすることで、反対の方向に移動させてます。

今回は、別な面で苦労しました。YouTubeの設定が変わったのが、埋め込みリンクの書いてあるところが分からず、時間ばかりかかりました。分かるとなんのことはない、自分の動画の再生画面で、右クリックをするとその項目があり、分かった時は、がっかりしました。

とりあえず動いたarduinoのスケッチアップします。例によってデバックように入れておいたserial.print等の残ったままのものです。

Arduino—再び(3)–LCD Keypad Shield

ほぼ目的のプログラム(スケッチ--arduinoではこう呼ぶみたいですね。)ができました。難しいものではな
く、入門編によくあるようなLチカ(LEDを点灯させる)のプログラムと大差ありません。ただ、キーの読み取
りをアナログの変化で読み取っているので、安定しない部分があるのか、長押しの判別がどうしても、できま
せんでした。

               押されたキーの判別
                    │
          ┌───────────────────────┐
    UPキーが押された⇒⇒ +1の処理    UPキーが長押しされた⇒⇒+10の処理

のようにしたかったのですが、あきらめて、+10の処理は、RIGHTキーに割り当てました。 スケッチでは、

   キー判別の関数の呼び出し
      
   呼び出されたそれぞれキーの回数をカウントする
      
   カウントが一定以上になったら、キーに応じた処理をする。

という単純なことを、メインのLOOPのなかで、繰り返してるだけです。「回数をカウント」の部分はなくても
いいのですが、一応チャタリングの対策です。
入力した数字をLCDに表示するのに数字の桁数が違ってしまうと、正しい表示がされないので、左詰めで表示
できるように簡単な関数を作りました。文字数を取得する関数が準備されてますが、その書式がどちらかとい
うとエクセルのVBAのような感じで、ちょっと戸惑いました。PICのC言語だと目的の文字を括弧の中にいれる
のですが、ピリオドで連結するようでした。このへんの細かい文法は、その都度調べないとだめですね。

   arduinoの記述  s.length( )  (sが長さを求める文字)
   PICのC言語記述 sterlen(s)   (sが長さを求める文字) 

“Arduino—再び(3)–LCD Keypad Shield” の続きを読む