Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 VBA宏_Vba_Excel - Fatal编程技术网

过程太大-Excel VBA宏

过程太大-Excel VBA宏,vba,excel,Vba,Excel,我已经创建了下面的代码,因此每当最终用户从另一个工作表的下拉菜单中选择一周时,它都会更新到RawData中本周的列并更新数字,但似乎我做了一些非常愚蠢的事情,可以使用不同的方式来完成: 下面是代码 Dim YesOrNoAnswerToMessageBox As String Dim QuestionToMessageBox As String QuestionToMessageBox = "Confirmation Required" YesOrNoAnswerToMessageBox =

我已经创建了下面的代码,因此每当最终用户从另一个工作表的下拉菜单中选择一周时,它都会更新到RawData中本周的列并更新数字,但似乎我做了一些非常愚蠢的事情,可以使用不同的方式来完成:

下面是代码

Dim YesOrNoAnswerToMessageBox As String
Dim QuestionToMessageBox As String

QuestionToMessageBox = "Confirmation Required"

YesOrNoAnswerToMessageBox = MsgBox("Please confirm updating the results for " & Range("F13").Value & " ?", vbYesNo, "Confirmation Required")

If YesOrNoAnswerToMessageBox = vbYes Then

Worksheets("ResultsUpdateView").Activate

If Sheets("ResultsUpdateView").Range("F13").Value = "Week 01" Then

Worksheets("RawData").Activate

With Sheets("RawData")

Sheets("RawData").Range("B2:B14").Value = Sheets("ResultsUpdateView").Range("J40:J52").Value
Sheets("RawData").Range("B16").Value = Sheets("ResultsUpdateView").Range("J55").Value
Sheets("RawData").Range("B19:B28").Value = Sheets("ResultsUpdateView").Range("J58:J67").Value
Sheets("RawData").Range("B32:B41").Value = Sheets("ResultsUpdateView").Range("J71:J80").Value
Sheets("RawData").Range("B45:B54").Value = Sheets("ResultsUpdateView").Range("J84:J93").Value
Sheets("RawData").Range("B58").Value = Sheets("ResultsUpdateView").Range("J97").Value
Sheets("RawData").Range("B59").Value = Sheets("ResultsUpdateView").Range("J98").Value
Sheets("RawData").Range("B62:B71").Value = Sheets("ResultsUpdateView").Range("J101:J110").Value
Sheets("RawData").Range("B75:B84").Value = Sheets("ResultsUpdateView").Range("J114:J123").Value
Sheets("RawData").Range("B88:B97").Value = Sheets("ResultsUpdateView").Range("J127:J136").Value

End With

Worksheets("ResultsUpdateView").Activate

Else

If Sheets("ResultsUpdateView").Range("F13").Value = "Week 02" Then

Worksheets("RawData").Activate

With Sheets("RawData")

Sheets("RawData").Range("C2:C14").Value = Sheets("ResultsUpdateView").Range("J40:J52").Value
Sheets("RawData").Range("C16").Value = Sheets("ResultsUpdateView").Range("J55").Value
Sheets("RawData").Range("C19:C28").Value = Sheets("ResultsUpdateView").Range("J58:J67").Value
Sheets("RawData").Range("C32:C41").Value = Sheets("ResultsUpdateView").Range("J71:J80").Value
Sheets("RawData").Range("C45:C54").Value = Sheets("ResultsUpdateView").Range("J84:J93").Value
Sheets("RawData").Range("C58").Value = Sheets("ResultsUpdateView").Range("J97").Value
Sheets("RawData").Range("C59").Value = Sheets("ResultsUpdateView").Range("J98").Value
Sheets("RawData").Range("C62:C71").Value = Sheets("ResultsUpdateView").Range("J101:J110").Value
Sheets("RawData").Range("C75:C84").Value = Sheets("ResultsUpdateView").Range("J114:J123").Value
Sheets("RawData").Range("C88:C97").Value = Sheets("ResultsUpdateView").Range("J127:J136").Value

End With

Worksheets("ResultsUpdateView").Activate
'--------
Else

If Sheets("ResultsUpdateView").Range("F13").Value = "Week 03" Then

Worksheets("RawData").Activate

