VBAを使ってテキストボックス内のカーソル位置を取得する方法

このQ&Aのポイント
  • VBAを使ってテキストボックス内のカーソル位置を取得する方法を教えてください。
  • テキストボックスをMultiLine = trueに設定していますが、カーソル位置を取得する方法がわかりません。
  • LeftB関数を使用してテキストボックス内の制限文字数を制御しているため、カーソルが最後に移動してしまいます。解決策はありますか?
回答を見る
  • ベストアンサー

VBAを使って制作しているのですが

VBAを使って制作しているのですが、テキストボックス内でのカーソル位置の取得は出来ないのでしょうか? テキストボックスを MultiLine = true にして使用しているのですが、 textbox_Change にLeftBを指定してn文字以上は書き込めないようにしています。 Dim DATE_CONV As String Dim DATE_FONT As String DATE_CONV = StrConv(元データ, vbFromUnicode) DATE_CONV = LeftB(DATE_CONV, 制限文字数) DATE_FONT = StrConv(DATE_CONV, vbUnicode) その結果、カーソルがどの位置にあっても、n文字を超えてしまった場合、 カーソルが最後に移動してしまいます。 なにかいい方法がないか教えてくださいお願いします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

ベタですが。 Private Sub TextBox1_Change()  Dim s, x  s = StrConv(Me.TextBox1, vbFromUnicode)  If LenB(s) > 10 Then  x = Me.TextBox1.SelStart  Me.TextBox1 = StrConv(LeftB(s, 10), vbUnicode)  Me.TextBox1.SelStart = x  End If End Sub

junction_7_7
質問者

お礼

ありがとうございます。 まさに思った通りの動きです。 感謝です。

その他の回答 (1)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.1

回答の前に確認ですが MaxLength プロパティで文字数制限をしない場合の 方法を聞いているという考え方でよろしいでしょうか?

junction_7_7
質問者

補足

はい、その通りです。 nバイト制限で、文字を制限したいので。

