0

我对 VBA 很陌生,所以下面的问题应该不会太难。但是由于我花了大约一个半小时来编写代码,我想我只是缺乏一些基本的了解它应该是什么样子,所以我认为值得在这里发布它。

代码所做的基本上是将值从一个工作表中的一个范围复制到包含某种计划的同一活动工作簿中的另一个工作表中的另一个范围。

在本节中的循环的第一次运行中,我已经收到“运行时错误'9'下标超出范围”错误消​​息

'Subject
Morning = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day)

我在一个空白工作簿中尝试了代码,所以错误不应该是由于格式化(如果这可能是原因)。但是,如果您需要有关上下文等的更多信息,我当然可以提供更多详细信息。

谢谢您的回答!

帕特里克

Sub SetData_new()
' SubModule to copy the data from 'Master_Plan' to particular sheets

Dim CurrWS As Long, StartWS As Long, EndWS As Long
StartWS = Sheets("W_1").Index
EndWS = Sheets("L_1").Index
Dim Weeknr As Integer
Weeknr = 5
Dim Day As Long
Dim Morning As Range, Afternoon As Range, Noon As Range

For CurrWS = StartWS To EndWS

   'Set updated ranges
   Set Morning = Worksheets(CurrWS).Cells(4, 4)
   Set Afternoon = Worksheets(CurrWS).Cells(8, 4)
   Set Noon = Worksheets(CurrWS).Cells(12, 4)

    For Day = 3 To 21 Step 3
    'Subject
       Morning = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day)
       Afternoon = Worksheets("ExamSchedule").Cells(Weeknr + 4, Day)
       Noon = Worksheets("ExamSchedule").Cells(Weeknr + 6, Day)

     'Category
       Morning.Offset(0, 1) = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day + 1)
       Afternoon.Offset(0, 1).Value = Worksheets("ExamSchedule").Cells(Weeknr + 4, Day + 1)
       Noon.Offset(0, 1).Value = Worksheets("ExamSchedule").Cells(Weeknr + 6, Day + 1)

     'Type
       Morning.Offset(0, 2) = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day + 2)
       Afternoon.Offset(0, 2).Value = Worksheets("ExamSchedule").Cells(Weeknr + 4, Day + 2)
   Noon.Offset(0, 2).Value = Worksheets("ExamSchedule").Cells(Weeknr + 6, Day + 2)

     'Specifications
       Morning.Offset(0, 3) = Worksheets("ExamSchedule").Cells(Weeknr + 3, Day)
       Afternoon.Offset(0, 3).Value = Worksheets("ExamSchedule").Cells(Weeknr + 5, Day)
       Noon.Offset(0, 3).Value = Worksheets("ExamSchedule").Cells(Weeknr + 7, Day)

     'Increment
       Morning = Morning.Offset(12, 0)
       Afternoon = Afternoon.Offset(12, 0)
       Noon = Noon.Offset(12, 0)
     Next Day

    Wochennummer = Wochennummer + 9
Next CurrWS

Worksheets("ExamSchedule").Activate

End Sub
4

2 回答 2

2

错误是由于Variant不合格的默认类型Dim

发生了什么是线

Morning = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day)

将值 from ExamScheduleintoMorning并将其类型设置为任何单元格值类型。

当线

Morning.Offset(0, 1) = Worksheets("ExamSchedule").Cells(Weeknr + 2, Day + 1)

运行,Morning不是 type Range,所以它没有Offset属性和错误

使用

Dim Morning as Range

等应该可以解决您的问题。

编辑

为了简化一点,试试这个
为工作表使用变量
明确Value引用

