Microsoft Access 掲示板

フォーム内容の転記について

14 コメント
views
4 フォロー

F_test に、非連結のテキストボックスがあります。

txt子テキスト_1
txt子テキスト_2
txt子テキスト_3
txt子テキスト_4
txt子テキスト_5

この非連結の値を、

F_test2のtxtテキスト_1へ転記したいのです。


ub 転記()

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i) & vbNewLine

Next i
End Sub

上記のコードを記載しました。

F_test2のtxtテキスト_1には、

C005のみが表示さます。

改行しても上手くできないです。

このコードは、そもそもダメなのでしょうか?
お手数ですが、ご教示を お願いします画像1

えいじ
作成: 2023/04/26 (水) 22:38:31
通報 ...
1
hiroton 2023/04/27 (木) 08:47:04 8cee2@f966d

プログラミングにおける

x = 1

x = x + 1

の違いわかりますか?

2
えいじ 2023/04/27 (木) 21:24:56

回答ありがとうございます。

x= 1 は、そのままで
x=x+1は、x=2だと思います。
まちがっていますか?

3
hiroton 2023/04/28 (金) 08:59:10 72ebf@f966d

まぁそうですね。より正確には「x = x + 1」は「xに1を加えた値でxを上書きする」となります

では、

x = 1
x = 2
x = 3
x = 4
x = 5

Debug.Print x

と、

x = x + 1
x = x + 2
x = x + 3
x = x + 4
x = x + 5

Debug.Print x

ではどうなるでしょうか?


質問のコードを見直してみましょう

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i) & vbNewLine

Next i

これは、実際にコードが実行される場合

(txtテキスト_1) = "C001" & vbNewLine
(txtテキスト_1) = "C002" & vbNewLine
(txtテキスト_1) = "C003" & vbNewLine
(txtテキスト_1) = "C004" & vbNewLine
(txtテキスト_1) = "C005" & vbNewLine

が実行されることになります。これでは一番最後の「"C005" & vbNewLineで上書きする」が最終結果として残るのみです
追記(元の値を残した上でさらに書き込む)」には、「(元の値)(転記する値) & vbNewLineを連結して上書きする」ようにする必要があります

4
えいじ 2023/04/29 (土) 10:43:08

回答ありがとうございます。
元の値とは、C001で、転記する値とは、C002で、この2つを連結して上書きするということでしょうか?

5
hiroton 2023/04/29 (土) 23:20:20 c05f8@2ee8f

「(元の値)」や「(転記する値)」は説明のための抽象的な内容であり、実際にはコードの実行に合わせて適宜置き換えられますので、特別に「C001」や「C002」と言えるものではありません。(特定の場合にはそうなることもあるでしょう)

改めて説明しなおしますが、

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)

Next i

は、コードの実行時には

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)
7
hiroton 2023/04/29 (土) 23:51:23 e5550@2ee8f >> 5

投稿が中途半端になってしまったので>> 5は無視してください
(hatenaさんへ、削除お願いします)

6
hiroton 2023/04/29 (土) 23:50:11 e5550@2ee8f

(中途半端に投稿されてしまったので再投稿します)


「(元の値)」や「(転記する値)」は説明のための抽象的な内容であり、実際にはコードの実行に合わせて適宜置き換えられますので、特別に「C001」や「C002」と言えるものではありません。(特定の場合にはそうなることもあるでしょう)

改めて説明しなおしますが、

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)

Next i

は、コード実行時には

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 1)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 2)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 3)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 4)
Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

が実行されます。すでに述べたようにこの結果は

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

だけしか意味を成しません
質問の(画像にあるような)結果を出したいのであれば

(転記先) = (追記の形になる式) '//(元の値)=>""、(転記する値)=>"C001"、転記先=>"C001"
(転記先) = (追記の形になる式) '//(元の値)=>"C001"、(転記する値)=>"C002"、転記先=>"C001C002"
(転記先) = (追記の形になる式) '//(元の値)=>"C001C002"、(転記する値)=>"C003"、転記先=>"C001C002C003"
(転記先) = (追記の形になる式) '//(元の値)=>"C001C002C003"、(転記する値)=>"C004"、転記先=>"C001C002C003C004"
(転記先) = (追記の形になる式) '//(元の値)=>"C001C002C003C004"、(転記する値)=>"C005"、転記先=>"C001C002C003C004C005"

このような処理になる記述が必要です

8
えいじ 2023/05/02 (火) 10:15:48
Sub 転記()


memo = txt子テキスト_1 & vbNewLine _
       & txt子テキスト_2 & vbNewLine _
       & txt子テキスト_3 & vbNewLine _
       & txt子テキスト_4 & vbNewLine _
       & txt子テキスト_5 & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo

End Sub

