Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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_Vba - Fatal编程技术网

Excel 循环中的类型不匹配错误,该循环在列中递增地添加数字

Excel 循环中的类型不匹配错误,该循环在列中递增地添加数字,excel,vba,Excel,Vba,我正在创建一个子系统,该子系统创建特定月份/年度的时间表。代码基于。微软的代码创建了一个新的应用程序。我正在修改代码,在一列中插入一周中的几天,如 我修改后的代码正确地将数字1插入对应于每月第一天的单元格中,但添加后续日期数字的循环不起作用Cell.Value=Cell.Offset(-1,0)。Value+1给出类型不匹配错误。这是我修改后的代码: Sub Calendar_Genorator1() Dim WS As Worksheet Dim MyInput As Variant Dim

我正在创建一个子系统,该子系统创建特定月份/年度的时间表。代码基于。微软的代码创建了一个新的应用程序。我正在修改代码,在一列中插入一周中的几天,如

我修改后的代码正确地将数字1插入对应于每月第一天的单元格中,但添加后续日期数字的循环不起作用
Cell.Value=Cell.Offset(-1,0)。Value+1给出类型不匹配错误。这是我修改后的代码:

Sub Calendar_Genorator1()
Dim WS As Worksheet
Dim MyInput As Variant
Dim StartDay As Variant
Dim DayofWeek As Variant
Dim CurYear As Variant
Dim CurMonth As Variant
Dim FinalDay As Variant
Dim Cell As Range
Dim RowCell As Long
Dim ColCell As Long

Set WS = ActiveWorkbook.ActiveSheet

MyInput = InputBox("Type in Month and year for Calendar ")
    If MyInput = "" Then Exit Sub
       ' Get the date value of the beginning of inputted month.
       StartDay = DateValue(MyInput)
       ' Check if valid date but not the first of the month
       ' -- if so, reset StartDay to first day of month.
       If Day(StartDay) <> 1 Then
           StartDay = DateValue(Month(StartDay) & "/1/" & Year(StartDay))
       End If
       ' Prepare cell for Month and Year as fully spelled out.
       'Range("B3").NumberFormat = "d-mmmm"
       
       'Set headers
       Range("a1").Value = Application.Text(MyInput, "mmmm") & " Time Sheet"
       Range("a2") = "Day"
       Range("b2") = "Date"
       Range("c2") = "Time In"
       Range("d2") = "Time Out"
       Range("e2") = "Hours"
       Range("f2") = "Notes"
       Range("g2") = "Overtime"
       
       'Set weekdays
       Range("a3") = "Sunday"
       Range("a4") = "Monday"
       Range("a5") = "Tuesday"
       Range("a6") = "Wednesday"
       Range("a7") = "Thursday"
       Range("a8") = "Friday"
       Range("a9") = "Saturday"
       
       DayofWeek = Weekday(StartDay)
       ' Set variables to identify the year and month as separate variables.
       CurYear = Year(StartDay)
       CurMonth = Month(StartDay)
       ' Set variable and calculate the first day of the next month.
       FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
       ' Place a "1" in cell position of the first day of the chosen month based on DayofWeek.
       Select Case DayofWeek
           Case 1
               Range("b3").Value = 1
           Case 2
               Range("b4").Value = 1
           Case 3
               Range("b5").Value = 1
           Case 4
               Range("b6").Value = 1
           Case 5
               Range("b7").Value = 1
           Case 6
               Range("b8").Value = 1
           Case 7
               Range("b9").Value = 1
       End Select
       
       'Loop through range b3:b44 incrementing each cell after the "1" cell.
       For Each Cell In Range("b3:b44")
           RowCell = Cell.Row
           ColCell = Cell.Column
           ' Do if "1" is in column B or 2.
           If Cell.Row = 1 And Cell.Column = 2 Then
           ' Do if current cell is not in 1st column.
           ElseIf Cell.Row <> 1 Then
               If Cell.Offset(-1, 0).Value >= 1 Then
                   Cell.Value = Cell.Offset(-1, 0).Value + 1 'Type Mismatch Error here
                   ' Stop when the last day of the month has been entered.
                   If Cell.Value > (FinalDay - StartDay) Then
                       Cell.Value = ""
                       ' Exit loop when calendar has correct number of days shown.
                       Exit For
                   End If
               End If
           End If
       Next
