Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2724 / 13646 ツリー ←次へ | 前へ→

【66165】テキストボックスのカーソル位置を取得 かな 10/8/6(金) 11:11 質問[未読]
【66167】Re:テキストボックスのカーソル位置を取得 Jaka 10/8/6(金) 11:45 発言[未読]
【66169】Re:テキストボックスのカーソル位置を取得 かな 10/8/6(金) 13:19 質問[未読]
【66170】Re:テキストボックスのカーソル位置を取得 Jaka 10/8/6(金) 14:19 発言[未読]
【66171】Re:テキストボックスのカーソル位置を取得 かな 10/8/6(金) 16:19 質問[未読]
【66173】Re:テキストボックスのカーソル位置を取得 Jaka 10/8/6(金) 16:40 発言[未読]
【66273】Re:テキストボックスのカーソル位置を取得 かな 10/8/16(月) 8:48 お礼[未読]
【66174】Re:テキストボックスのカーソル位置を取得 SS 10/8/6(金) 16:44 発言[未読]
【66275】Re:テキストボックスのカーソル位置を取得 かな 10/8/16(月) 8:56 質問[未読]
【66277】Re:テキストボックスのカーソル位置を取得 SS 10/8/16(月) 14:17 発言[未読]
【66278】Re:テキストボックスのカーソル位置を取得 かな 10/8/16(月) 16:22 お礼[未読]
【66281】Re:テキストボックスのカーソル位置を取得 SS 10/8/17(火) 9:33 発言[未読]
【66379】Re:テキストボックスのカーソル位置を取得 かな 10/8/31(火) 16:00 お礼[未読]
【66172】Re:テキストボックスのカーソル位置を取得 neptune 10/8/6(金) 16:37 発言[未読]
【66274】Re:テキストボックスのカーソル位置を取得 かな 10/8/16(月) 8:51 お礼[未読]

【66165】テキストボックスのカーソル位置を取得
質問  かな  - 10/8/6(金) 11:11 -

引用なし
パスワード
   テキストボックスについてとても苦戦してます

テキストボックス内に長文を入力していくのですが、
一行10桁までしか入力できないように制御したいのです。
10桁を超えるを自動的に改行されるといったマクロを組みたいのですが、
どうすればよいのでしょうか?

いろいろ考えてはみたんですが、いまいち方法がわからなくて困ってます

ちなみに今の考えとしては、
行数を取得して、その行数の数によって、IF文を使用して
改行の認識有無をしていく感じにしようとしています

例えば、行数が3行目だったら、
If 行数=3 then
  If MyBit = 34 Then
   MyText1 = Left(TextBox1.Text, MyBit - 1)
   MyText2 = Right(TextBox1.Text, 1)
   TextBox1.Text = MyText1 & vbCrLf & MyText2
  End If
End If

でも、こうすると、4行目にカーソルがいて、3行目に戻って、入力を追加した場合も、行数は3行目と認識してほしいのですが、
行数は4行目と認識されてしまいます

そこで、テキスト内に今入力した文字の位置を取得できる方法はないのでしょうか?
ちょっと、説明がわかりにくいかもしれないけど、どうかよろしくお願いします


Private Sub TextBox1_Change()
Dim MyBit As Integer
Dim MyText1 As String
Dim MyText2 As String
Dim Kai()
Dim strName As String
Dim A

strName = TextBox1.Text
’テキストボックスのビット数を取得
MyBit = LenB(StrConv(strName, vbFromUnicode))
行数を取得
A = Split(TextBox1.Value, vbCrLf)
’MsgBox "行数" & UBound(A) + 1

行数=UBound(A)+1
If 行数=1 then
  If MyBit = 11 Then
   MyText1 = Left(TextBox1.Text, MyBit - 1)
   MyText2 = Right(TextBox1.Text, 1)
   TextBox1.Text = MyText1 & vbCrLf & MyText2
  End If
ElseIf 行数=2 then
  If MyBit = 23 Then
   MyText1 = Left(TextBox1.Text, MyBit - 1)
   MyText2 = Right(TextBox1.Text, 1)
   TextBox1.Text = MyText1 & vbCrLf & MyText2
  End If
ElseIf 行数=3 then
  If MyBit = 34 Then
   MyText1 = Left(TextBox1.Text, MyBit - 1)
   MyText2 = Right(TextBox1.Text, 1)
   TextBox1.Text = MyText1 & vbCrLf & MyText2
  End If
(以下、同様のマクロ記述が22行目まで続く)
End If


End Sub

