尝试创建创建新excel工作表并将数据复制到工作表的循环
我有一个循环,用程序运行期间计算的数据填充excel工作簿(当前工作表)。我的循环应该检查当前年份选项卡是否存在,如果存在,则应该写入该表。如果没有,则应该创建另一张以当前年份作为工作表名称的工作表,并将标题复制到工作表A1-A65中新创建的工作表之前的标题上。它会将工作转到当前年度工作表(如果已经存在),但不会创建包含当前年度的新工作表,如果当前年度工作表不存在,则不会复制单元格。我在后面加入了循环和几行,看看是否有人能帮我发现或纠正错误尝试创建创建新excel工作表并将数据复制到工作表的循环,excel,loops,vba,Excel,Loops,Vba,我有一个循环,用程序运行期间计算的数据填充excel工作簿(当前工作表)。我的循环应该检查当前年份选项卡是否存在,如果存在,则应该写入该表。如果没有,则应该创建另一张以当前年份作为工作表名称的工作表,并将标题复制到工作表A1-A65中新创建的工作表之前的标题上。它会将工作转到当前年度工作表(如果已经存在),但不会创建包含当前年度的新工作表,如果当前年度工作表不存在,则不会复制单元格。我在后面加入了循环和几行,看看是否有人能帮我发现或纠正错误 Dim excel_app As Excel.A
Dim excel_app As Excel.Application
Dim workbook As Excel.Workbook
Dim sheet_name As String
Dim sheet As Excel.Worksheet
Dim exeDir As New IO.FileInfo(Reflection.Assembly.GetExecutingAssembly.FullName)
Dim xlPath = IO.Path.Combine(exeDir.DirectoryName, "Records.xlsx")
' Get the Excel application object.
excel_app = New Excel.Application
' Make Excel visible (optional).
excel_app.Visible = False
' Open the workbook.
workbook = excel_app.Workbooks.Open(xlPath)
'Under Construction, trying to check if current year tab exists, if not creating it
Dim i As Integer
Dim blnsheet As Boolean = False
Dim yearstamp As String = _
DateTime.Now.ToString("yyyy")
Dim datestamp As String = _
DateTime.Now.ToString("MMMM yyyy")
With workbook
For i = 1 To .Sheets.Count
If .Sheets(i).name = yearstamp Then
blnsheet = True
Exit For
End If
Next i
If blnsheet = False Then
.Sheets.Add()
With .ActiveSheet
.name = yearstamp
.Range("A1:A65") = .Sheets(i - 1).Range("A1:A65")
End With
End If
End With
'End of Sheet loop
sheet_name = yearstamp
sheet = excel_app.Worksheets(sheet_name)
Dim ColumnCount As Long
ColumnCount = sheet.Range("A1").CurrentRegion.Columns.Count
For m As Integer = 0 To ColumnCount
If sheet.Range("A1").Offset(0, m).Value = datestamp Then
ColumnCount = m
Exit For
End If
Next m
'End Construction
With sheet.Range("A1")
.Offset(0, ColumnCount).Value = datestamp
.Offset(1, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.totalincome, 2)
.Offset(2, ColumnCount).Value = "$" & FormatNumber(totalexpenses, 2)
.Offset(3, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.cellphone, 2)
.Offset(4, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.carinsurance, 2)
.Offset(5, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.healthinsurance, 2)
.Offset(6, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.therapysessions, 2)
.Offset(7, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.drappointments, 2)
.Offset(8, ColumnCount).Value = "$" & FormatNumber(GlobalVariables.medications, 2)
.Offset(9, ColumnCount).Value = GlobalVariables.med1name & " $" & FormatNumber(GlobalVariables.med1, 2)
.Offset(10, ColumnCount).Value = GlobalVariables.med2name & " $" & FormatNumber(GlobalVariables.med2, 2)
.Offset(11, ColumnCount).Value = GlobalVariables.med3name & " $" & FormatNumber(GlobalVariables.med3, 2)
.Offset(12, ColumnCount).Value = GlobalVariables.med4name & " $" & FormatNumber(GlobalVariables.med4, 2)
.Offset(13, ColumnCount).Value = GlobalVariables.med5name & " $" & FormatNumber(GlobalVariables.med5, 2)
.Offset(14, ColumnCount).Value = GlobalVariables.med6name & " $" & FormatNumber(GlobalVariables.med6, 2)
.Offset(15, ColumnCount).Value = GlobalVariables.med7name & " $" & FormatNumber(GlobalVariables.med7, 2)
.Offset(16, ColumnCount).Value = GlobalVariables.med8name & " $" & FormatNumber(GlobalVariables.med8, 2)
编辑以添加最近的进度/失败的尝试
我认为,通过按名称查找工作表,可以完全消除循环。Item属性将接受表示工作表名称的字符串 见: 索引
类型:
必需的对象。对象的名称或索引号 这将返回一个对象。您可以测试返回值是否为
Nothing
,以确定它是否存在:
Dim l_worksheets = workbook.Worksheets
Dim l_worksheet = l_worksheets("2013")
Dim l_worksheetExists = l_worksheet Is Not Nothing
您可能还没有注意到的一个问题(可能您已经注意到,并且您关心的是更紧迫的问题)是,当代码执行完毕时,Excel没有正确退出,即使您正在调用Quit。如果你还没有注意到,你会的。这是因为您正在创建对对象的引用,但在完成时没有清理它们。我在您的代码中看到了几个示例,但要特别指出一个示例:
For i = 1 To .Sheets.Count
您从不清理Sheets COM对象,因此它会挂起在内存中。(因为它是COM对象,所以无法对其进行垃圾收集。)
见对不起。只是我已经尝试了很多方法让这个循环完成我开始要做的事情,但到目前为止,我的循环没有任何效果。也许我应该换一句话,“是否有人对如何建立一个循环来检查某个工作表有什么建议,如果它不存在,那么创建它并从上一个工作表的单元格中复制?”这是一个更合适的问题吗?
“Excel没有正确退出”
是的,如果您选中“任务管理器”,我相信将会有一堆excel进程在运行:p-已经在那里了,完成了!如果我使用这种方法,如果工作表不存在,我如何创建新工作表并复制所需的单元格?至于辞职的问题,我已经注意到了,但还没有弄清楚原因。谢谢你让我注意到这一点!有没有一种方法可以一次将它们全部关闭,或者你建议我用什么方法关闭它们?@CaffeineCoder-阅读我链接到的文章和链接到的文章。这超出了我在评论中所能解释的范围。@JDB-我尝试了一种不同的方法,使用您对项目功能的建议,但它仍然没有完成工作。我已经在上面添加了最新的尝试,因此您可以查看它是否有任何错误,或者可以建议一种使其工作的方法。我在您提供的以下代码行中遇到错误l\u工作表不是空的。错误状态为“'Is'运算符不接受'Integer'类型的操作数。操作数必须是引用或可为空的类型”
For i = 1 To .Sheets.Count