将新创建的公式添加到新模块中

时间:2018-11-30 21:59:33

标签: excel vba

我刚刚创建了一个全新的宏。从Internet下拉至下方功能(所有功劳归于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列? / p>

预先感谢

2 个答案:

答案 0 :(得分:1)

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


CONCATENATEMULTIPLE

在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")

确切位置,现在没有歧义(潜在错误)的空间了

答案 1 :(得分: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”)之类的硬编码范围引用,但是会再保留一段时间。