End Sub
子日历\u Genorator1()
将WS设置为工作表
Dim MyInput作为变量
变光起始日期
暗淡的星期日作为变体
作为变体的模糊CurYear
作为变体的Dim CurMonth
黯淡的最后一天
暗淡单元格作为范围
暗淡的长细胞
阴暗的阴沟和阴沟一样长
设置WS=ActiveWorkbook.ActiveSheet
MyInput=InputBox(“输入日历的月份和年份”)
如果MyInput=“”,则退出Sub
'获取输入月份开始的日期值。
StartDay=DateValue(MyInput)
'检查是否为有效日期,但不是当月的第一天
--如果是,请将StartDay重置为每月的第一天。
如果日期(开始日期)为1,则
StartDay=日期值(月(StartDay)和“/1/”年(StartDay))
如果结束
'按照完整的说明,为月份和年份准备单元格。
'范围(“B3”).NumberFormat=“d-mmmm”
'设置标题
范围(“a1”)。值=应用程序。文本(MyInput,“mmmm”)和“时间表”
范围(“a2”)=“天”
范围(“b2”)=“日期”
范围(“c2”)=“时间范围”
范围(“d2”)=“超时”
范围(“e2”)=“小时”
范围(“f2”)=“注释”
范围(“g2”)=“超时”
“设定工作日
范围(“a3”)=“星期日”
范围(“a4”)=“星期一”
范围(“a5”)=“星期二”
范围(“a6”)=“星期三”
范围(“a7”)=“星期四”
范围(“a8”)=“星期五”
范围(“a9”)=“星期六”
DayofWeek=工作日(StartDay)
'设置变量以将年和月标识为单独的变量。
CurYear=年(开始日期)
CurMonth=月(开始日期)
'设置变量并计算下个月的第一天。
FinalDay=DateSerial(CurYear,CurMonth+1,1)
'根据DayofWeek,在所选月份第一天的单元格位置放置一个“1”。
选择案例DayofWeek
案例1
范围(“b3”)。值=1
案例2
范围(“b4”)。值=1
案例3
范围(“b5”)。值=1
案例4
范围(“b6”)。值=1
案例5
范围(“b7”)。值=1
案例6
范围(“b8”)。值=1
案例7
范围(“b9”)。值=1
结束选择
'循环范围b3:b44,在“1”单元格之后递增每个单元格。
对于范围内的每个单元格(“b3:b44”)
RowCell=单元格。行
ColCell=Cell.Column
'如果“1”在B列或2列中,则执行此操作。
如果Cell.Row=1,Cell.Column=2,则
'如果当前单元格不在第1列中,则执行此操作。
ElseIf单元格。然后是第1行
如果Cell.Offset(-1,0).Value>=1,则
Cell.Value=Cell.Offset(-1,0)。这里的Value+1'类型不匹配错误
'输入当月最后一天后停止。
如果Cell.Value>(FinalDay-StartDay),则
Cell.Value=“”
'当日历显示正确的天数时退出循环。
退出
如果结束
如果结束
如果结束
下一个
端接头
我更改了循环中的参数,以便在B列中以增量方式插入天数,我怀疑错误与此有关。关于我为什么在
Cell.Value=Cell.Offset(-1,0).Value+1
时出错的原因,有什么想法吗?