With Sheets("RawData")

    Sheets("RawData").Range("D2:D14").Value = Sheets("ResultsUpdateView").Range("J40:J52").Value
    Sheets("RawData").Range("D16").Value = Sheets("ResultsUpdateView").Range("J55").Value
    Sheets("RawData").Range("D19:D28").Value = Sheets("ResultsUpdateView").Range("J58:J67").Value
    Sheets("RawData").Range("D32:D41").Value = Sheets("ResultsUpdateView").Range("J71:J80").Value
    Sheets("RawData").Range("D45:D54").Value = Sheets("ResultsUpdateView").Range("J84:J93").Value
    Sheets("RawData").Range("D58").Value = Sheets("ResultsUpdateView").Range("J97").Value
    Sheets("RawData").Range("D59").Value = Sheets("ResultsUpdateView").Range("J98").Value
    Sheets("RawData").Range("D62:D71").Value = Sheets("ResultsUpdateView").Range("J101:J110").Value
    Sheets("RawData").Range("D75:D84").Value = Sheets("ResultsUpdateView").Range("J114:J123").Value
    Sheets("RawData").Range("D88:D97").Value = Sheets("ResultsUpdateView").Range("J127:J136").Value

End With

Worksheets("ResultsUpdateView").Activate


'__________

Else

If Sheets("ResultsUpdateView").Range("F13").Value = "Week 04" Then

    Worksheets("RawData").Activate

    With Sheets("RawData")

        Sheets("RawData").Range("E2:E14").Value = Sheets("ResultsUpdateView").Range("J40:J52").Value
        Sheets("RawData").Range("E16").Value = Sheets("ResultsUpdateView").Range("J55").Value
        Sheets("RawData").Range("E19:E28").Value = Sheets("ResultsUpdateView").Range("J58:J67").Value
        Sheets("RawData").Range("E32:E41").Value = Sheets("ResultsUpdateView").Range("J71:J80").Value
        Sheets("RawData").Range("E45:E54").Value = Sheets("ResultsUpdateView").Range("J84:J93").Value
        Sheets("RawData").Range("E58").Value = Sheets("ResultsUpdateView").Range("J97").Value
        Sheets("RawData").Range("E59").Value = Sheets("ResultsUpdateView").Range("J98").Value
        Sheets("RawData").Range("E62:E71").Value = Sheets("ResultsUpdateView").Range("J101:J110").Value
        Sheets("RawData").Range("E75:E84").Value = Sheets("ResultsUpdateView").Range("J114:J123").Value
        Sheets("RawData").Range("E88:E97").Value = Sheets("ResultsUpdateView").Range("J127:J136").Value

    End With

    Worksheets("ResultsUpdateView").Activate

尽量构造代码,不要重复总是相同的东西。一种可能的解决方案是使用select case和目标列的变量:

Sub Update()
Dim RawDataSheet As Worksheet, ResUpdSheet As Worksheet, Col As String
Set RawDataSheet = Sheets("RawData")
Set ResUpdSheet = Sheets("ResultsUpdateView")

    If MsgBox("Please confirm updating the results for " & Range("F13").Value & " ?", vbYesNo, "Confirmation Required") = vbNo Then Exit Sub
    Select Case ResUpdSheet.Range("F13").Value
        Case "Week 01"
            Col = "B"
        Case "Week 02"
            Col = "C"
        Case "Week 03"
            Col = "D"
        Case "Week 04"
            Col = "E"
        Case Else
        '...
    End Select

    RawDataSheet.Range(Col & "2:" & Col & "14").Value = ResUpdSheet.Range("J40:J52").Value
    RawDataSheet.Range(Col & "16").Value = ResUpdSheet.Range("J55").Value
    RawDataSheet.Range(Col & "19:" & Col & "28").Value = ResUpdSheet.Range("J58:J67").Value
    RawDataSheet.Range(Col & "32:" & Col & "41").Value = ResUpdSheet.Range("J71:J80").Value
    RawDataSheet.Range(Col & "45:" & Col & "54").Value = ResUpdSheet.Range("J84:J93").Value
    RawDataSheet.Range(Col & "58").Value = ResUpdSheet.Range("J97").Value
    RawDataSheet.Range(Col & "59").Value = ResUpdSheet.Range("J98").Value
    RawDataSheet.Range(Col & "62:" & Col & "71").Value = ResUpdSheet.Range("J101:J110").Value
    RawDataSheet.Range(Col & "75:" & Col & "84").Value = ResUpdSheet.Range("J114:J123").Value
    RawDataSheet.Range(Col & "88:" & Col & "97").Value = ResUpdSheet.Range("J127:J136").Value


