解決済み

TextBoxのhWndプロパティVBAでも使えませんか?

  • 困ってます
  • 質問No.1843250
  • 閲覧数729
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 66% (2/3)

環境
OS:Win2000ProSP4 Excel2000および2002

Excel2000で、テキストボックスのあるフォームを作成しました。
選択したファイルを読み込んでテキストボックスに表示する機能があり
それに加えて、テキストボックス中をマウスでクリックした時、その場
所のカーソルの位置(そこの行数と行内で何カラム目か、の2つ)を取得し
て同じフォーム上に表示させる機能をつけました(矢印ボタンでカーソ
ルが移動しても、位置情報を更新するようにしています)。ただし、
ネットで調べたカーソル位置取得方法はVBAでなくてVBのものなので、
API(SendMessage)に渡すテキストボックスのhWndプロパティはなく、
困ってしまいました。窮余の一策として、普通のテキストボックスの
代わりに、リッチテキストコントロールを使用して、その中にある
hWndプロパティを渡して、上の機能を実現していました。ところが、
Excelを2002にアップグレードしたら、リッチテキストコントロール
が使えないことが判明しました(MSのサイトによると、セキュリティの
ため、とのこと)。
Excel2002で、2000時代につくったフォームを開くと、リッチテキスト
コントロールがすっぽり抜け落ちている状態です。こうなれば、普通の
テキストボックスのhWndプロパティをAPIで取得できないか、というこ
とを調べているところで困っています。あるいは、2002でも使える同じ
ようなコントロールがあれば助かります。
長くなりましたが、ご存知の方、アドバイスをお願いします。

質問者が選んだベストアンサー

  • 回答No.2

ベストアンサー率 38% (47/122)

こんばんわ。
No.1のe10goです。

>VBEditorツールバー上の表示ににあるような「その行内での何桁
>目か」の表示をしたいのが理想です。何か良い方法はないでしょう
>か?

下のコードで何とか、「何行目、何桁です。」と表示できました。

Private Sub TextBox1_MouseUp(ByVal Button As Integer, _
  ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  Dim i As Integer, a As Integer, b As String, c As Integer
  a = TextBox1.CurLine + 1
  If a > 1 Then
   b = Left(TextBox1.Text, TextBox1.SelStart + TextBox1.CurLine)
    For i = TextBox1.SelStart To 1 Step -1
      If Mid(b, i + TextBox1.CurLine, 1) = vbCr Then
        c = TextBox1.SelStart - i - IIf(a > 1, 1, 0)
        Exit For
      End If
    Next i
  Else
    c = TextBox1.SelStart
  End If
  MsgBox "カーソルの位置は、" & a & "行目、" & c & "桁です。"
End Sub
お礼コメント
fuku0123

お礼率 66% (2/3)

e10go様

fuku0123です。
コードを示していただきましてありがとうございました。
行と桁の変数をmsgboxで出しているところのみ変えて、そのまま
使えることができました。非常に助かりました。
投稿日時 - 2005-12-18 20:36:07
Be MORE 7・12 OK-チップでイイコトはじまる

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 38% (47/122)

こんにちわ。

Excel2002で「SelStart」、「CurLine」は使えませんか。
もし使えるなら、下のコードで、「TextBox1」の中を適当にクリックしたり、「TextBox1」の中の文字を選択してみてください。
なお、試される場合は、ユーザーフォーム内に「TextBox1~TextBox5」があって、「TextBox1」は4行10文字表示できるようにしてください。

Private Sub TextBox1_MouseUp(ByVal Button As Integer, _
  ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  TextBox1.SetFocus
  TextBox2.Text = TextBox1.CurLine
  TextBox3.Text = TextBox1.SelStart
  TextBox4.Text = TextBox1.SelLength
  TextBox5.Text = TextBox1.SelText
  If InStr(TextBox1.SelText, vbCr) Then _
   MsgBox "改行(キャリッジ リターン)が含まれています"
End Sub
Private Sub UserForm_Initialize()
  TextBox1.Text = "0123456789" & vbCr & "0123456789" _
    & vbCr & "0123456789" & vbCr & "0123456789"
  TextBox2.Text = ""
  TextBox3.Text = ""
  TextBox4.Text = ""
  TextBox5.Text = ""
End Sub

なお、キーの移動・選択で、同様の事をやるなら、下のコードが良いでしょう。

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, _
  ByVal Shift As Integer)
  TextBox1.SetFocus
  TextBox2.Text = TextBox1.CurLine
  TextBox3.Text = TextBox1.SelStart
  TextBox4.Text = TextBox1.SelLength
  TextBox5.Text = TextBox1.SelText
End Sub

余計なコードが入ってますが、よろしく。
補足コメント
fuku0123

お礼率 66% (2/3)

e10go様

ご回答ありがとうございます。fuku0123です。
CurLineなんてプロパティがあるのには気がつきませんでした。
これで行は取得できました。カラムの方なのですが、
SelStartプロパティを使っているので、最初からの文字数を
取得している形になっていますね。
VBEditorツールバー上の表示ににあるような「その行内での何桁
目か」の表示をしたいのが理想です。何か良い方法はないでしょう
か?今自分で思いついた方法は、初めからクリックした位置までの
文字列を丸ごと取得して、改行コードでSplitして、Splitした
最後の配列の文字列長を調べる、なんてのはどうでしょうか。
今ちょこっとやってみましたが、うまくいきません。もう少し
試行錯誤してみます。
投稿日時 - 2005-12-17 16:40:00
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