0

我刚刚创建了一个全新的宏。从互联网下面获取功能(所有学分都转到trumpexcel.com),代码在下面

    Function CONCATENATEMULTIPLE(Ref As Range, Separator As String) As String
Dim Cell As Range
Dim Result As String
For Each Cell In Ref
 Result = Result & Cell.Value & Separator
Next Cell
CONCATENATEMULTIPLE = Left(Result, Len(Result) - 1)
End Function

然后我继续从各个列中提取数据并放入其中(我的表是 20 行 x 10 列)

Sub conact_data()

    Dim i As Integer

    For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
        Cells(i, "M").Value = Cells(i, "A").Value & " " & _
        Cells(i, "B").Value & " / " & Cells(i, "D").Value & "; "
    Next i

End Sub

多亏了这一点,我得到了 A、B 和 D 列的组合数据,所以它有 20 行。我现在要做的就是使用 CONCATENATEMULTIPLE 函数连接来自 M2:M21 的数据,因此我尝试了各种方法(我想要 P2 单元格中的这条大线),例如:

Cells(2, 16).Value = CONCATENATEMULTIPLE (M2:M21, " ")

或者

Range("P2") = "CONCATENATEMULTIPLE (M2:M21, " ")"

我真的不知道如何应用

其次,我想撤回Cells(i, "B").Value百分比。我可以在一行中这样做Cells(i, "B").NumberFormat="0.00%".Value(这显然对我不起作用)否则我需要将 B 列复制到具有数字格式的另一列中,然后合并新列,正确格式化而不是 B 列?

提前致谢

4

2 回答 2

1

百分比格式: Range("B" & i).NumberFormat = "0.00%"


连接多个

在 VBA 中,CHR(32)=" "
在 Excel 中,CHAR(32)=" "

话虽这么说...

'Value
Range("P2").Value = CONCATENATEMULTIPLE(Range("M2:M21"), CHR(32))

'Formula
Range("P2").Formula = "=CONCATENATEMULTIPLE(M2:M21, CHAR(32))"

你真的应该用工作表来限定你的所有范围

假设您的工作簿有 10 张。当你说Range("P2"),我们(VBE)怎么知道你的意思是什么表?对象需要适当地限定。有时这不是一个大问题,但是当您跨多个工作表工作时,不符合条件的范围可能会导致一些意想不到的结果。

您可以通过几种方式获得工作表的资格。

直接地:ThisWorkbook.Sheets("Sheet1").Range("P2").Copy

或者使用这样的变量

Dim ws as Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Range("P2").Copy

现在没有任何歧义(潜在错误)的余地Range("P2")

于 2018-11-30T22:06:27.943 回答
0

首先,删除您的 ConcatenateMultiple() 代码,改为使用 Excel 工作表函数 CONCAT(),该函数将范围和分隔符作为参数。

这是您如何处理百分比问题并为非数字项目提供默认值的方法。我还清理了您引用数据范围的方式。

Sub concat_data()
    Dim rngRow As Range, vResult As Variant
    Const DEFAULT = 0   'Can also be set to a text value, eg. "Missing"

    For Each rngRow In [A2].CurrentRegion.Rows
        If IsNumeric(rngRow.Cells(, 4)) Then vResult = rngRow.Cells(, 4) * 100 & "%" Else vResult = DEFAULT
        Range("M" & rngRow.Row) = rngRow.Cells(, 1) & rngRow.Cells(, 2) & "/" & vResult & ";"
    Next
    [M2].End(xlDown).Offset(1).Formula = "=CONCAT(M2:M" & [M2].End(xlDown).Row & ",TRUE,"" "")"
End Sub

我不喜欢硬编码范围引用,例如 [A2] 或 Range("M"),但我会再考虑。

于 2018-12-01T00:04:42.867 回答