![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
中を見ていただき、ありがとうございます。
Visual Basic 6.0 をWinXP SP3で使って、メモを作っています。
機能としては非常に単純で、書き込み用のテキストボックス(以下Text1とします)と記録用のテキストボックス(つまりLocked=Trueとして書き込めないようにしている:以下Text2とします)があって、(1)Text1にメモを書いてEnterを押せば、(2)その内容がText2に転写され、(3)Text1の内容は消える、というものです。
ところが、以下のプログラムによってこれを実装しようとしたところ、Text1からText2への転写はうまくいくものの、2回目以降はText1の1行目が自動的に改行された状態になってしまい、必ず2行目から文章を打たなくてはいけないようになってしまいます。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Text2.Text = Text2.Text & vbclrf & Text1.Text
Text1.Text = ""
End If
End Sub
使用する上では特に問題無いのですが、見た目が少し悪いので、この1行目の「自動改行」をキャンセルする方法をご存知の方がいらっしゃいましたら、ご教授くださいますようお願い致します。
No.13ベストアンサー
- 回答日時:
>ただ、このコードでは、半角文字を2つ打った瞬間にText1の内容がすべて消えてしまいますので、全角のメモにしか使えません(vbの処理が追いつかないぐらい早く連打すればいけますが)。
ですから、やはりText1へのvbCrLfをキャンセルしないといけないですね。本来テキストボックスに入力する前に、Text1.Text = "" のようにクリアして置くべきで
当然投稿されたコード以外の所でクリアされている物と思っていたのですが。
下記を試して見て下さい。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
If Text2.Text = "" Then
'1行目の書き込みの場合
Text2.Text = Text1.Text
Else
'2行目以降の書き込みの場合
Text2.Text = Text2.Text & vbCrLf & Text1.Text
End If
'ここではText1.Text 内の vbCrLf が消えません。
Text1.Text = ""
End If
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
'下記のようにして消すか
If KeyCode = 13 Then
Text1.Text = ""
End If
End Sub
又は、
Private Sub Text1_GotFocus()
'入力前に消すか
'本来は、 Text1.Text = "" ですが
If Text1.Text = vbCrLf Then
Text1.Text = ""
End If
End Sub
>ところで、もしかして「VBレスキュー花ちゃん」の花ちゃん様でしょうか。
そうです。
ご回答ありがとうございます。
>>ところで、もしかして「VBレスキュー花ちゃん」の花ちゃん様でしょうか。
>そうです。
そうでしたか。ここでお会いできるとは幸運です。
何年も、困ったときにはお世話になっています。
主に私は6.0を使っていますので、昔のものを残しておいていただいているのがとても助かります。
今後とも、できれば残しておいていただけますと、1ファンとしては嬉しいです。
>本来テキストボックスに入力する前に、Text1.Text = "" のようにクリアして置くべきで
ちょうどチャットのように、書き込みながら履歴を参照するということをしたかったので、Enterのタイミングで消すことを前提にしていました。
いずれにいたしましても、KeyUpイベントを受けて
If KeyCode = 13 Then Text1.Text = ""
とすることで解決いたしました。
ありがとうございました。
この場をお借りして
tissue001様、また、他の回答者の皆様にも心より御礼申し上げます。
ベストアンサーしか選べなくなっているため、解決方法を教えてくださったので、vbhanatyan様を選ばせていただきますが、あしからずご了承いただき、今後ともお知恵をお貸しいただけますようお願い申し上げます。
No.12
- 回答日時:
お騒がせいたしました。
今回、私が一番初めにe.Handled = Trueと回答した後に
No.6さんが
>End Sub の前に Keycode = 0 と入れてみたら?
>Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
>If KeyCode = 13 Then
>Text2.Text = Text2.Text & vbclrf & Text1.Text
>Text1.Text = ""
>End If
>Keycode = 0 '←位置を変えたほうが良いかも
>Text2.Text = mid(Text2.Text,3) '←乱暴な気がするけど・・
>End Sub
Keycode = 0 '←位置を変えたほうが良いかも は試しましたか?
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Keycode = 0 '←この位置にに変えてみて下さい。
Text2.Text = Text2.Text & vbclrf & Text1.Text
Text1.Text = ""
End If
Text2.Text = mid(Text2.Text,3) '←乱暴な気がするけど・・
End Sub
こうする事で、EnterをKeyDownからKeyUpまでをなかった事にしてくれるかもしれません。
なにぶんvb2008しかわかりません。
ご回答ありがとうございます。
こちらこそ、お騒がせしており、申し訳ございません。
どうやらVB6は、変なところはいい加減なのに、ここは融通が利かないようで、キャンセルできませんでした。簡単っぽくみえるのですが、以外に難問ですね。
No.11
- 回答日時:
Caryo_t さんごめんなさい。
ちょっと引けなくなったので...
>そもそも、下記コードで、Text1.Text に vbCrLf が入ると勘違いされているのが原因では。
>KeyDown イベントでは入力が確定していないので、Text1.Text には、
>vbCrLf が書き込まれていません。
>KeyUP イベントなら書き込まれますが。
vbcrlfが書き込まれるタイミングはわかりませんが、
質問内容の
> 以下のプログラムによってこれを実装しようとしたところ
つまりKeyUpまでを行っているんです。
ゆえに、質問者さんのText1にvbcrlfが書き込まれているんです。
質問者さんは、このText1に入るvbcrlfを取り消したいと言っているんです。
確かに1回目の実行時には、Text2は初めは空なので、1行目に改行は入るでしょう。
でも、それに対して困っているのではありません。
勿論、質問者さまは初めのあなたの回答に
>この短いサンプルコードにも、いくつも不足している部分があって、お恥ずかしいです。
>Text2の一番初めには、そのような条件設定が必要になるようですので、
>気をつけます。ありがとうございました。
と言っています。
つまり、こんな事も考えなくてはいけないのですね...って事なのです。
Text2に意図しない改行が入るという事を今回質問したのではないのです。
コメントありがとうございます。
また、お気遣いいただきありがとうございました。
ご指摘の通りですので、どうか収めていただけますようお願い致します。
お二人のコメントを通じ、Text1にvbCrLfが書き込まれるタイミングがKeyUp時であることが判りましたので、KeyUp時にText1の長さを調べて、それが2であったなら(つまり改行だけであったなら)Text1の内容を消すようにしてみました。
このコードでは、Text2の先頭の改行は消していませんが、これはvbhanatyan様のご回答をもとに対応しようと思います。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
If Text1.Text <> "" Then
Text2.Text = Text2.Text & vbCrLf & Text1.Text
Text1.Text = ""
End If
End If
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If Len(Text1.Text) = 2 Then Text1.Text = ""
End Sub
ただ、このコードでは、半角文字を2つ打った瞬間にText1の内容がすべて消えてしまいますので、全角のメモにしか使えません(vbの処理が追いつかないぐらい早く連打すればいけますが)。ですから、やはりText1へのvbCrLfをキャンセルしないといけないですね。
No.10
- 回答日時:
>> 2回目以降はText1の1行目が自動的に改行された状態になってしまい、
>> 必ず2行目から文章を打たなくてはいけないようになってしまいます。
>あなたは、どう捉えますか?
Text2.Text = Text2.Text & vbclrf & Text1.Text では
Text2.Text に何も書き込まれていない状態の時にvbCrLf & Text1.Text がかきこまれるので
改行する必要が無い状態で改行しているから先頭行が vbCrLf だけの空行ができるのです。
そもそも、下記コードで、Text1.Text に vbCrLf が入ると勘違いされているのが原因では。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Text2.Text = Text2.Text & vbclrf & Text1.Text
Text1.Text = ""
End If
End Sub
KeyDown イベントでは入力が確定していないので、Text1.Text には、vbCrLf が書き込まれて
いません。
KeyUP イベントなら書き込まれますが。
Form にテキストボックス2個貼り付けて下記コードを試して見て下さい。
Text1 に 1 2 3 a 個別にキー入力して見て下さい。
()
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 65 Then
Text2.Text = Text2.Text & vbCrLf & Text1.Text
Text1.Text = ""
End If
End Sub
この回答への補足
他の方へのお礼と一部重複いたします無礼をお許し下さい。
お二人のコメントを通じ、Text1にvbCrLfが書き込まれるタイミングがKeyUp時であることが判りましたので、KeyUp時にText1の長さを調べて、それが2であったなら(つまり改行だけであったなら)Text1の内容を消すようにしてみました。
このコードでは、Text2の先頭の改行は消していませんが、これはvbhanatyan様のご回答をもとに対応しようと思います。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
If Text1.Text <> "" Then
Text2.Text = Text2.Text & vbCrLf & Text1.Text
Text1.Text = ""
End If
End If
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If Len(Text1.Text) = 2 Then Text1.Text = ""
End Sub
ただ、このコードでは、半角文字を2つ打った瞬間にText1の内容がすべて消えてしまいますので、全角のメモにしか使えません(vbの処理が追いつかないぐらい早く連打すればいけますが)。ですから、やはりText1へのvbCrLfをキャンセルしないといけないですね。
ところで、もしかして「VBレスキュー花ちゃん」の花ちゃん様でしょうか。
そうであるならば、光栄です。昔からいつも大変お世話になっております。
コメントありがとうございます。
>Text2.Text = Text2.Text & vbclrf & Text1.Text では
>Text2.Text に何も書き込まれていない状態の時にvbCrLf & >Text1.Text がかきこまれるので
>改行する必要が無い状態で改行しているから先頭行が >vbCrLf だけの空行ができるのです。
これは知りませんでした。
ご教授いただいたコードを試してみましたところ、たしかにText1に「a」が取り残されたまま、123だけがText2に移りました。
これと同様にして、「改行」が取り残されたまま、Text1の内容がText2に移っているのですね。あとは改行を失くすだけですが、Text1.Text=""で改行が消えないのが不思議ですね…。
いや、よく考えると不思議でもないのでしょうか。もう少し考えてみます。
No.9
- 回答日時:
喧嘩しているつもりはないけど...
質問者さんの質問文
> 2回目以降はText1の1行目が自動的に改行された状態になってしまい、
> 必ず2行目から文章を打たなくてはいけないようになってしまいます。
> この1行目の「自動改行」をキャンセルする方法
あなたは、どう捉えますか?
私はText1に意図しない改行が入る事を防ぐ事は今回の質問者さんの質問だととらえます。
あなたは
> 質問者が困っているのは、Text2.Text の先頭行に空行(VbCrLf だけの)が入ってしまうと
> 言う事じゃないですか?
だと言う。
Text2の先頭行に空白が入っているという文は、どこにも出てきません。
私は恥をかきましたか?
どうでしょうか?
質問を整理していただき、ありがとうございます。
これも横レスのようになってしまうのですが、仰るとおり「Text1に改行が入る」のが私の困っている点です。
Text1とText2ではなく、MotoTxtとSakiTxtとしておけばよかったですね。すみません。
No.8
- 回答日時:
喧嘩しているつもりはないけど...
質問者さんの質問ぶん
> 2回目以降はText1の1行目が自動的に改行された状態になってしまい、
> 必ず2行目から文章を打たなくてはいけないようになってしまいます。
あなたは、どう捉えますか?
コメントありがとうございます。
私に対するご質問ではないので、なんだか横レスのようになってしまって恐縮ですが、私の困っておりますのは「Text1に改行が入ること」です。
誤解を招いておりますのは私の書き方のようですので、何卒穏便にお力をお貸しいただければと思います。
No.7
- 回答日時:
No.5
回答者:tissue001 回答日時:2011/01/26 11:52
よく試して書かないと恥をかくのは貴方ですよ。
>この回答は、質問者様がこまっているものとは違う種のものです。
元質問者が困っているのは、Text2.Text の先頭行に空行(VbCrLf だけの)が入ってしまうと
言う事じゃないですか?
元質問内容(Text1からText2への転写はうまくいくものの、2回目以降はText1の1行目が
自動的に改行された状態になってしまい...。)
勿論、それに対して答えた回答も間違っていませんよ。
No.6 で答えておられる
if Text2.Text = "" then
Text2.Text = Text1.Text
else
Text2.Text = Text2.Text & vbclrf & Text1.Text
end if
と同じ事です。
ご回答、ありがとうございます。
少し離席している間に、多くの書き込みがあり、びっくりいたしました。
私の書き方が誤解を招いてしまっているようです。
Text2にも、確かに不必要な改行が入ってしまうかもしれませんが、今困っておりますのは、Text1に入る改行の方です。
つまり、Text1に文字を打って行き、その文字がEnterであれば、Text2にText1の内容をすべて移すということをしているのですが、Enterはこの「転写のきっかけ」であると同時に、Text1の中では「改行」の意味も持つため、Text1では常に1行目が改行されているようなのです。
ご回答に感謝いたしますとともに、わかりにくい質問文、そして不完全なコードで誤解を招いてしまいましたことをお詫びいたします。
No.6
- 回答日時:
End Sub の前に Keycode = 0 と入れてみたら?
個人的にはText2.Textのいちばん最初に改行コードが入ってしまう方が気になるけど
と思ったらレスがついてるので、
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Text2.Text = Text2.Text & vbclrf & Text1.Text
Text1.Text = ""
End If
Keycode = 0 '←位置を変えたほうが良いかも
Text2.Text = mid(Text2.Text,3) '←乱暴な気がするけど・・
End Sub
とかでは?
No4さんの方向だと
if Text2.Text = "" then
Text2.Text = Text1.Text
else
Text2.Text = Text2.Text & vbclrf & Text1.Text
end if
ということを言いたかったのでは?
ご回答ありがとうございます。
なるほど、KeyCodeを0にしてキャンセルするのですね。
結果としてはうまくいかなかったのですが、たいへんさんこうになりました。ありがとうございます。
ところで、最後でMidを使うと奇妙な動きをしますね。順を追って理解すれば解るのですが、面白いと思いました。
No.5
- 回答日時:
> Text2.Text="" の時に下記のコードを実行すると
>>Text2.Text = Text2.Text & vbclrf & Text1.Text
>空のText2.Text に vbclrf & Text1.Text を書き込む事になり
>先頭行が改行だけの空行ができるのです。
これは間違いです。
Text2.TextはText2.Text & vbclrf & Text1.Text
が入ります。
>従って、
>If Text2.Text="" Then
>Text2.Text = Text1.Text
>End If
これは間違いなので、従わないでください。
>この種の事は、vbclrf を前に付けるか、後ろにつけるかによって
>同様の処理をする必要があります。
この回答は、質問者様がこまっているものとは違う種のものです。
ご指摘、ありがとうございます。
tissue001さんの仰るとおりした。テキストの処理は、ケアレスミスが多いので、大変参考になりました。ありがとうございました。
No.4
- 回答日時:
Text2.Text="" の時に下記のコードを実行すると
>Text2.Text = Text2.Text & vbclrf & Text1.Text
空のText2.Text に vbclrf & Text1.Text を書き込む事になり
先頭行が改行だけの空行ができるのです。
従って、
If Text2.Text="" Then
Text2.Text = Text1.Text
End If
のように条件設定をする必要があります。
この種の事は、vbclrf を前に付けるか、後ろにつけるかによって
同様の処理をする必要があります。
ご回答ありがとうございます。
この短いサンプルコードにも、いくつも不足している部分があって、お恥ずかしいです。
Text2の一番初めには、そのような条件設定が必要になるようですので、気をつけます。ありがとうございました。
追伸 もしかして「VBレスキュー花ちゃんの」花ちゃん様でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) フレーム内のオプションボタンの選択結果をセルに書き出したい。 図のような預金種目というフレームにオプ 2 2022/07/29 11:12
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
LaTeX: captionの中で改行した...
-
改行について
-
ソースコードの1行が長いとき...
-
【VBA】エクセルで最後の不要な...
-
texのchapterが改行される
-
COBOLの改行
-
エスケープ文字の復帰(¥r)と...
-
C#の改行について
-
バイナリファイルに改行コード...
-
改行を読み飛ばす
-
VB6 TextBoxの先頭が自動改行...
-
POSTで改行コードを受け渡すには
-
文字列型変数に1024を超えた文...
-
ExcelVBAでメールを作成してメ...
-
ifの中に改行とコメントを書い...
-
コンボボックスの項目中に改行を
-
fgetsとsscanf
-
ファイルから読み取った改行文...
-
テキストファイルから改行コー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
LaTeX: captionの中で改行した...
-
ソースコードの1行が長いとき...
-
改行について
-
エスケープ文字の復帰(¥r)と...
-
texのchapterが改行される
-
C# DataGridViewのセルを改行禁...
-
最終行の改行について
-
テキストボックス行の桁数を制...
-
【VBA】エクセルで最後の不要な...
-
秀丸の正規表現で複数行にわた...
-
C++で空Enterの入力を判...
-
jsp 改行コードで改行させて表...
-
JavaDoc コメントの改行について
-
C++でのCRLFについて
-
C#の改行について
-
COBOLの改行
-
ファイルから読み取った改行文...
-
1行ごとに取得して、その改行...
-
文字列型変数に1024を超えた文...
おすすめ情報