• 締切済み

エクセルマクロの改良

テキストボックス内に×の文字列があれば、エンターキーを押すたびに×の前にカーソルが行きます。 最後の×の後ろにもカーソルが行くようにしたいのですがご教授くださいませ。 If .Value Like "*×*×*" Then s = .SelStart ss = InStr(s + 2, .Value, "×") If ss >= s + 2 Then .SelStart = ss - 1 KeyCode = 0 End If ElseIf .Value Like "*×*×*×*×" Then s = .SelStart ss = InStr(s + 2, .Value, "×") If ss >= s + 2 Then .SelStart = ss - 1 KeyCode = 0 End If

みんなの回答

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.5

仕様が断片的で、はっきりしませんが 質問者さんは、こういうことがしたいのかな?   With TextBox1     s = .SelStart     ss = InStr(s + 2, .Value, "×")     If ss > 0 Then       .SelStart = ss - 1       KeyCode = 0     ElseIf Mid(.Value, s + 1, 1) = "×" Then       .SelStart = s + 1       KeyCode = 0     End If   End With

noname#241383
質問者

お礼

ありがとうございます。 先に回答のあったほうでも、こちらでも、問題なく作動しましたた!

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#1、3、cjです。#3補足欄へのレスです。 まぁ、そこら辺は二極の考え方がありますよね。 入力を強制するのか、入力をアシストするのか、 今回のご質問ではアシストを意図している、ということが解りました。   If .Value Like "*×" Then     s = .SelStart     ss = InStr(s + 2, .Value, "×")     If ss > 0 Then       .SelStart = ss - 1       KeyCode = 0     ElseIf s < Len(.Value) Then       .SelStart = s + 1       KeyCode = 0 こんな感じでどうでしょう?

noname#241383
質問者

お礼

ありがとうございますー あらゆるパターンで試しましたが、完璧にできました! 丁寧に解説いただきありがとうございます。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、cjです。補足欄拝見しました。 If .Value Like "*×" Then   s = .SelStart   ss = InStr(s + 2, .Value, "×")   If ss > 0 Then     .SelStart = ss - 1     KeyCode = 0   Else     .SelStart = s + 1     KeyCode = 0   End If 以上をご提示されたものに代えるように(If Then ...が閉じていない状態)書きました。 こんな感じで如何でしょう? > 2つ目の指摘 >>  ss = InStr(s + 1, .Value, "×") これは私の方の思い違いだったようです。 補足を拝見して理解できました。 > If .Value Like "*×" Then よーく解りました。 この分岐は、他の分岐を簡単にできる書き方なので、 非常に優れていると思いました。 少なくとも一度は思い違いしていますから、 (もうないようにしているつもりでも)また違っていたりしたら、 遠慮なく仰ってください。

noname#241383
質問者

補足

