Excel复选框和数组

问题描述 投票:0回答:1

我正在为与之合作的团队创建项目跟踪器,我想在单个行中复制单个项目的所有项目信息。然后,该行中的2列将是“任务完成”和“日期完成”。

当前,我正在使用数据验证列表在任务完成单元格中选择“完成”。当列出“完成”时,“完成日期”将自动填充“今天”日期。我是通过excel中的简单功能来实现的。

我已经创建了VBA代码,因此单击了命令按钮,它将突出显示行中的特定单元格,复制这些单元格,将其粘贴到空白工作表中,然后清除任务并为完成的单元格添加日期。

我已经使用了其中的大多数功能,但是遇到了障碍,那就是让excel仅将空白工作表中的数据复制到空白行(行A1,A2,A3等)中。我不确定如何使代码将数据复制为空行。我知道可以通过使用变量(i)和循环来实现。

我的另一个问题是,我本来希望使用复选框而不是经过验证的列表,但是似乎在使用复选框设置格式方面存在问题。如果必须更改行的大小以适合文本,则复选框将挤满其他单元格。这仅仅是Excel中Forms / activeX的缺陷,还是我错过了更大的画面?

我尝试使用数组来检查“任务完成”列,而不是使用单个If语句来添加日期。附件是我的代码示例:

Dim pjt As Worksheet
Dim datawks As Worksheet
Dim myBook As Workbook  'define worksheets and workboook
Set myBook = Excel.ActiveWorkbook
Set pjt = myBook.Sheets("Project Tracker")
Set datawks = myBook.Sheets("DATA")

Dim tskarray(16) As String
     tskarray(0) = Range("K4")
     tskarray(1) = Range("k5")
     tskarray(2) = Range("k6")
     tskarray(3) = Range("k7")
     tskarray(4) = Range("k8")
     tskarray(5) = Range("k9")
     tskarray(6) = Range("k10")
     tskarray(7) = Range("k11")
     tskarray(8) = Range("k12")
     tskarray(9) = Range("k13")
     tskarray(10) = Range("k14")
     tskarray(11) = Range("k15")
     tskarray(12) = Range("k16")
     tskarray(13) = Range("k17")
     tskarray(14) = Range("k18")
     tskarray(15) = Range("k19")
     tskarray(16) = Range("k20")


        If tskarray(0) = "Complete" Then
            Range("A4,B4,D4,F4,G4,J4,L4").Select
            Selection.Copy
            datawks.Select
            datawks.Cells(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks _
                :=False, Transpose:=False
            Sheets("Project Tracker").Select
            Application.CutCopyMode = False
            pjt.Range("J4,K4").Select
            Selection.ClearContents

        Else
        Debug.Print ("No Task to Complete")
        End If
excel vba checkbox activex
1个回答
0
投票

我相信这将完成您提到的循环(至少针对每个问题)的任务。

Dim tskarray() As String
ReDim tskarray(0 To 16)
Dim ArrayElementCount As Long
Dim RowCount As Long
RowCount = 3 'this will increment by 1 at the start of the loop so after the last iteration it will end at 16 not 17

For ArrayElementCount = 0 To UBound(tskarray)
    RowCount = RowCount + 1
    tskarray(ArrayElementCount) = pjt.Range("K" & RowCount) 'Assuming on pjt sheet.
Next ArrayElementCount

Dim TargetCell As Range
Dim LastRow As Long
RowCount = 3
For ArrayElementCount = 0 To UBound(tskarray)
    RowCount = RowCount + 1
    If tskarray(ArrayElementCount) = "Complete" Then
        For Each TargetCell In pjt.Range("A" & RowCount & ": L" & RowCount) 'Also assuming on pjt sheet
        If TargetCell.Column = 3 Or TargetCell.Column = 5 Or TargetCell.Column = 8 Or TargetCell.Column = 9 Or TargetCell.Column = 11 Then
                'Ignore columns C, E, H, I and K
            Else
                With datawks
                    LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                    .Cells(LastRow, 1).Value = TargetCell.Value
                End With
            End If
        Next TargetCell
        pjt.Range("J" & RowCount & ":K" & RowCount).ClearContents 'Change the column letters if the range should be bigger. 
    Else
        Debug.Print ("No Task to Complete")
    End If
Next ArrayElementCount
© www.soinside.com 2019 - 2024. All rights reserved.