根据输入的行数/列数创建表

时间:2017-07-24 07:40:06

标签: excel excel-vba vba

我希望能够根据2个问题的答案建立一个表格,问题1和#34;当前流程中有多少风险?"确定列数(即每个风险一个)和第二个问题"当前流程中有多少个控件?"确定要使用的行数(即每个控件一个)。有没有一种简单的方法可以构建一个表来显示一个矩阵,然后可以将其用于风险/控制关系?

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个有趣的,所以我打算今晚晚些时候制作一个YouTube tutorial并回到这里发布我的链接。但这里是我所做的快速解释。

我开始使用A2单元格用于#行,而B2单元格用于#列。然后我创建了一个按钮,我将其分配给一个宏,稍后解释一下。

接下来,我为表格创建了基本布局。这包括:
D5保留“控制ID”
E5举行“控制说明”
F3持有“风险ID”
F4举行“风险描述”

另外,让我们首先添加第一个Control和Risk块,因为每个表可能以至少1个控制和1个风险开始。所以
D6将有“C1” E6将拥有“控制1说明”
G3将有“R1” G4将有“风险1说明”

然后为了与您的桌子保持一致,我在单元格F5G5上添加了黑色突出显示。

现在我们可以使用以下代码创建宏:

Sub CreateTable()
    ' create variable x to hold # of rows from A2
    Dim x As Integer
    x = Range("A2").Value
    ' calculate the row range from x
    Let RowRange = "7:" & 7 + x - 2
    ' copy row 6 into each row in the calculated range
    Rows("6:6").Copy Range(RowRange)
    ' update the text in the newly created rows to match 
    ' the corresponding control number
    For i = 2 To x
        Let ControlIdRow = 5 + i
        Cells(ControlIdRow, 4).Value = "C" & i
        Cells(ControlIdRow, 5).Value = "Control " & i & " Description"
    Next i

    Dim y As Integer
    y = Range("B2").Value
    Columns("G:G").Copy Range(Columns(8), Columns(8 + y - 2))
    For i = 2 To y
        Let RiskIdCol = 6 + i
        Cells(3, RiskIdCol).Value = "R" & i
        Cells(4, RiskIdCol).Value = "Risk " & i & " Description"
    Next i
End Sub

基本上发生的事情是我们创建一个变量x并将其分配为行数,作为来自单元格A2的输入。然后我们用它来计算从第7行开始的行范围(由于控制1在第6行,因此将从控制2开始)。然后我们只将整行6复制到指定范围。现在(从For循环开始),我们需要编辑单元格中的文本以匹配相应的名称(即第二个控件将是C2,控件2描述,第三个将是C3,控件3描述3 , 等等)。然后只是重复相同的块,更改相应的值以匹配风险。

然后不要忘记将按钮分配给新宏。现在,您应该能够输入行(A2)的值和列(B2)的值,然后单击按钮,它将自动为您创建表。

如前所述,我将在今晚晚些时候创建一个YouTube视频,详细说明这一点并更新此答案。

<强>更新
我注意到你的图片中有一个复选标记,所以这里的代码只能选择一个单元格并在单元格中出现绿色复选标记。然后再次单击该单元格将删除复选标记。

打开visual basic编辑器,然后单击左侧的Sheet 1代码。然后在其中应用以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If ActiveCell.Row > 5 And ActiveCell.Column > 6 Then
        If ActiveCell.Value = "" Then
            Target.Value = ChrW(&H2713)
        Else
            If ActiveCell.Value = ChrW(&H2713) Then
                Target.Value = ""
            End If
        End If
    End If
End Sub

Link to YouTube Tutorial on this answer