教えていただいた、処理方法と違うかもしれませんが、
実現することは、一応できます。

ただ、テキストボックスの最後に数字が連続しているので、ループまたは、カウントアップで出来ないかなと思いました。

https://zawazawa.jp/ms-access/topic/876

このトピで、hatena様から、改行コードを入れることで、転記ができたので、安直に、転記できると思いました。

ただ、hiroton様が、初めにカウントアップのことを記載したということは、カウントアップでコードを短くできるのでしょうか?

9

現状のコードをhirotonさんの回答あった「(元の値)と(転記する値) & vbNewLineを連結して上書きする」というヒントを元に書き換えると、下記になります。

Sub 転記()
Dim memo As String
memo = ""

memo = memo  & txt子テキスト_1 & vbNewLine
memo = memo  & txt子テキスト_2 & vbNewLine
memo = memo  & txt子テキスト_3 & vbNewLine
memo = memo  & txt子テキスト_4 & vbNewLine
memo = memo  & txt子テキスト_5 & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo

End Sub

これを質問の最初のコードのForループと同じ考え方で書き換えればいいでしょう。

10
えいじ 2023/05/05 (金) 10:32:00

Sub 転記()
Dim memo As String
memo = ""
For i = 1 To 5
memo = memo  &  Me.Controls("txt子テキスト_" & i) & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo
Next i
End Sub

こういうことだったのですね。

hiroton様
hatena様

ご丁寧にありがとうございました。

11

そのコードでも結果は同じになりますが、memoをテキストボックスの代入するのは最後に1回のみでいいので、ループ内で繰り返すのは無駄ですね。

Sub 転記()
    Dim memo As String
    memo = ""
    For i = 1 To 5
        memo = memo  &  Me.Controls("txt子テキスト_" & i) & vbNewLine
    Next i
    Forms![F_test2]![txtテキスト_1] = memo
End Sub
12
えいじ 2023/05/07 (日) 22:01:45

hatena様

ご丁寧にありがとうございました。

13
hiroton 2023/05/08 (月) 11:39:39 8b032@f966d

ループ処理はループ内のコードをそのまま繰り返します

hatenaさんも指摘していることですが、ループの最後で上書きするような処理はループ内に含める必要は薄いです。質問のコードも

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)

Next i

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

と何ら変わらないので意味のない(≒ダメな)コードです。hirotonの伝わらない回答もそんな感じのことを言っていました


ループ処理を使うときは「イニシャル部」「メイン部」「エンド部」(前処理、メイン処理、後処理)を考えるようにすると良いです
「最終的にやりたいこと」と「ループ処理させたら楽そうな部分」を明確にすることですね

以下、いくつか同様のことを成すコードを記述してみます

Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine & Me.txt子テキスト_2 & vbNewLine & Me.txt子テキスト_3 & vbNewLine & Me.txt子テキスト_4 & vbNewLine & Me.txt子テキスト_5 & vbNewLine &
Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_2 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_3 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_4 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_5 & vbNewLine &
Dim memo As String
memo = Me.txt子テキスト_1 & vbNewLine
memo = memo & Me.txt子テキスト_2 & vbNewLine
memo = memo & Me.txt子テキスト_3 & vbNewLine
memo = memo & Me.txt子テキスト_4 & vbNewLine
memo = memo & Me.txt子テキスト_5 & vbNewLine
Forms![F_test2]![txtテキスト_1] = memo
Dim i As Long

Forms![F_test2]![txtテキスト_1] = ""
For i = 1 to 5
  Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Dim i As Long

Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine
For i = 2 to 5
  Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Dim i As Long
Dim memo As String

memo = Me.txt子テキスト_1 & vbNewLine
For i = 2 to 5
  memo = memo & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Forms![F_test2]![txtテキスト_1] = memo

無駄な記述はしないというのがプログラミングの基本ではありますが、

memo = ""
memo = memo  & txt子テキスト_1 & vbNewLine  '//ここの「= memo」のmemoは無駄だけど
memo = memo  & txt子テキスト_2 & vbNewLine


'//このような記述は冗長に思える
memo = txt子テキスト_1 & vbNewLine
For i = 2 To 5
  memo = memo  & Me.Controls("txt子テキスト_") & i & vbNewLine
Next

'//無駄な処理を含むコードでもこっちのほうが見やすい
memo = ""  
For i = 1 To 5
  memo = memo  & Me.Controls("txt子テキスト_") & i & vbNewLine
Next

「目的が達成されない」や「エラーが出る」などの不正解は簡単な話ですが、善し悪しを語るのはなかなかに難しい話ですね

14
えいじ 2023/05/18 (木) 21:51:04

hiroton様
返信が遅れて申し訳ありません。
ご丁寧にありがとうございました。