基于星期几将数据从一个位置复制到另一个位置的VBA脚本遇到问题

编程语言 2026-07-09

我正在为工作开发这段代码,在复制数据的那一行就会报错。我大概漏掉了一些就在我眼前的东西。

它在这个语句处专门出错

wsThaw.Range(destRange).Value = wsMenu.Range("E5:E15").Value

我并不是专家,更像是个抄来抄去的人,对用于复制数据的命令中使用的各种变量不熟悉。

谢谢,

Jeremy

Sub Test()

' Copy information Visual Basic control _
  Script written on 05/07/2026 by me _
  Copies data to appropriate locations for Thaw and Prep worksheets

    Dim wsMenu As Worksheet
    Dim wsThaw As Worksheet
    Dim wsPrep As Worksheet
    Dim destRange As Range
    Dim dayName As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    ' Set worksheet references
    Set selectedSheet = ActiveSheet
    Set wsMenu = ThisWorkbook.Worksheets("Menu")
    Set wsThaw = ThisWorkbook.Worksheets("Daily thaw")
    Set wsPrep = ThisWorkbook.Worksheets("Daily prep")

    dayName = Format(Date, "dddd")

    ' Determine destination by day of week
    Select Case dayName

        Case "Friday"
            Set destRange = Range("C5:C15")

        Case "Saturday"
            Set destRange = Range("C20:C30")

        Case "Sunday"
            Set destRange = Range("C35:C45")

        Case "Monday"
            Set destRange = Range("C50:C60")

        Case "Tuesday"
            Set destRange = Range("C65:C75")

        Case "Wednesday"
            Set destRange = Range("C80:C90")

        Case "Thursday"
            Set destRange = Range("C95:C105")

        Case Else
            GoTo CleanExit

    End Select

    ' Copy Menu to Daily Thaw
    wsThaw.Range(destRange).Value = wsMenu.Range("E5:E15").Value

    ' Copy Menu to Daily Prep
    wsPrep.Range(destRange).Value = wsMenu.Range("G5:G15").Value

    ' Clear source ranges
    wsMenu.Range("E5:E15, G5:G15").ClearContents

CleanExit:

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True


End Sub

解决方案

Set destRange = Range("C5:C15")

这行没有合格的工作簿和工作表,因此它默认为活动工作表。

wsPrep.Range(destRange).Value = wsMenu.Range("G5:G15").Value

这行的意思是在 wsprep 上要包含一个在活动工作表上的范围。它无法理解这一点。

使用

wsPrep.Range(destRange.address).Value

你也可以在设置值时对它进行限定,但这样需要在 wsprepwsthaw 两处都做一次

    Set destRange1 = wsprep.Range("C5:C15")
    Set destRange2 = wsthaw.Range("C5:C15")

或者把 Dim destRange As Range 改成 Dim destRange As String 并执行 destRange = "C5:C15",移除 Set,因为它不再是一个对象,然后你就可以按原样保留你的复制行。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章