我正在尝试重新设计一个表格,以便于分析和使用公式。 我基本上拥有的是客户列表和每个州的列。如果客户具有该状态的文档,则单元格将填入文档的到期日期,否则单元格将保持为空。 我想要创建的新表必须按客户和州提供文档列表。因此,对于美国的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
答案 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)
您可能需要考虑编辑原始问题和/或添加调试关键字,因为您真正需要的信息是关于常规调试。此外,您可能还想编辑它以包含问题修复程序。希望这会有所帮助。