【66167】Re:テキストボックスのカーソル位置を取得
発言  Jaka  - 10/8/6(金) 11:45 -

引用なし
パスワード
   カーソル位置を取得でいいですか?

MsgBox TextBox1.SelStart

【66169】Re:テキストボックスのカーソル位置を取得
質問  かな  - 10/8/6(金) 13:19 -

引用なし
パスワード
   ▼Jaka さん:

ありがとうございます
試してみたところ、カーソル位置の取得はできましたが、
文字数を1として取得されますが、
今あるカーソルの位置が、何ビット目なのか?っていう取得の方法はありますか?
何度も、すみませんが、もしよければ、教えて頂きたいです

よろしくお願いします

【66170】Re:テキストボックスのカーソル位置を取得
発言  Jaka  - 10/8/6(金) 14:19 -

引用なし
パスワード
   ▼かな さん:
>今あるカーソルの位置が、何ビット目なのか?っていう取得の方法はありますか?
ビット?
すみません。
ビットはわかりません。

バイトでよければ、
Dim st As String
st = Left(TextBox1.Value, TextBox1.SelStart)
MsgBox Application.Evaluate("LenB(""" & st & """)") & "バイト"

【66171】Re:テキストボックスのカーソル位置を取得
質問  かな  - 10/8/6(金) 16:19 -

引用なし
パスワード
   ▼Jaka さん:

ありがとうございました

Jakaさんに教えてもらったものを生かして、試行錯誤考えてはいるんですが、
どうも、うまくできないです。

桁数の制御って、どうやったらうまくできるのでしょうか?

【66172】Re:テキストボックスのカーソル位置を取得
発言  neptune  - 10/8/6(金) 16:37 -

引用なし
パスワード
   ▼かな さん:
横入り

>今あるカーソルの位置が、何ビット目なのか?っていう取得の方法はありますか?
良く意味がわかりませんが、カーソルの位置そのものは文字数単位で
設定、取得できますが、bit単位では出来ません。
と、言うよりformsのtextboxは内部的に1文字2byteのunicodeだったと思うので
カーソルの位置をビット単位ってな概念はないのでは?

【66173】Re:テキストボックスのカーソル位置を取得
発言  Jaka  - 10/8/6(金) 16:40 -

引用なし
パスワード
   う〜ん、テキストボックスの文字数制限って、あまりやったことが無いので、
なんともいえませんが、前に返答したことがあるかも?

都度テキストボックスの内容を取得し、改行を全部消してから、
また、改行をを挿入するといった感じになったと思います。

挿入は、こんな感じでも出来ると思います。
【66127】

文字数でも面倒くさかった記憶があるので、バイト単位だと更に面倒になると思います。

【66174】Re:テキストボックスのカーソル位置を取得
発言  SS  - 10/8/6(金) 16:44 -

引用なし
パスワード
   ▼かな さん:

横から失礼します。
興味があったので作ってみましたが機能的には合っていますか?

Private Sub TextBox1_Change()
  Dim i As Long, j As Long
  Dim txt1 As String, txt2 As String
  Dim TAry As Variant
  Dim n As Integer
  
  'UserForm上のEvent無効化不可対策
  If TextBox1.Tag = "False" Then Exit Sub
  '文字数設定
  n = 10
  txt1 = TextBox1.Text
  '文字列の整理"vbCrLf"の消去
  TAry = Split(txt1, vbCrLf)
  For i = 0 To UBound(TAry, 1)
    txt2 = txt2 & TAry(i)
  Next i
  '文字列の改行"vbCrLf"の追加
  For i = Len(txt2) To 1 Step -1
    If i Mod n = 0 Then
      txt2 = Left(txt2, i) & vbCrLf & Right(txt2, Len(txt2) - i)
    End If
  Next i
  'UserForm上のEvent無効化不可対策
  Call Set_Text(txt2)
End Sub

Private Sub Set_Text(ByVal s As String)
 With TextBox1
  .Tag = "False"
  .Value = s
  .Tag = ""
 End With
End Sub

>▼Jaka さん:
>
>ありがとうございました
>
>Jakaさんに教えてもらったものを生かして、試行錯誤考えてはいるんですが、
>どうも、うまくできないです。
>
>桁数の制御って、どうやったらうまくできるのでしょうか?

【66273】Re:テキストボックスのカーソル位置を取得
お礼  かな  - 10/8/16(月) 8:48 -

引用なし
パスワード
   ▼Jaka さん:

お礼が遅くなりました
すみません・・・

>挿入は、こんな感じでも出来ると思います。
>【66127】

過去ログ見てみました
間に、改行を挿入していくという感じですね
そういう考え方もあったんですね
ありがとうございます

また、試行錯誤考えてみますね

【66274】Re:テキストボックスのカーソル位置を取得
お礼  かな  - 10/8/16(月) 8:51 -

引用なし
パスワード
   ▼neptune さん:

アドバイスありがとうございます
ビット単位という考え方は駄目なんですね
もう一度、考えてみます


>
>>今あるカーソルの位置が、何ビット目なのか?っていう取得の方法はありますか?
>良く意味がわかりませんが、カーソルの位置そのものは文字数単位で
>設定、取得できますが、bit単位では出来ません。
>と、言うよりformsのtextboxは内部的に1文字2byteのunicodeだったと思うので
>カーソルの位置をビット単位ってな概念はないのでは?

【66275】Re:テキストボックスのカーソル位置を取得
質問  かな  - 10/8/16(月) 8:56 -

引用なし
パスワード
   ▼SS さん:

ありがとうございます
早速試してみました。
機能的には、思っていることが実現できました

ただ、文字を入力していって、10桁目を過ぎないと、
改行してくれないのでしょうか?
例えば、3桁文字を入れて、次に改行したくても、今のマクロだと
改行ができないのです
スペースを入れて、次の改行って感じになってしまうんですけど、
解決策ってありますか?

すみません・・・
ここまで、教えてもらいながら、、、ずうずうしく聞いてしまって・・・

もしよろしければ、アドバイスお願いします


>横から失礼します。
>興味があったので作ってみましたが機能的には合っていますか?
>
>Private Sub TextBox1_Change()
>  Dim i As Long, j As Long
>  Dim txt1 As String, txt2 As String
>  Dim TAry As Variant
>  Dim n As Integer
>  
>  'UserForm上のEvent無効化不可対策
>  If TextBox1.Tag = "False" Then Exit Sub
>  '文字数設定
>  n = 10
>  txt1 = TextBox1.Text
>  '文字列の整理"vbCrLf"の消去
>  TAry = Split(txt1, vbCrLf)
>  For i = 0 To UBound(TAry, 1)
>    txt2 = txt2 & TAry(i)
>  Next i
>  '文字列の改行"vbCrLf"の追加
>  For i = Len(txt2) To 1 Step -1
>    If i Mod n = 0 Then
>      txt2 = Left(txt2, i) & vbCrLf & Right(txt2, Len(txt2) - i)
>    End If
>  Next i
>  'UserForm上のEvent無効化不可対策
>  Call Set_Text(txt2)
>End Sub
>
>Private Sub Set_Text(ByVal s As String)
> With TextBox1
>  .Tag = "False"
>  .Value = s
>  .Tag = ""
> End With
>End Sub
>
>>▼Jaka さん:
>>
>>ありがとうございました
>>
>>Jakaさんに教えてもらったものを生かして、試行錯誤考えてはいるんですが、
>>どうも、うまくできないです。
>>
>>桁数の制御って、どうやったらうまくできるのでしょうか?

【66277】Re:テキストボックスのカーソル位置を取得
発言  SS  - 10/8/16(月) 14:17 -

引用なし
パスワード
   こんな感じでしょうか。ただし試してみたら改行が余計に入るみたいです。
私が改行の扱いをよく理解していないためだと思いますが時間がないので
とりあえずここまでとします。
参考としてください。またこの方法が最善と言うわけではありませんのでこれに拘らずに効率のよい方法で作成してください。

Private Sub TextBox1_Change()
  Dim i As Long, j As Long
  Dim txt1 As String, txt2 As String, txt3 As String
  Dim TAry As Variant
  Dim Ttmp As Variant
  Dim n As Integer
 
  'UserForm上のEvent無効化不可対策
  If TextBox1.Tag = "False" Then Exit Sub
  '文字数設定
  n = 10
  txt1 = TextBox1.Text
  '文字列の整理"vbCrLf"の消去
  TAry = Split(txt1, vbCrLf)
  'n文字以下の改行チェック
  For i = 0 To UBound(TAry, 1)
    txt2 = txt2 & TAry(i)
    If Len(TAry(i)) < 10 And i <> UBound(TAry, 1) Then
      '文字列の改行"vbCrLf"の追加
      txt2 = txt2 & vbCrLf
      For j = Len(txt2) To 1 Step -1
        If j Mod n = 0 Then
          txt2 = Left(txt2, j) & vbCrLf & Right(txt2, Len(txt2) - j)
        End If
      Next j
      txt3 = txt3 & txt2
      txt2 = ""
    ElseIf i = UBound(TAry, 1) Then
      For j = Len(txt2) To 1 Step -1
        If j Mod n = 0 Then
          txt2 = Left(txt2, j) & vbCrLf & Right(txt2, Len(txt2) - j)
        End If
      Next j
      txt3 = txt3 & txt2
    End If
  Next i
  'UserForm上のEvent無効化不可対策
  Call Set_Text(txt3)
End Sub

【66278】Re:テキストボックスのカーソル位置を取得
お礼  かな  - 10/8/16(月) 16:22 -

引用なし
パスワード
   ▼SS さん:

ありがとうございます
すみません・・・お忙しいところお手間をとらせてしまって・・・

SSさんのを参考に、私なりに考えてみます

本当に助かりました

ありがとうございました

【66281】Re:テキストボックスのカーソル位置を取得
発言  SS  - 10/8/17(火) 9:33 -

引用なし
パスワード
   ▼かな さん:

こんにちは、前回の回答では誤解させてしまったみたいですが
私は興味あるものに楽しんで回答していますので気にしないで下さい。
それで不具合が気になっていたので確認するとCtrl+Enterの改行は
vbLfになるようです。vbLfとvbCrLfの混在が問題だったようです。
格好悪いですが以下の変換をすることでできました。
  '文字数設定
  n = 10
  txt1 = TextBox1.Text
  txt1 = Replace(txt1, vbCr, "")
  txt1 = Replace(txt1, vbLf, vbCrLf)
改行をvbLfだけでは上手くいきませんでしたが勘違いかもしれません。
かなさんが完成させたものを紹介して頂けると私のスキルUPにも
役立つと思いますので宜しくお願いします。

>▼SS さん:
>
>ありがとうございます
>すみません・・・お忙しいところお手間をとらせてしまって・・・
>
>SSさんのを参考に、私なりに考えてみます
>
>本当に助かりました
>
>ありがとうございました

【66379】Re:テキストボックスのカーソル位置を取得
お礼  かな  - 10/8/31(火) 16:00 -

引用なし
パスワード
   ▼SS さん:

こんにちは・・・
いろいろとアドバイスありがとうございました

あれから、ながーい月日が経ってしまいました
いろいろと悪戦苦闘しながらやってみたのですが、いまいちうまくいかず、
考え方を変えて、

指定した桁数以上の時はその文字を削除する
といった感じのマクロになりました
結局妥協・・・も少しありますが、こんな感じです
参考までに・・・

Private Sub TextBox1_Change()

’10桁をこえて入力すると、11桁目の文字を削除してしまうというマクロです

Dim txt1
Dim txt2
txt1 = Split(TextBox1, vbCrLf)
For i = 0 To UBound(txt1, 1)
  If Len(txt1(i)) > 10 Then
   txt1(i) = Left(txt1(i), 10)
   
  End If
Next i
  For u = 0 To UBound(txt1, 1)
   If u = 0 Then
    txt2 = txt1(u)
   Else
    txt2 = txt2 & vbCrLf & txt1(u)
   End If
 Next u
 
 TextBox1.Text = txt2

End Sub

Private Sub UserForm_Initialize()
UserForm3.Caption = "test"
  With TextBox1
    .Value = ""
    .MultiLine = True
    .EnterKeyBehavior = True
    .SetFocus
  End With
End Sub


>こんにちは、前回の回答では誤解させてしまったみたいですが
>私は興味あるものに楽しんで回答していますので気にしないで下さい。
>それで不具合が気になっていたので確認するとCtrl+Enterの改行は
>vbLfになるようです。vbLfとvbCrLfの混在が問題だったようです。
>格好悪いですが以下の変換をすることでできました。
>  '文字数設定
>  n = 10
>  txt1 = TextBox1.Text
>  txt1 = Replace(txt1, vbCr, "")
>  txt1 = Replace(txt1, vbLf, vbCrLf)
>改行をvbLfだけでは上手くいきませんでしたが勘違いかもしれません。
>かなさんが完成させたものを紹介して頂けると私のスキルUPにも
>役立つと思いますので宜しくお願いします。
>
>>▼SS さん:
>>
>>ありがとうございます
>>すみません・・・お忙しいところお手間をとらせてしまって・・・
>>
>>SSさんのを参考に、私なりに考えてみます
>>
>>本当に助かりました
>>
>>ありがとうございました

2724 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free