関連するQ&A

  • VBA(Excel2003)で文字列の切り出し

    下のプロシージャーで全角半角混じりの文字列を切り出し、別の文字列で結合しようと思いますがうまくいく場合といかない場合があります。 イミディエイト・ウィンドウ上とCell上で動作が違います。 Cell上でうまく表示させるにはどうしたらいいでしょうか? Sub Test() Dim myString(2) As String Dim i As Integer myString(0) = "airueo" myString(1) = "かきくけこ" myString(2) = "さシすせそ" For i = 0 To 2 Debug.Print MidMbcs(myString(i), 1, 5) & "...テスト" Cells(i + 1, 1).Value = MidMbcs(myString(i), 1, 5) & "...テスト" Next i End Sub Function LenMbcs(ByVal str As String) LenMbcs = LenB(StrConv(str, vbFromUnicode)) End Function Function MidMbcs(ByVal str As String, start, length) MidMbcs = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode) End Function

  • 入力規則について

    [環境] Windows2000 Access2000 ※スレ違いお許し下さい。同様の質問を下記URLで行ってます。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=744564 [問題点] Access2000で入力規則として「ひらがな」全角 「かたかな」全角 「英数字」半角 を自動で行い たいと思い一番簡単な手法を試行錯誤中です。 Dim i As Integer Dim ix As Integer Dim strChk As String Dim strMoji As String Dim strEisu As String Dim txtData As String Dim GetData As String strMoji = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン" strEisu = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" txtData = Trim(Me.テキスト5.Value) For i = 1 To Len(txtData) strChk = Mid$(txtData, i, 1) For ix = 1 To Len(strMoji) If StrComp(StrConv(Mid$(strMoji, ix, 1), vbFromUnicode), _ StrConv(strChk, vbFromUnicode), vbBinaryCompare) = 0 Then _ strChk = StrConv(strChk, 4) If StrComp(StrConv(Mid$(strEisu, ix, 1), vbFromUnicode), _ StrConv(strChk, vbFromUnicode), vbBinaryCompare) = 0 Then _ strChk = StrConv(strChk, 8) Next ix GetData = GetData & strChk Next i Me.テキスト5.Value = GetData ●上記以外の解決方法を考えております。

  • アクセスにtxtファイルの指定行のみインポートしたい

    先ほども、似たような質問をさせて頂いたのですが、おおもととして、質問していた、textファイルのインポート自体は出来るようになりましたので、 質問を絞って再度、ご質問させて下さい。 textファイルをインポートすると、”データ型の変換エラーが発生しました。”と出ます。 それは、textファイルに、他の行とは違う桁数の、余分な行(先頭行と最終行)があるからです。 先に、textファイルを開き、削除して行えば、問題ありませんが 出来れば、何も編集せずにアクセスで、何行目から何行目までを取り込む。と言った物にしたいです。 csvなどは、簡単に設定できるようですが、textも出来るのでしょうか? ちなみに、今の構文を書いておきます。 どちらに、その構文を追加すれば、いいのかまで、教えていただけると大変助かります。 Private Sub コマンド64_Click() Dim strLine As String Dim dbs As Database Dim rst As Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("支払明細") Open CurrentProject.Path & "\支払明細.txt" For Input As #1 Do Until EOF(1) Line Input #1, strLine strLine = StrConv(strLine, vbFromUnicode) With rst .AddNew !旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode) !指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode) !種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode) !数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode) !単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode) !請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode) .Update End With Loop Close #1 rst.Close MsgBox "インポートを終了しました。" End Sub

  • StrConvでUnicodeに変換出来ない文字

    エクセルのVBAで、StrConv関数を使用して、文字列をUnicodeに変換しようとしているのですが、特定の文字が変換できません。 解決方法をご存知の方は教えてください。 現象:StrConv("マミムメモ",vbUnicode)で変換すると、ムメモが文字化けしてしまう。 確認方法: MsgBox StrConv(StrConv(InputBox("入力"), vbUnicode), vbFromUnicode) で、InputBoxに"マミムメモ"を入力すると、メッセージボックスに"マミ???"と表示されてしまう。

  • VBで全角文字をバイト参照したい

    こんばんは またまた壁にぶちあたっています! VBでテキストから参照した全角文字をMidB関数等で部分参照し、 それぞれ一バイトずつのエリアに設定したいのですが、取得した値を VB(Windows?)が認識出来ない為か「?」となります。 内容を壊さずに取得する方法があれば教えて頂きたいのですがm(__)m サンプル Dim strBuff1 As String * 1 Dim strBuff2 As String * 1 txtInput = "西" strBuff1 = LeftB(StrConv(txtInput,FromUnicode),1) strBuff2 = RightB(StrConv(txtInput,FromUnicode),1) 以上のコーディングで「strBuff1」、「strBuff2」にそれぞれ「?」が 設定されます

  • Excel VBA読み込みで文字化けが

    Excel VBAにてメールデータを読み込むプログラムを組んでいます。 データの作り方は、 (1)Mozilla Thunderbirdでメールデータをtext形式で保存 (2)VBAにてtextデータを開く。 しかし読み込みを行うと、文字化けしたデータが表示されてしまいます。 どのように解決したらよいのでしょうか? 文字コード変換を行ってもダメでした。 Sub Read_mail_data() Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受け取り用 Dim strREC As String ' 読み込んだレコード名 Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のダイアログでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行わない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' 改行までをレコードとして読み込む Line Input #intFF, strREC ' 行を加算しA列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 ' 文字コードを変換する 'StrConv(strREC, vbFromUnicode) = a Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) ' セルにデータを書き込む 'Cells(GYO, 1).Value = strREC Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。 " & vbCr & "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • Word VBA テキストボックスのフォントサイズ

    Wordでマクロを組んでいます。 文書内から取得した値を変数へ格納し、複数の変数をつないでテキストボックスに入れ、文書へ追加しています。 このテキストボックスの文字のフォントサイズを前と後ろで変えたいのですが、色々試していますがうまくいきません。 お分かりになる方がいらっしゃいましたら教えてください! 以下コードです。 下記の「EIJI」のみフォントサイズを20ptにしたいのです。 変数に格納する文字列は都度変化し、文字数も変わります。 よろしくお願いします! Sub try() Dim KANA As String, KATAKANA As String, EIJI As String KANA = "あああ" KATAKANA = "アアア" EIJI = "AAA" Dim myTxt As String myTxt = KANA & "/" & KATAKANA & "/" & EIJI Dim objTextBox As Object Set objTextBox = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 25, 20, 530, 25) objTextBox.Select With Selection .Font.Size = 16 .TypeText Text:=myTxt End With End Sub

  • VB2008で全角半角の判定

    VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。  dim moji as string dim zhN as integer  zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、  半角なら zhN = 1 全角なら zhN = 2 となる。  これをVB2008で実現する方法がわかりません。  よろしくお願いします。

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • エクセルVBA/ Formatで文字列が数値に化ける?

    いつもお世話様です。 エクセルVBAでFormatを使うと、文字列中にeが一つ入っていると、「指数」とみなされて勝手に数値に化けてしまうようです。 話を簡単にするため、問題のコートを簡易化したコードが下記のtest1です。 入力されるのは常に3文字以内の英数です。 test1のコードは、ab9と入れればAB9、01とか20とか入れると、予定通り001や020を返してくれます。 ところが、なかには1E1や4E3なども入力する必要があり、これを入れると010や4000に化けてしまいます。 現在は、対処するため、下記test2のように、文字列中に"E"があるかどうかで処理を分岐させていますが、ほかに何か良い方法はないでしょうか? Sub test1() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) z = Format(y, "000") MsgBox z & " Typeだよ。" End Sub Sub test2() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) If InStr(y, "E") > 0 Then z = y Else z = Format(y, "000") End If MsgBox z & " Typeだよ。" End Sub

専門家に質問してみよう