正确使用偏移功能和for / while循环

时间:2015-05-11 11:46:54

标签: excel vba excel-vba

VBA新手。所以,请原谅我,如果它非常简单。 我正在为各种公司制作一份Excel表格。注册

我的Excel将第一列(A)记录为company_name,其中必须提供他/她的company_name。

C栏总数没有。公司员工(这包括永久+合同雇员)。

D栏和E栏有员工'姓名只是永久性的。

所以,假设;我的C列值为5;列(D和E)可能包含5个或少于5个Employee名称。 (严格不超过5个员工姓名。如果这些列的名称超过5个;它应该在sheet2中抛出错误消息)

我的下一栏F是指定。这可以包含' 经理' Attender ' 开发人员',' 操作','的 CEO '只允许,不允许其他值。这些值也可以重复(对于不同的员工,如下图所示)

My_Excel

为此我写了下面的代码,它工作正常。

Dim  celadr, celval, celadrI, celvalI, celadrN, celvalN As Variant

Range("F2:F" & LastRow).Select
    ' Selection.Clearformats
    For Each cell In Selection
        celadr = cell.Address
        celval = cell.Value
        celadrI = cell.Offset(0, 4).Address
        celvalI = cell.Offset(0, 4).Value
        celadrN = cell.Offset(0, 9).Address
        celvalN = cell.Offset(0, 9).Value

    If Len(celval) >= 1 Then
        If InStr(1, ("MANAGER,ATTENDER,DEVELOPER,OPERATOR,CEO,"), Trim(UCase(celval) & ",")) < 1 Then
            Range(celadr).Interior.Color = vbRed

            Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "  The Designation is incorrect"
            strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0)
            Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr

        End If
    End If       
    Next

现在我的下一个要求是;对于每个公司,应该至少有一个经理&#39;

如果某个公司没有经理,那么我必须在&#39; Sheet2&#39;作为&#34;他们应该至少是一个经理&#39;对于这家公司&#34; 链接到sheet1中的正确单元格。

我可以在&#39;经理&#39;写在与Company_Name相同的行中。

但是,当经理&#39;经理&#39;时,我不知道怎么做。不是写在Company_Name的同一行。

以下是我的代码,仅适用于指定 - &#39;经理&#39;假定与Company_Name的行写在同一行。

Range("A2:A" & LastRow).Select

    For Each cell In Selection
        celadr = cell.Address
        celval = cell.Value
    If Len(celval) >= 1 Then

            If Trim(cell.Offset(i, 5).Value) <> "Manager" Then 

    cell.Offset(i, 5).Interior.Color = vbRed

    Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company"
    strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0)
    Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr
    End If

    End If
    Next

我尝试编写如下代码来验证&#39; Manager&#39;写在与Company_Name不同的行上。

(我评论了给我错误的部分。)

Range("A2:A" & LastRow).Select
' Selection.Clearformats
For Each cell In Selection
    celadr = cell.Address
    celval = cell.Value
If Len(celval) >= 1 Then
        ' For i = 0 To cell.Offset(0, 2).Value
        If Trim(cell.Offset(i, 5).Value) <> "Manager" Then 'And cell.Offset(1, 0).Value < 1 Then
        ' Do Nothing
' Else
cell.Offset(i, 5).Interior.Color = vbRed

Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company"
strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0)
Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr
End If

' Next i

' If cell.Offset(1, 0).Value >= 1 Then
' End If
 End If
 Next

任何人都可以指导我如何正确使用偏移功能和循环/ while循环/查找功能来验证每个公司至少有一个管理器吗?

1 个答案:

答案 0 :(得分:1)

当您尝试确定某些内容是否缺失时,通常更容易设置布尔值以便在之后使用它来应用正确的过程。

这可以帮到你:

Dim HasManager As Boolean, _
    LastRow As Long
LastRow = ActiveSheet.Range(Rows.Count).End(xlUp).Row

Range("A2:A" & LastRow).Select
'Selection.Clearformats

For Each cell In Selection
    celadr = cell.Address
    celval = cell.Value
    If Len(celval) >= 1 Then
        HasManager = False
        'For i = 0 To cell.Offset(0, 2).Value
        i = 0
        Do While HasManager = False And _
        (cell.Offset(i, 0).Value = "" Or cell.Offset(i, 0).Value = celval) And _
        cell.Offset(i, 0).Row <= LastRow + 1
            If LCase(Trim(cell.Offset(i, 5).Value)) = "manager" Then HasManager = True
            i = i + 1
        Loop

        If HasManager Then
            'The company has at least one Manager
        Else
            'The company doesn't have any Manager
            cell.Offset(i - 1, 5).Interior.Color = vbRed

            Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company"
            strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0)
        End If
    Else
    End If
Next cell