Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2013)
シートのセルを結合して、別シートにコピー
投稿日時: 22/09/04 03:37:32
投稿者: tomisuke

A列に「〇」が付いている行のB列のセル内容を別シートにセルごとに改行してコピーしたいです。
  A列 | B列
  〇   あいう
      かきく
  〇   さしす
  〇   たちつ
      なにぬ
 
これを別シートに
 
 あいう
 さしす
 たちつ
 
というように1つのセル内にまとめたいのですが、上手くいきません。
元となるシートの行数は変動するために Cells(Rows.Count, 2).End(xlUp).Row を用いてB列の最終行を取得るようにしています。
お力添えをお願いいたします。
B列が空でなければA列をクリックすると「〇」が付くようにしています。
めちゃくちゃなVBAと思いますが、よろしくお願いいたします。
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
r = Cells(Rows.Count, 2).End(xlUp).Row
 
If Not (Target.Column = 1 And Target.Row >= 3 And Target.Row <= r) Then End
 
If ActiveCell.Offset(0, 1) <> "" Then
 
  If ActiveCell.Value = "" Then
      ActiveCell.Value = "〇"
 
  ElseIf ActiveCell.Value = "〇" Then
      ActiveCell.Value = ""
 
  End If
End If
 
Application.EnableEvents = False
  Cells(1, 2).Select
Application.EnableEvents = True
End Sub
 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B1")) Is Nothing Then
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
 
    If InStr(Cells(i, 1), "〇") > 0 Then
      Range(Cells(i, 2)).Copy Sheets("sheet1").Cells(11, 5)
    End If
  Next i
End If
End Sub

回答
投稿日時: 22/09/04 08:44:03
投稿者: simple

設例から離れますが、簡単なケースでサンプルを提示します。
A1:A3の文字列を改行コード(vbLf)を付けて連結し、
それをB1セルに書き込む例です。
参考にしてください。

Sub test()
    Dim k As Long
    Dim s As String
    
    For k = 1 To 3
        s = s & Cells(k, "A").Value & vbLf
    Next
    Cells(1, "B").Value = Left(s, Len(s) - 1)
End Sub

貴兄のコードをざっと拝見して気づいた点です。
1. 変数はきちんと宣言するようにしたほうがいいでしょう。
http://officetanaka.net/excel/vba/beginner/06.htm
を参考にして、自動的にOption Explicitが追加される設定にしておくことを
強く推奨します。
2.プロシージャを抜ける時は、Endではなく、Exit Subを推奨します。
3.Range(Cells(i, 2))という書き方はエラーになるはずです。単にCells(i, 2)です。

回答
投稿日時: 22/09/04 10:18:32
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

If ActiveCell.Offset(0, 1) <> "" Then
  If ActiveCell.Value = "" Then
      ActiveCell.Value = "〇"
  ElseIf ActiveCell.Value = "〇" Then
      ActiveCell.Value = ""
  End If
End If

 
↑のコードは、半分は説明通り、半分は、説明にないコードがあります。
 
また、ActiveCellを使うより、Targetを使った方がよいと思います。

投稿日時: 22/09/04 15:44:44
投稿者: tomisuke

simple様、WinArrow様、ありがとうございます。
何とか思っていたように動作させることが出来ました。
変数や配列といった領域の理解が至らなかったことを痛感しました。
もっと勉強して、頑張ります。
本当にありがとうございました。