Sub SetData_new()
    ' SubModule to copy the data from 'Master_Plan' to particular sheets
    Dim Wochennummer As Long ' unless this is a global variable?
    Dim CurrWS As Long, StartWS As Long, EndWS As Long
    StartWS = Sheets("W_1").Index
    EndWS = Sheets("L_1").Index
    Dim Weeknr As Long
    Weeknr = 5
    Dim Day  As Long
    Dim Morning As Range, Afternoon As Range, Noon As Range

    Dim ws As Worksheet
    Set ws = Worksheets("ExamSchedule")

    For CurrWS = StartWS To EndWS

       'Set updated ranges
       Set Morning = Worksheets(CurrWS).Cells(4, 4)
       Set Afternoon = Worksheets(CurrWS).Cells(8, 4)
       Set Noon = Worksheets(CurrWS).Cells(12, 4)

        For Day = 3 To 21 Step 3
        'Subject
           Morning.Value = ws.Cells(Weeknr + 2, Day).Value
           Afternoon.Value = ws.Cells(Weeknr + 4, Day).Value
           Noon.Value = ws.Cells(Weeknr + 6, Day).Value

         'Category
           Morning.Offset(0, 1).Value = ws.Cells(Weeknr + 2, Day + 1).Value
           Afternoon.Offset(0, 1).Value = ws.Cells(Weeknr + 4, Day + 1).Value
           Noon.Offset(0, 1).Value = ws.Cells(Weeknr + 6, Day + 1).Value

         'Type
           Morning.Offset(0, 2) = ws.Cells(Weeknr + 2, Day + 2)
           Afternoon.Offset(0, 2).Value = ws.Cells(Weeknr + 4, Day + 2)
           Noon.Offset(0, 2).Value = ws.Cells(Weeknr + 6, Day + 2)

         'Specifications
           Morning.Offset(0, 3).Value = ws.Cells(Weeknr + 3, Day).Value
           Afternoon.Offset(0, 3).Value = ws.Cells(Weeknr + 5, Day).Value
           Noon.Offset(0, 3).Value = ws.Cells(Weeknr + 7, Day).Value

         'Increment
           Morning.Value = Morning.Offset(12, 0).Value
           Afternoon.Value = Afternoon.Offset(12, 0).Value
           Noon.Value = Noon.Offset(12, 0).Value
         Next Day

        Wochennummer = Wochennummer + 9
    Next CurrWS

    ws.Activate
End Sub
于 2013-01-03T10:08:20.057 回答
2

对于所有感兴趣的人,我最终实现的版本如下所示。它在 Windows 上工作得很好,也应该在 Mac 上工作:

Sub SetData_new_my()
' SubModule to copy the data from 'Master_Plan' to particular sheets

Dim CurrWS As Long, StartWS As Long, EndWS As Long, ScheduleWS As Long
StartWS = Sheets("W_1").Index
EndWS = Sheets("L_1").Index

Dim Weeknr As Long
Weeknr = 5
Dim Day As Long

Dim Morning As Range, Afternoon As Range, Noon As Range    
Dim ExamSchedule As Worksheet
Set ExamSchedule = Worksheets("ExamSchedule")
    
For CurrWS = StartWS To EndWS
   'Set updated ranges
   Set Morning = Worksheets(CurrWS).Cells(4, 4)
   Set Afternoon = Worksheets(CurrWS).Cells(8, 4)
   Set Noon = Worksheets(CurrWS).Cells(12, 4)

    For Day = 3 To 21 Step 3
    'Subject
       Morning.Value = ExamSchedule.Cells(Weeknr + 2, Day).Value
       Afternoon.Value = ExamSchedule.Cells(Weeknr + 4, Day).Value
       Noon.Value = ExamSchedule.Cells(Weeknr + 6, Day).Value

     'Category
       Morning.Offset(0, 1).Value = ExamSchedule.Cells(Weeknr + 4, Day + 1).Value
       Afternoon.Offset(0, 1).Value = ExamSchedule.Cells(Weeknr + 4, Day + 1).Value
       Noon.Offset(0, 1).Value = ExamSchedule.Cells(Weeknr + 6, Day + 1).Value

     'Type
       Morning.Offset(0, 2).Value = ExamSchedule.Cells(Weeknr + 1, Day + 2).Value
       Afternoon.Offset(0, 2).Value = ExamSchedule.Cells(Weeknr + 4, Day + 2).Value
       Noon.Offset(0, 2).Value = ExamSchedule.Cells(Weeknr + 6, Day + 2).Value

     'Specifications
       Morning.Offset(0, 3).Value = ExamSchedule.Cells(Weeknr + 3, Day).Value
       Afternoon.Offset(0, 3).Value = ExamSchedule.Cells(Weeknr + 5, Day).Value
       Noon.Offset(0, 3).Value = ExamSchedule.Cells(Weeknr + 7, Day).Value

     'Increment
       Set Morning = Morning.Offset(12, 0)
       Set Afternoon = Afternoon.Offset(12, 0)
       Set Noon = Noon.Offset(12, 0)
     Next Day

    Weeknr = Weeknr + 9
Next CurrWS

ExamSchedule.Activate
      
End Sub
于 2013-01-03T11:33:30.963 回答