3

範囲に基づいてセルを選択して連結するための大まかな関数を作成しました。

Function GetSkills(CellRef As String, CellRefEnd As String, Delimiter As String)

    Dim CellStart As Range
    Dim CellEnd As Range
    Dim LoopVar As Long
    Dim StartRow As Long
    Dim EndRow As Long
    Dim Concat As String
    Dim Col As Long

    Set CellStart = Worksheets(1).Cells.Range("B" & CellRef)
    Set CellEnd = Worksheets(1).Cells.Range("B" & CellRefEnd)

    Col = CellStart.Column
    StartRow = CellStart.Row
    EndRow = CellEnd.Row

    With Range(CellStart, CellEnd)
        .Merge
        .WrapText = True
    End With

    Concat = ""

    For LoopVar = StartRow To EndRow
        Concat = Concat & Cells(LoopVar, Col).Value
        If LoopVar <> EndRow Then Concat = Concat & Delimiter & " "
    Next LoopVar

    GetSkills = Concat

End Function

その中でセルをマージしようとしています。関数を実行すると、次のようなプロンプトが表示されます。

選択範囲には複数のデータ値が含まれています。1つのセルにマージすると、左上のほとんどのデータのみが保持されます

[OK]をクリックすると、Excelがクラッシュして再起動し、ダイアログが再度表示されます。VBAを使用してセルのブロックをマージする別の方法はありますか?

4

1 に答える 1

3

一般に、セルを結合することはお勧めできません。これは、VBA コードで大混乱を引き起こす可能性のある表面的な書式設定方法です。

免責事項はさておき、いくつかの提案

  • 範囲を変更したい場合は、FunctionではなくSubを使用してください
  • Application.DisplayAlertsセルの結合メッセージを抑制するために使用します
  • コードを大幅に削減できます

コード

Sub Test()
Call GetSkills(2, 4, ",")
End Sub

Sub GetSkills(CellRef As String, CellRefEnd As String, Delimiter As String)
Dim CellStart As Range
Dim CellEnd As Range
Dim Concat As String

Application.DisplayAlerts = False
Set CellStart = Worksheets(1).Cells.Range("B" & CellRef)
Set CellEnd = Worksheets(1).Cells.Range("B" & CellRefEnd)

Concat = Join(Application.Transpose(Range(CellStart, CellEnd)), Delimiter)

With Range(CellStart, CellEnd)
    .Merge
    .WrapText = True
    .Value = Concat
End With
Application.DisplayAlerts = True
End Sub
于 2012-11-13T22:22:32.303 に答える