はじめまして。
いきなりですが質問があります。
Visual Studio 6.0で、テキストボックスに入力した文字をボタンを押すことにより他のテキストボックスに次々表示させるプログラムを作成しております。その時の条件として、
・入力された文に”。”がある場合は”。”以降を改行して次の行に表示
・20文字を超える文は20文字目以降を改行して次の行に表示
・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表 示
とあります。今は改行のところをやっておりまして、”。”を判断させて改行させたいのですがまったくできない状況です。
言葉足らずで申し訳ありませんが、この質問にお答えいただければ光栄です。
よろしくお願いいたします。
>とあります。今は改行のところをやっておりまして、”。”を判断させて改行させたいのですがまったくできない状況です。
Replace関数を用いて、
"。"を改行文字列(vbCrLF)に置換すると
ぐちゃぐちゃ細かいことを考えなくても簡単だよね?
まぁ、
・20文字を超える文は20文字目以降を改行して次の行に表示
などはまた別途考慮すればよいと思うけれど。
えーと、例えば
「012345678901234567890。。。」
とか入力された場合は
「01234567890123456789<改行>0。<改行>。<改行>。<改行>」
と、"素直に"なるわけですか?
Replace$()を使えばできる…かな。
何か弊害があれば、Mid$()でゴリゴリ書くといいと思います。
…ためしに動きそうなのを作ってみました。
Function foo(ByVal Text As String) As String
'文字列連結を大量に使っているので遅いです
Dim spl As Collection '1行ごとに格納するコレクション
Dim v As Variant '一般変数
Dim i As Long '一般変数
Dim st As String '一般変数
'1 "。"を"。"+vbNewLineにする
Text = Replace$(Text, "。", "。" & vbCrLf)
'2 20文字連続して改行が存在しない場合は、強制的に改行をいれる
Set spl = New Collection
For Each v In Split(Text, vbCrLf)
If Len(v) <> 0 Then '!空行は抜く
For i = 1 To Len(v) Step 20
st = Mid$(v, i, 20) '20文字ずつ抜き出す
If Len(st) > 0 Then
'抜き出した文字列が空以外の場合は加える
spl.Add st
End If
Next
End If
Next
'最後の10行を戻り値にする
i = spl.Count - 10
If i < 1 Then i = 1
For i = i To spl.Count - 1
foo = foo & spl(i) & vbCrLf
Next
foo = foo & spl(spl.Count)
End Function
※動作保障はしません。
…出遅れた(orz
ものすごくすばやい対応に驚きと感謝の気持ちでいっぱいです。
一度試してみます。
ガッさん。やってみましたが動きませんでした。
ちなみにボタンを押した時にその作業がおこなわれるので、
Private Sub Command1_Click()
End Sub
この中に入れればいいわけですか?
初心者過ぎてもうしわけないです↓
横からですが・・・
動かないとはどういうふうに動かないのでしょう?
コードは提示されているのですから、ステップ実行したりしてみましたか?
表示するテキストボックスのMultiLineプロパティはTrueになっていますか?
ボタンクリックで動作させるのであれば
Private Sub Command1_Click()
End Sub
の中に記述すればいいと思います。がんばってくださいね(^-^)
ぶぶさんありがとうございます☆
ガっさんのソースを
Private Sub Command1_Click()
End Sub
に入れてみたんですが、End Sub がありません みたいなことを言われてしまいます><で、指定の場所にEnd Sub 入れたら、End Functionがありませんといわれます><;あるんですけどないことになるんです。入れ方がまずいんだと思いますが、初心者なものでして、まったくわかりません。
fooという文字列を返すファンクションなので、
Private Sub Command1_Click()
テキストボックス.Text = foo(テキストボックス.Text)
End Sub
こういう使い方でいいと思います。
matsuさんありがとうございます。
実行してみたとこ、”。”で改行され、20文字で改行されます。
しかし、
・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表示
ができませんでした><。あと追加で、
・前に入力した文が20文字に達してない場合は次の文はその続きから書く
だそうです。つまり、5文字先に書いて表示させてあったら、次の文字は6文字目から20文字目まで表示。あまったら次の行へ。といった具合です><
わかるかたいらっしゃいましたらよろしくお願いいたします。
今までの応用なんですから少しはご自分で努力されたらいかがですか?
もし、努力した結果で分からない事があれば、何がどう分からないのかを明確にしましょう。
そうすれば求める回答が早く得られると思いますし、書いているうちに自分で気付くことがあるかもしれません。
質問の仕方のテクニックもついでに身に付けましょう。
はい。ごもっともです。いろいろ調べながら手探りでやっております。それでもわからずここに書き込んだのですが、虫が良すぎなのはわかっています。あの後も考えて試してみたのですが、どうしてもわかりません。もしよろしければヒントでいいので教えてもらえないでしょうか??><
> いろいろ調べながら手探りでやっております。
> それでもわからずここに書き込んだのですが、虫が良すぎなのはわかっています。
…"それでもかかわらず"?……気にしないで置こう…
> あの後も考えて試してみたのですが、どうしてもわかりません。
(あの後)どのように試して、何が分からないのですか?
事実を伝えない限り、何も伝わりませんー
> もしよろしければヒントでいいので教えてもらえないでしょうか??><
ヒントは私のコード。あれ以上実装したら完成してしまいます。
ですが、最後に追加された「前に入力した文が20文字に達してない場合は次の文はその続きから書く」
に関しては、結構いじくらないといけないと思います。
こういう場合は、メソッドで機能を作るのではなく、クラスで機能を作ってください。
そうすれば、"前"という状態が把握しやすくなりますから。
私がコード載せたのが悪かったなぁ…
(一部勘違いして「10行越えたら最後の10行を出力」していますが(orz
※昨日、学校でPrologの演習させられた…
今分かるのは逐次型言語って最高、ということ(ororz
長文失礼しました
ガッさん、長文ありがとうございます。><
今わからないのは、
・前に入力した文が20文字に達してない場合は次の文はその続きから書く
のところで、あとのところは自力で9割がた完成しました。皆様のおかげです。
なんとか頑張ってみます。
今必死に作業中です。こんな感じで作ってみましたら、エラーはでないんですけど動作がおかしいモノが出来上がってしまいました><。
Private Sub Command1_Click()
Dim strKAKU As String
Dim lngKAKU2 As Long
Dim strCHA As String
Dim lngP As Long
Dim lngK As Long
Dim lngMORE As Long
Dim lngAHU As Long
'エラー表示
If Me.Text1.Text = "" Then
MsgBox "文字を入力してください"
Me.Text1.SetFocus
End If
'半角全角を判断する
strBIT = StrConv(strBIT, vbFromUnicode)
strBIT = LenB(strBIT)
If strBIT = 1 Then
LngHZ = 1
Else
LngHZ = 2
End If
'”。”があったら改行させる
Text1.Text = Replace$(Text1.Text, "。", "。" & vbCrLf)
'20文字すぎたら改行させる
For P = 1 To Len(Text1.Text) Step 20
Text2.SelText = Mid$(Text1.Text, P, 20) & vbCrLf
Next P
'改行回数の計算
K = KAI + KAI2
'あふれ処理
If K >= 10 Then
AHU = K - 10
For MORE = 0 To AHU
KAKU = Me.Text2.Text
KAKU2 = InStr(1, KAKU, Chr(13), 1)
KAKU = Mid(KAKU, KAKU2 + 1)
KAI = KAI - 1
Me.Text2.Text = Replace(KAKU, KAKU, "")
CHA = KAKU
Me.Text2.Text = Me.Text2.Text & CHA
Next MORE
End If
Me.Text1.Text = ""
Me.Label4.Caption = ""
Me.Label5.Caption = ""
KAI = KAI + KAI2
KAI2 = 0
End Sub
-----------------------------------------------------------
Private Sub Command2_Click()
End
End Sub
-----------------------------------------------------------
Private Sub Command3_Click()
'すべてのテキストボックスの内容をクリアする
Dim ctrLoop As Control
For Each ctrLoop In Me.Controls
If TypeOf ctrLoop Is TextBox Then
ctrLoop.Text = ""
End If
Next
End Sub
-----------------------------------------------------------
Private Sub Text1_Change()
Dim strBIT As String
Me.Label4.Caption = Len(Me.Text1.Text)
strBIT = StrConv(Me.Text1.Text, vbFromUnicode)
Me.Label5.Caption = LenB(strBIT)
End Sub
無駄な処理、謎な処理、かなりボロクソ言われて直しています。
そしていまだに
・前に入力した文が20文字に達してない場合は次の文はその続きから書く
はできていません。どう直せばいいかわかる方いらっしゃいませんか??><。
うーん…やっぱり下手に載せたのが悪かったかも
> どう直せばいいかわかる方いらっしゃいませんか??><。
それはもー、仕様書とにらめっこしてください ('A`)
…目先真っ暗なのに当てずっぽうにコーディングしているわけではないですよね…
> 前に入力した文が20文字に達してない場合は次の文はその続きから書く
前にも書きましたが、「前」という状態は「何かを記憶しておく部分が必要」になります。
(ちょうど今"前にも書いた"事を思い出すために上にスクロールしたように)
メソッド内部で状態を保持するのはstaticステートメントで実現することができます。
例)
sub foo()
static i as long
i=i+1
msgbox i
end sub
※重複しますが、このような内部状態で動作が変わる機能は
メソッドで作るのではなくてクラスとして作ったほうがいいと思います。
>・前に入力した文が20文字に達してない場合は次の文はその続きから書く
>はできていません。どう直せばいいかわかる方いらっしゃいませんか??><。
最後の状態を保存する方法もありますが、表示用テキストボックスの最終行の
文字数をカウントしても判断できると思います。
ガッさんごめんなさい。今回はじめてVBをやってます。本当の初心者で教科書、参考書、ネット、あらゆるものを駆使して頑張っています。
なのでこのサイトの初心者掲示板に書き込みましたm( )m
matsuさんありがとうございます。どちらかというと今matsuさんの方法でやろうとしています。なかなかうまくいきませんが頑張ります。
最終行の文字数をカウントする方法でやるならば
Instrrev関数、Len関数調べてみてください。
皆さんにいろいろ意見いただきまことに感謝しています。
すみませんがまた質問がありまして書き込みました。
まず文字を格納し、その中から指定の文字数分だけ文字を別の所に格納し、残りの余った文字をまた元の場所に戻すためにはどうすればいいんでしょうか??
「あいうえおかきく」をAに格納
その中から前5文字だけをBに格納
残った「かきく」またAに格納
といった具合なのですが、どのようにすればよいのでしょうか?それとも、Bに格納された文字以外はAに残った状態なのでしょうか?
ご教授よろしくお願いしますm( )m
A ="あいうえおかきく"
B = right( A,5)
A = left(A, 3)
調べてもわからないことだらけで質問させていただいてるのですが、質問してはいけませんか??課題すべての完全な答えを聞くのは虫が良すぎると思いました。しかし今回のはやり方を聞いただけなので他の質問されてる皆様と同じではないでしょうか?m( )mもちろん自分でやってます。それでこれはどうするんだろうと思い、調べてわからなかったことを質問させていただきました。最初の方の書き込みは完全に答えを聞いていて虫が良すぎると反省しています。
「どのようにすればよいのでしょうか?」ではなく、
「〜のようにしたけどうまくいきませんでした。」のように
自分のやったことを書かないと、丸投げと思われても仕方ないですよ。
課題は自分でやりましょう。さんが言いたかったことはそういうことだと思います。
>調べてもわからないことだらけ
と新人Aさんは言われていますが
>A ="あいうえおかきく"
>B = right( A,5)
>A = left(A, 3)
はそれほど難しいことでしょうか?
>教科書、参考書、ネット、あらゆるものを駆使して頑張っています。
残念ですが、その努力が見えないです。
アドバイス
求める処理を一回で行おうとするから「はまる」のです。
処理を細分化して、一つ一つ処理していけば
新人Aさんの求める処理は何とかなります。
ローマの道も一歩から、です。
頑張って!!
たとえば、検索するときのキーとして
今回の例では「vb 文字列 切り取る」をキーワードに検索すると
http://www.google.co.jp/search?hl=ja&q=vb+%E6%96%87%E5%AD%97%E5%88%97%E3%80%80%E5%88%87%E3%82%8A%E5%8F%96%E3%82%8B&lr=
となります。すると、結構ヒントになることが載っているのでは?
その上で、どこがわからないか明確にしていくと・・・
答えるほうも答えやすくなります。どこで悩んでいるのかわかるからです。
がんばってくださいね(^-^)
やさしさと言うかなんと言うか(-_-;)
レスが多くなる前に・・・。
Private Sub Command1_Click()
Dim Moji As String
Dim lCnt As Long
Dim str As String
Dim lStr As Long
Text1.Text = ""
Moji = "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。"
For lCnt = 1 To Len(Moji)
If Mid$(Moji, lCnt, 1) = "。" Then
str = Mid$(Moji, lCnt, 1) & vbCrLf
Else
lStr = lStr + 1
str = Mid$(Moji, lCnt, 1)
If lStr = 10 Then
str = str & vbCrLf
lStr = 0
End If
End If
Text1.Text = Text1.Text & str
Next
End Sub
>・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表 示
抜けていたので訂正・・・(-_-;)
Private Sub Command1_Click()
Dim Moji As String
Dim lCnt As Long
Dim str As String
Dim lStr As Long
Dim lCrLf As Long
Dim strs() As String
Dim blnCrlf As Boolean
Text1.Text = ""
Text2.Text = ""
Moji = "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
"あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。"
ReDim strs(0)
lCrLf = 0
For lCnt = 1 To Len(Moji)
If Mid$(Moji, lCnt, 1) = "。" Then
str = Mid$(Moji, lCnt, 1) & vbCrLf
lStr = 0
ReDim Preserve strs(UBound(strs) + 1)
blnCrlf = True
Else
lStr = lStr + 1
str = Mid$(Moji, lCnt, 1)
blnCrlf = False
If lStr = 10 Then
str = str & vbCrLf
lStr = 0
ReDim Preserve strs(UBound(strs) + 1)
blnCrlf = True
End If
End If
strs(lCrLf) = strs(lCrLf) & str
If blnCrlf Then
Text2.Text = Text2.Text & strs(lCrLf)
lCrLf = lCrLf + 1
End If
Next
For lCnt = (UBound(strs) - 10) To UBound(strs)
Text1.Text = Text1.Text & strs(lCnt)
Next
End Sub
やっと完成することができました。
これも皆様のおかげです。
ありがとうございました。
これからもっともっと精進したいと思います。
・・・。
| ツイート |
|