すいません! 最後の質問です。 できるようになりました!が、最後の×の後にカーソルが行った後 数値を入力して、エンターキーを押せば、次のボックスに飛ぶのでいいのですが、何も入力なしでエンターキーだと次のボックスにいかないです。 入力は基本的にするので問題ないのですが。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>最後の×の後ろにもカーソルが行くようにしたい If Right(.Value, 1) = "×" And Len(.Value) - 1 = .SelStart Then   .SelStart = Len(.Value)   KeyCode = 0 >ElseIf .Value Like "*×*×*" Then >  s = .SelStart >  ss = InStr(s + 2, .Value, "×") >  If ss >= s + 2 Then >    .SelStart = ss - 1 >    KeyCode = 0 >  End If >ElseIf .Value Like "*×*×*×*×" Then

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 最後(一番右)の"×"の後ろに, カーソルが行くようにする 文字通りであれば、こんな感じです。   ss = InStrRev(.Value, "×")   .SelStart = ss   KeyCode = 0 それとも"×"の前にカーソルを置きつつ、 "×"の幅だけ選択状態にする というようなことでしたら、   .SelStart = ss - 1   .SelLength = 1   KeyCode = 0 のように1行加えます。 とりあえず、部分的なパーツとしては以上です。 先の解釈の方が要望に近い気がしますが、 > 最後の×の後ろにもカーソルが行くようにしたいのですが どんな場合に、という条件付けが、こちらでは判りません。 カーソルはひとつしかありませんから、 どんな場合に、何番目の"×"の、[前|後]にカーソルを移動する、 という条件分岐について、そちらで整理してみてください。 2点、指摘があります。 現在の条件分岐の骨格として、   If .Value Like "*×*×*" Then     ' ' ×が2つ以上含まれる場合に処理   ElseIf .Value Like "*×*×*×*×" Then     ' ' 処理されることはない。   End If のようになっていると思われますが、 (部分的なコードしか提示されていないのでハッキリしないのですが) 上記の通り、ElseIfの条件に合致した上での処理に進むことはありません。  Like "*×*×*×*×" にマッチするものは、必ず、  Like "*×*×*" にマッチするからです。 文章化して説明すると、  .Value Like "*×*×*" Then 「テキストボックスの値に"×"が2つ以上マッチするすべての場合」 ですから、この条件に合致しないケース(ElseやElseIf)というのは、 「テキストボックスの値に"×"がマッチしないか、1つだけマッチする場合」 という意味になります。  .Value Like "*×*×*×*×" Then については 「テキストボックスの値について、最後(一番右)の文字が"×"であり、 且、全体で"×"が4つ以上マッチする場合」 という意味になっていますが、それ以前の条件(Else の意味)として、 「...."×"が2つ未満....」 になっていますから、決して条件に合致することはありません。 思い通りにVBAの条件分岐が書けていないことは、 これから出来るようにすれば良いので、あまり気にすることはありませんが、 VBAを書く前の準備として、ご自身で条件が整理できていないのであれば、 それは誰の手も借りられるものではありませんから、 面倒くさがらずに文章化できるように努めてください。 どれだけVBAに熟れた人でも、条件分岐で迷う時はあり、 VBAではなく文章を書いてみることで、設計を見直すことはあります。 次に、  ss = InStr(s + 2, .Value, "×") についてですが、これが、もし、  ss = InStr(s + 1, .Value, "×") であれば、 「現在のカーソル位置の次の見つかる"×"」 という風に受け取れるのですが、 何故、1文字飛ばすのか、説明ないままだと、何がしたいのか解らないです。 '+ 2'と書いた時点では、ご自身の中では整理された説明が出来ていた筈ですから、 質問に関しても、何かしら説明があれば、 今よりは要望に適うアドバイスが出来るようになるかと思われます。 とりあえず。また補足あれば、なるべく、お応えします。

noname#241383
質問者

補足

ありがとうございます。 一つ目の指摘ですが、下記のようにシンプルでひとつで良かったですね。 If .Value Like "*×" Then s = .SelStart ss = InStr(s + 2, .Value, "×") If ss >= s + 2 Then .SelStart = ss - 1 KeyCode = 0 End If 2つ目の指摘ですが、長らくやっていませんでしたのすぐにわかりませんが検証したいと思います。 本題です。 説明不足でした。 たとえば、テキストボックス1にカーソルがあるときにエンターキーを押します。すると、テキストボックス2に飛びます。 そこには、×××とあったとします。 ×の前にカーソルが行き、数値を入力します。 50××× 次にエンターキーを押すと、次の×の前にカーソルが行きます 同じく数値を入力します。 50×100×× エンターキーで数値入力 50×100×250× 次にエンターキーを押すと、最後にカーソルが行く感じです。 ss = InStrRev(.Value, "×")   .SelStart = ss   KeyCode = 0 教えて頂いたとおりにすると、2つめの×の前に行かなくなります。 説明不足でした。

関連するQ&A

専門家に質問してみよう