月历
选项显式
子日历\u Genorator1()
常量TitleAddress为String=“A1”
常量HeadersAddress为String=“A2”
Const DaysAddress As String=“A3”
变暗标题作为变量
Headers=数组(“天”、“日期”、“时间”、“超时”、“小时”_
“备注”、“加班”)
Dim MyInput作为变量,StartDay作为变量
MyInput=InputBox(“为日历输入设置月份和年份”)
如果MyInput=“”,则退出Sub
'获取输入月份开始的日期值。
StartDay=DateValue(MyInput)
'检查是否为有效日期,但不是当月的第一天
--如果是,请将StartDay重置为每月的第一天。
如果日期(开始日期)为1,则
StartDay=日期值(月(StartDay)和“/1/”年(StartDay))
如果结束
将ws设置为工作表
设置ws=ActiveWorkbook.ActiveSheet
“写标题。
ws.Range(TitleAddress).Value=Application.Text(起始日期,“mm”)_
&“时间表”
'写入标题。
ws.Range(HeadersAddress).Resize(,UBound(Headers))=头
“写几天。
变暗目标
目标=getDDDD_D_US(月(起始日),年(起始日))
ws.Range(DaysAddress).Resize(UBound(Target),UBound(Target,2)).Value=Target
端接头
函数getDDDD_D_US(setMonth尽可能长,setYear尽可能长)
Dim DaysData作为变体
DaysData=数组(“星期日”、“星期一”、“星期二”、“星期三”、“星期四”_
“星期五”、“星期六”)
作为变量的模糊结果
重拨结果(1到42,1到2)
'编写DDDD列。
我长,j长,k长
对于i=1到6
k=(i-1)*7+1
对于j=0到6
结果(k+j,1)=日数据(j)
下一个j
接下来我
'写D列。
暗电流作为日期
当前=日期序列(设置年、设置月、1)
i=工作日(当前)
对于i=i到i+27
结果(i,2)=天(当前)
电流=电流+1
接下来我
对于i=i到i+2
如果月份(当前)=设置月份,则
结果(i,2)=天(当前)
Option Explicit

Sub Calendar_Genorator1()

    Const TitleAddress As String = "A1"
    Const HeadersAddress As String = "A2"
    Const DaysAddress As String = "A3"
    Dim Headers As Variant
    Headers = Array("Day", "Date", "Time In", "Time Out", "Hours", _
                    "Notes", "Overtime")

    Dim MyInput As Variant, StartDay As Variant
    MyInput = InputBox("Type in setMonth and year for Calendar ")
    If MyInput = "" Then Exit Sub
    ' Get the date value of the beginning of inputted Month.
    StartDay = DateValue(MyInput)
    ' Check if valid date but not the first of the Month
    ' -- if so, reset StartDay to first day of Month.
    If Day(StartDay) <> 1 Then
        StartDay = DateValue(Month(StartDay) & "/1/" & Year(StartDay))
    End If

    Dim ws As Worksheet
    Set ws = ActiveWorkbook.ActiveSheet
    ' Write title.
    ws.Range(TitleAddress).Value = Application.Text(StartDay, "mmmm") _
                                   & " Time Sheet"
    ' Write headers.
    ws.Range(HeadersAddress).Resize(, UBound(Headers)) = Headers
    ' Write days.
    Dim Target As Variant
    Target = getDDDD_D_US(Month(StartDay), Year(StartDay))
    ws.Range(DaysAddress).Resize(UBound(Target), UBound(Target, 2)).Value = Target

End Sub

Function getDDDD_D_US(setMonth As Long, setYear As Long)
    Dim DaysData As Variant
    DaysData = Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", _
                     "Friday", "Saturday")
    Dim Result As Variant
    ReDim Result(1 To 42, 1 To 2)
    ' Write DDDD column.
    Dim i As Long, j As Long, k As Long
    For i = 1 To 6
        k = (i - 1) * 7 + 1
        For j = 0 To 6
            Result(k + j, 1) = DaysData(j)
        Next j
    Next i
    ' Write D column.
    Dim Current As Date
    Current = DateSerial(setYear, setMonth, 1)
    i = Weekday(Current)
    For i = i To i + 27
        Result(i, 2) = Day(Current)
        Current = Current + 1
    Next i
    For i = i To i + 2
        If Month(Current) = setMonth Then
            Result(i, 2) = Day(Current)
            Current = Current + 1
        End If
    Next i
    getDDDD_D_US = Result
End Function