如何使用行和列作为变量(i,j)返回值?

时间:2015-08-07 21:44:10

标签: excel variables row

我正在尝试重新设计一个表格,以便于分析和使用公式。 我基本上拥有的是客户列表和每个州的列。如果客户具有该状态的文档,则单元格将填入文档的到期日期,否则单元格将保持为空。 我想要创建的新表必须按客户和州提供文档列表。因此,对于美国的50个州,我没有50列,而是有一个名为" State"和另一列返回"到期日期"该文件。这个新表将忽略第一个表中的空白单元格,这意味着客户没有所需的文档。 我构建了宏,但它运行没有错误,但也没有变化。没有任何反应。那么我做错了什么?

Sub AllCertificates()

' Define variables
    Dim DataBase As Range
        Set DataBase = Sheets("DataBase").Range("A2:BA10000")
    Dim DataBaseH As Range
        Set DataBaseH = Sheets("DataBase").Range("A1:BA1")
    Dim nStates As Integer
        nStates = DataBase.Columns.Count
    Dim nCustomers As Long
        nCustomers = DataBase.Rows.Count
    Dim nCerts As Long
        nCerts = Application.WorksheetFunction _
            .Count(Sheets("DataBase").Range("J2:BA10000"))
    Dim nData As Long
        nData = Application.WorksheetFunction _
            .Count(Sheets("All Certificates").Columns(1)) + 1
    Dim i As Long
        For i = 1 To nCustomers
    Dim j As Long
        For j = 6 To nStates

' Transfer data to "All Certificates"
    If DataBase.Cells(i, j).Value = "*" Then
        ' Returns the "Customer ID"
        Sheets("All Certificates").Cells(nData, 1).Value = DataBase.Cells(i, 1).Value
        ' Returns the "Customer Name"
        Sheets("All Certificates").Cells(nData, 2).Value = DataBase.Cells(i, 2).Value
        ' Returns the "State"
        Sheets("All Certificates").Cells(nData, 3).Value = DataBaseH.Cells(1, j).Value
        ' Returns the "Expiration Date"
        Sheets("All Certificates").Cells(nData, 4).Value = DataBase.Cells(i, j).Value
        End If

        Next j
        Next i

End Sub

1 个答案:

答案 0 :(得分:0)

请参阅下文,了解代码的工作版本。更正包括:

1。)Application.WorksheetFunction.Count仅计算数值。您需要使用Application.WorksheetFunction.CountA

2。)*字符在VBA字符串中使用时是文字,而不是通配符。相反,使用类似值<>的内容""

3.)你需要增加nData值。它不会重新计算原始赋值,除非你把它放在循环中,但它的计算速度要快得多,只能用n = n + 1递增。

4。)轻微格式化的东西。特别注意格式化循环和条件语句,否则你最终会输错。

Sub AllCertificates()
'Define variables
Dim DataBase As Range
    Set DataBase = Sheets("DataBase").Range("A2:BA10000")
Dim DataBaseH As Range
    Set DataBaseH = Sheets("DataBase").Range("A1:BA1")
Dim nStates As Integer
    nStates = DataBase.Columns.Count
Dim nCustomers As Long
    nCustomers = DataBase.Rows.Count
Dim nCerts As Long
    nCerts = Application.WorksheetFunction.CountA(Sheets("DataBase").Range("C2:BA10000"))
Dim nData As Long
    nData = Application.WorksheetFunction _
        .CountA(Sheets("All Certificates").Columns(1)) + 1
Dim i As Long
Dim j As Long
    For i = 1 To nCustomers
        For j = 6 To nStates
        ' Transfer data to "All Certificates"
            If DataBase.Cells(i, j).Value <> "" Then
                ' Returns the "Customer ID"
                Sheets("All Certificates").Cells(nData, 1).Value = DataBase.Cells(i, 1).Value
                ' Returns the "Customer Name"
                Sheets("All Certificates").Cells(nData, 2).Value = DataBase.Cells(i, 2).Value
                ' Returns the "State"
                Sheets("All Certificates").Cells(nData, 3).Value = DataBaseH.Cells(1, j).Value
                ' Returns the "Expiration Date"
                Sheets("All Certificates").Cells(nData, 4).Value = DataBase.Cells(i, j).Value
                nData = nData + 1
            End If
        Next j
    Next i
End Sub

注意:您的问题相对具体。 StackOverflow问题应该解决许多人可以学习的问题,而不仅仅是一次性解决方案。我认为从你的问题中学到的最大教训是如何调试。稍微使用断点,步入(F8)和变量观察,你就可以自己运行这个宏而没有任何问题。

Debugging (MSDN)
Breakpoints (WiseOwl)

您可能需要考虑编辑原始问题和/或添加调试关键字,因为您真正需要的信息是关于常规调试。此外,您可能还想编辑它以包含问题修复程序。希望这会有所帮助。