前提・実現したいこと
データをA8~A17セルに入力できるようにしている。
上から順に入力する決まりとし、データの文字数も固定。
入力したデータをA2セルに表示させたい。
A8のみ入力されている場合。
A9まで入力されている場合と入力されたセルの数に応じて見栄えよく配置したい。
また、データとデータの間には、”、”を付けたい。
データ入力後、マクロを実行するとA2セルに上記イメージを表示させたい。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Sub データ表示() Range("A2").Formula = "=A8&CHAR(10)&A9&CHAR(10)&A10&CHAR(10)&A11&CHAR(10)&A12&CHAR(10)&A13&CHAR(10)&A14&CHAR(10)&A15&CHAR(10)&A16&CHAR(10)&A17" End Sub
試したこと
CHAR(10)を使って改行することは試しましたが、思う表示方法に近づけるにはどうしたらいいのか悩んでいます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
考え方としては、まずはA8~A17セルに入っているデータの個数を計算します。
このデータの個数をnとすると、横に並べられるデータの数cは、「見栄えよく配置したい」というルールによると、
nが1~8の場合:(n - 1) \ 2 + 1 '/でないことに注意
nが9の場合:3
nが10の場合:4
となります。
後は、A8のセルからA17セルまで一個ずつセル内の文字を結合していきます。
値でも式でも生成可能ですが、例が式(Formula)でやっていますので、これにならいます。
VBA
1 Dim n As Integer 'データ個数 2 Dim c As Integer '横に並べられるデータの数 3 Dim i As Integer 4 Dim ret As String 5 Dim cel As String 6 7 n = WorksheetFunction.CountIf(Range("A8:A17"), "<>") 8 9 If n <= 0 Then 10 Exit Sub 11 ElseIf n <= 8 Then 12 c = (n - 1) \ 2 + 1 '/でないことに注意 13 ElseIf n = 9 Then 14 c = 3 15 ElseIf n = 10 Then 16 c = 4 17 Else 18 Exit Sub 19 End If 20 21 ret = "=" 22 For i = 1 To n 23 cel = "A" & CStr(7 + i) 24 ret = ret & cel 25 If i < n Then 26 ret = ret & "&" 27 If i Mod c = 0 Then 28 ret = ret & "CHAR(10)" 29 Else 30 ret = ret & """、""" 31 End If 32 ret = ret & "&" 33 End If 34 Next 35 36 Range("A2").Formula = ret
投稿2020/04/14 07:11
編集2020/04/14 07:24総合スコア772
0
ベストアンサー
ベタな書き方だとこんな感じでしょうか。
VBA
1Sub test1() 2 Dim s As String 3 Dim cnt As Long 4 cnt = Cells(Rows.Count, 1).End(xlUp).Row - 8 + 1 5 Select Case cnt 6 Case 1: s = Range("A8") 7 Case 2: s = Range("A8") & vbCrLf & Range("A9") 8 Case 3: s = Join2(Range("A8:A9")) & vbCrLf & Range("A10") 9 Case 4: s = Join2(Range("A8:A9")) & vbCrLf & Join2(Range("A10:A11")) 10 Case 5: s = Join2(Range("A8:A10")) & vbCrLf & Join2(Range("A11:A12")) 11 Case 6: s = Join2(Range("A8:A10")) & vbCrLf & Join2(Range("A11:A13")) 12 Case 7: s = Join2(Range("A8:A11")) & vbCrLf & Join2(Range("A12:A14")) 13 Case 8: s = Join2(Range("A8:A11")) & vbCrLf & Join2(Range("A12:A15")) 14 Case 9: s = Join2(Range("A8:A10")) & vbCrLf & Join2(Range("A11:A13")) & vbCrLf & Join2(Range("A14:A16")) 15 Case 10: s = Join2(Range("A8:A11")) & vbCrLf & Join2(Range("A12:A15")) & vbCrLf & Join2(Range("A16:A17")) 16 End Select 17 Range("A2").Value = s 18End Sub 19 20Function Join2(r As Range) As String 21 Join2 = Join(WorksheetFunction.Transpose(r), "、") 22End Function
ちょっと凝った書き方だとこんなのとか。
VBA
1Sub test2() 2 Dim r() As Variant 3 Dim setting() As Variant 4 Dim s As String 5 Dim r1, r2, cnt As Long 6 7 setting = Array(Array(1, 1, 1), _ 8 Array(2, 1, 1, 2, 2), _ 9 Array(2, 1, 2, 3, 3), _ 10 Array(2, 1, 2, 3, 4), _ 11 Array(2, 1, 3, 4, 5), _ 12 Array(2, 1, 3, 4, 6), _ 13 Array(2, 1, 4, 5, 7), _ 14 Array(2, 1, 4, 5, 8), _ 15 Array(3, 1, 3, 4, 6, 7, 9), _ 16 Array(3, 1, 4, 5, 8, 9, 10)) 17 18 cnt = Cells(Rows.Count, 1).End(xlUp).Row - 8 + 1 19 r = WorksheetFunction.Transpose(Range("A8:A17")) 20 For i = 1 To setting(cnt - 1)(0) * 2 - 1 Step 2 21 r1 = setting(cnt - 1)(i) 22 r2 = setting(cnt - 1)(i + 1) 23 For j = r1 To r2 24 s = s & r(j) 25 If j <> r2 Then s = s & "、" 26 Next 27 s = s & vbCrLf 28 Next 29 Range("A2").Value = Left(s, Len(s) - 1) 30End Sub
ご要望のコード。
"シート名"のところは適宜変更してください。
VBA
1Sub test1() 2 Dim s As String 3 Dim cnt As Long 4 With Worksheets("シート名") 5 cnt = .Cells(Rows.Count, 1).End(xlUp).Row - 8 + 1 6 Select Case cnt 7 Case 1: s = .Range("A8") 8 Case 2: s = .Range("A8") & vbCrLf & .Range("A9") 9 Case 3: s = Join2(.Range("A8:A9")) & vbCrLf & .Range("A10") 10 Case 4: s = Join2(.Range("A8:A9")) & vbCrLf & Join2(.Range("A10:A11")) 11 Case 5: s = Join2(.Range("A8:A10")) & vbCrLf & Join2(.Range("A11:A12")) 12 Case 6: s = Join2(.Range("A8:A10")) & vbCrLf & Join2(.Range("A11:A13")) 13 Case 7: s = Join2(.Range("A8:A11")) & vbCrLf & Join2(.Range("A12:A14")) 14 Case 8: s = Join2(.Range("A8:A11")) & vbCrLf & Join2(.Range("A12:A15")) 15 Case 9: s = Join2(.Range("A8:A10")) & vbCrLf & Join2(.Range("A11:A13")) & vbCrLf & Join2(.Range("A14:A16")) 16 Case 10: s = Join2(.Range("A8:A11")) & vbCrLf & Join2(.Range("A12:A15")) & vbCrLf & Join2(.Range("A16:A17")) 17 End Select 18 End With 19 Range("A2").Value = s 20End Sub 21 22Function Join2(r As Range) As String 23 Join2 = Join(WorksheetFunction.Transpose(r), "、") 24End Function 25
投稿2020/04/14 07:03
編集2020/04/16 04:34総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/16 04:29
2020/04/16 04:35
2020/04/24 07:11
2020/04/24 10:13
2020/04/27 02:31
2020/04/27 06:52
2020/04/27 07:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/16 01:47
2020/04/16 02:38 編集