【问题标题】:Column based on header in excel vba基于excel vba中标题的列
【发布时间】:2020-05-02 19:55:33
【问题描述】:

公式:

=IF(RC[2]=""Debit"",RC[-1],IF(RC[2]=""Credit"",-RC[-1]))

表示它将检查值是否在列 M 中为借方/贷方,并将 (-) 列在列 K 中。

我的问题是,如果我们不知道借方/贷方仅在 col M 中怎么办?我们将提供什么而不是RC[2]?我们只知道该列的标题将是“借方或贷方”。

我的完整代码:

Rows("1:1").Select
 Selection.Find(What:="AMNT", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Select

  ActiveCell.Offset(1, 0).Select 'Noting but K2
  Range(Cells(2, ActiveCell.Column), Cells(lastRow, ActiveCell.Column)).FormulaR1C1 = _
    "=IF(RC[2]=""Debit"",RC[-1],IF(RC[2]=""Credit"",-RC[-1]))"
ActiveCell.EntireColumn.Select
  Selection.Copy
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    您的代码做了很多选择,而对这些选择没有任何作用。在最好的情况下,最好是avoid using select,因为它会减慢您的代码速度(并且在大多数情况下是不必要的)。

    此代码假定工作表为Sheet1,如果不更改工作表引用以适合您自己的工作表。

    我为我想使用的所有数字和范围创建变量,这使代码更易于阅读和遵循(因为可以描述性地命名变量)。

    我在第 1 行找到最后一列(假设这是标题行),这意味着如果添加或删除列,代码将完全一样。

    找到列标题后,我们将贷方或借方列号分配给DebtCreditColumn,并使用它来定义我们的HeaderRange

    然后我们对AMNTColumn 执行相同的操作。

    我添加了几个If...Then 语句来显示MsgBox,如果其中一个值为0(这意味着找不到标头),则中止代码。

    然后从DebtCreditColumn 中减去AMNTColumn 以获得差值并分配给FormulaReferenceColumn

    然后在Debit or Credit 中找到LastRow 并将我们的TargetRange 设置为从第2 行到LastRow 的“AMNT 列”(LastRow 没有在您的代码中定义,所以我认为它是'借方或贷方”列)。

    最后将FormulaReferenceColumn 合并到我们的公式中以写入我们的TargetRange

    像这样:

    Sub ParanTest()
    
    Dim DebtCreditColumn As Long
    Dim AMNTColumn As Long
    Dim LastColumn As Long
    Dim FormulaReferenceColumn As Long
    Dim LastRow As Long
    Dim HeaderRange As Range
    Dim TargetCell As Range
    Dim TargetRange As Range
    
    With Sheet1
        LastColumn = .Cells(1, Columns.Count).End(xlToLeft).Column
        Set HeaderRange = .Range(.Cells(1, 1), .Cells(1, LastColumn))
    End With
    
    For Each TargetCell In HeaderRange
        If TargetCell.Value Like "Debit or Credit" Then
            DebtCreditColumn = TargetCell.Column
            Exit For
        Else
            'Go To Next Cell
        End If
    Next TargetCell
    
    For Each TargetCell In HeaderRange
        If TargetCell.Value Like "AMNT" Then
            AMNTColumn = TargetCell.Column
            Exit For
        Else
            'Go To Next Cell
        End If
    Next TargetCell
    
    'In case the column can't be found, this will notify you and abort the code to avoid errors.
    If DebtCreditColumn = 0 Then
        MsgBox "A column header 'Debit or Credit' could not be found.", vbOKOnly, "No column found!"
    Exit Sub
    End If
    
    'In case the column can't be found, this will notify you and abort the code to avoid errors.
    If AMNTColumn = 0 Then
        MsgBox "A column header 'AMNT' could not be found.", vbOKOnly, "No column found!"
    Exit Sub
    End If
    
    FormulaReferenceColumn = DebtCreditColumn - AMNTColumn
    
    With Sheet1
        LastRow = .Cells(Rows.Count, DebtCreditColumn).End(xlUp).Row    'You can define whatever column works best for you
        Set TargetRange = .Range(.Cells(2, AMNTColumn), .Cells(LastRow, AMNTColumn))
    End With
    
    TargetRange.FormulaR1C1 = "=IF(RC[" & FormulaReferenceColumn & "]=""Debit"",RC[-1],IF(RC[" & FormulaReferenceColumn & "]=""Credit"",-RC[-1]))"
    
    
    End Sub
    
    

    【讨论】:

    • 感谢您的回答,但代码似乎与问题无关。还是我的问题很奇怪?如果是这样,请告诉我。我会尝试以更好的方式解释。 (仅供参考 - K 列需要填写 J 列的值。如果 M 列有一个值作为信用值,则 (-) 减号应位于 K 列中的值之前。
    • 那么您的问题是如何在 K 列值中加上减号,如果不是贷方或借方的列 M 怎么办。你没有提到别的。也许更新您的问题以使其更清楚。
    • 只有当列 K 已经具有某些值时,您的答案才有效,但我的公式说如果 col m = credit then put - and col J's value。如果 col m = debit 则只输入 J 的值。
    • 我想我误会了,我很抱歉。
    • @paran 我已经更新了我的答案以纠正我的误解。它的工作方式或多或少与以前相同,只是现在动态地为“债务或信用”列提供RC[ ] 数字的差异并将公式写入“AMNT”列(从第 2 行到债务或信用的最后一行柱子)。当然,您可以添加到它以查找所有相关列并进一步更新公式。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多