End Sub
这里有一个例子。 您可以从单元格F13中提取周数,并将其用作列号的基础。周1为列B,周2为列C

colNum=CLngReplaceSheetsResultsUpdateView.RangeF13,Week,+1将周数转换为长数据类型,并添加1以获取列数。然后可以使用它引用单元格:SheetsRawData.Cells16,colNum是colNum标识的列上的第16行

此代码将从单元格F13中获取值,并使用该值将值放入正确的列代码的未测试项中:

Sub Test()

    Dim wrkSht As Worksheet
    Dim colNum As Long

    Set wrkSht = ThisWorkbook.Worksheets("ResultsUpdateView")
    colNum = CLng(Replace(wrkSht.Range("F13"), "Week ", "")) + 1 'Get the week number from cell F13 & add 1.

    With ThisWorkbook.Worksheets("RawData")
        .Range(.Cells(2, colNum), .Cells(14, colNum)).Value = wrkSht.Range("J40:J52").Value
        .Cells(16, colNum).Value = wrkSht.Range("J55").Value
        .Range(.Cells(19, colNum), .Cells(28, colNum)).Value = wrkSht.Range("J58:J67").Value
        .Range(.Cells(32, colNum), .Cells(41, colNum)).Value = wrkSht.Range("J71:J80").Value
        .Range(.Cells(45, colNum), .Cells(54, colNum)).Value = wrkSht.Range("J84:J93").Value
        .Cells(58, colNum).Value = wrkSht.Range("J97").Value
        .Cells(59, colNum).Value = wrkSht.Range("J98").Value
        .Range(.Cells(62, colNum), .Cells(71, colNum)).Value = wrkSht.Range("J101:J110").Value
        .Range(.Cells(75, colNum), .Cells(84, colNum)).Value = wrkSht.Range("J114:J123").Value
        .Range(.Cells(88, colNum), .Cells(97, colNum)).Value = wrkSht.Range("J127:J136").Value
    End With

End Sub

那么你真正的问题是什么?你一个也没问。请阅读并尝试提供实际问题的详细信息。您是否收到实际错误消息,即您的过程太大?如果没有,那么正如@Peh所说……我的错误过程太大了,因为我每周重复52次相同的代码,如果有任何解决方法或其他方法来编写下面的代码,我将非常感谢你的帮助。谢谢你Jochen的努力,我已经尝试了上述解决方案,但没有成功,它没有检查从下拉菜单中选择的周,而是将值返回到RawData工作表中的每周单元格。请检查工作表中的下拉列表,尤其是LinkedCell,以查看框中所选值的位置。相应地更改select case语句。谢谢Darren,问题是在另一个工作表中有一个下拉菜单,其中列出了第01周、第02周、第03周……等等,用户在该工作表中选择该周,然后更新同一工作表中的数字,然后单击更新,单击后,我希望宏获取他在结果更新表->转到RawData表中输入的数字,找到本周的相关单元格,并将值粘贴到RawData表中。它应该可以工作。ResultUpdate视图上的F13范围包含按代码外观显示的下拉菜单。因此,用户从下拉菜单中更新此图形,更新同一工作表中的图形并按下Updatedate按钮。代码查看在F13中选择的周,并使用该周查找正确的列。我尝试测试代码,但代码不起作用,Darren,问题是已经有一个表包含52列的RawData表,列的标题与前面提到的下拉菜单中的列表相同。在你的代码中,我认为有一个增量来添加另一列+1,我希望宏找到与下拉菜单中的值具有相同标题的列。我一定误解了你的问题,因为它正以我想象的方式完美工作。为了进行测试,我创建了一个新的空白工作表并添加了两个工作表——第一个工作表名为RawData,第二个工作表名为ResultsUpdate视图。我在ResultsUpdateView的J列中添加了一些测试数据,我使用了=ADDRESSROW,该列将给出单元格地址和复制/粘贴的值。单元格F13 I使用数据验证进行设置,以允许列表包含第01周、第02周、第03周和第04周的源。我选择了第04周并运行了我的代码-数据在RawData上从J列传输到E列。我选择了第02周,数据在ResultsUpdate视图上从J列传输到B列。然后,我将其与代码的输出进行了比较——必须首先对IF…END IF块进行排序,然后返回完全相同的结果。