反问题vba

时间:2017-06-29 19:29:21

标签: vba excel-vba excel

在vba上真的很糟糕....

1)我正在尝试计算过期任务的数量。目前还不算数。

2)当我按f5时,即使我已经删除了页面中的所有信息,它也会进入下一列 例如,如果我删除了第1列,即使第1列中没有信息,它也会转到第2列。

Sub data_input_overdue()

    Dim rw As Long
    Dim Counter As Long

    Dim col As Long
    col = CountMyCols("Stats")

    Worksheets("Stats").Cells(2, col + 1).Value = "Overdue"

    Counter = 0


    For Each sht In ThisWorkbook.Sheets

        For i = 2 To CountMyRows(sht.Name)
            c_date = Range("E" & i)
            dueDate = CDate(c_date)
            If dueDate < Date And sht.Range("I" & i).Value = "No" Then
            Counter = Counter + CLng(1)
            Worksheets("Stats").Cells(i, col + 1).Value = Counter
        End If
        Next i
    Next sht
End Sub

Function CountMyCols(SName As String) As Long
    CountMyCols = ThisWorkbook.Worksheets(SName).UsedRange.Columns.Count
End Function

1 个答案:

答案 0 :(得分:0)

替换CountMyCols功能可能是:

Public Function CountMyCols(SName As String) As Long
    On Error Resume Next
    With ThisWorkbook.Worksheets(SName)
        CountMyCols = .Cells.Find(What:="*", _
                                  After:=.Range("A1"), _
                                  Lookat:=xlPart, _
                                  LookIn:=xlFormulas, _
                                  SearchOrder:=xlByColumns, _
                                  SearchDirection:=xlPrevious, _
                                  MatchCase:=False).Column
    End With
End Function

这是基于现已退役的StackOverflow文档中的一个示例:

Private Sub Get_Last_Used_Row_Index()
    Dim wS As Worksheet

    Set wS = ThisWorkbook.Sheets("Sheet1")
    Debug.Print LastCol_1(wS)
    Debug.Print LastCol_0(wS)
End Sub

如果您想知道工作表中是否没有数据,您可以选择2个选项:

否:使用LastCol_1:您可以直接在wS.Cells(...,LastCol_1(wS))中使用它

是:使用LastCol_0:在使用之前,你需要测试你从函数得到的结果是否为0

Public Function LastCol_1(wS As Worksheet) As Double
    With wS
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            LastCol_1 = .Cells.Find(What:="*", _
                                After:=.Range("A1"), _
                                Lookat:=xlPart, _
                                LookIn:=xlFormulas, _
                                SearchOrder:=xlByColumns, _
                                SearchDirection:=xlPrevious, _
                                MatchCase:=False).Column
        Else
            LastCol_1 = 1
        End If
    End With
End Function

在函数退出时,Err对象的属性会自动重置为零。

Public Function LastCol_0(wS As Worksheet) As Double
    On Error Resume Next
    LastCol_0 = wS.Cells.Find(What:="*", _
                            After:=ws.Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByColumns, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Column
End Function