Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试创建创建新excel工作表并将数据复制到工作表的循环_Excel_Loops_Vba - Fatal编程技术网

尝试创建创建新excel工作表并将数据复制到工作表的循环

尝试创建创建新excel工作表并将数据复制到工作表的循环,excel,loops,vba,Excel,Loops,Vba,我有一个循环,用程序运行期间计算的数据填充excel工作簿(当前工作表)。我的循环应该检查当前年份选项卡是否存在,如果存在,则应该写入该表。如果没有,则应该创建另一张以当前年份作为工作表名称的工作表,并将标题复制到工作表A1-A65中新创建的工作表之前的标题上。它会将工作转到当前年度工作表(如果已经存在),但不会创建包含当前年度的新工作表,如果当前年度工作表不存在,则不会复制单元格。我在后面加入了循环和几行,看看是否有人能帮我发现或纠正错误 Dim excel_app As Excel.A

我有一个循环,用程序运行期间计算的数据填充excel工作簿(当前工作表)。我的循环应该检查当前年份选项卡是否存在,如果存在,则应该写入该表。如果没有,则应该创建另一张以当前年份作为工作表名称的工作表,并将标题复制到工作表A1-A65中新创建的工作表之前的标题上。它会将工作转到当前年度工作表(如果已经存在),但不会创建包含当前年度的新工作表,如果当前年度工作表不存在,则不会复制单元格。我在后面加入了循环和几行,看看是否有人能帮我发现或纠正错误

   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