0

请让我解释一下我想做什么:

(1) 我创建了一个 Excel 工作簿,人们可以在其中编写流程的各个步骤。假设它写在名为“Process A”的工作表上。在每个步骤右侧的单元格中,该人员可以指定该步骤是否需要圆形(用于连接器)、菱形(用于决策)或矩形(用于流程步骤)。

(2) 对于名为“流程 A”的工作表中的每个步骤,我还有条件公式,指示我希望将形状放置在另一张工作表上的位置(左、上、宽、高)(我们称之为“流程图 A” )。如果你想试试这个,我列出的坐标如下: LEFT > Connectors = 147; 流程和决策 = 49

宽度 > 连接器 = 90;流程和决策 = 286

形状的高度 > 连接器 = 90;流程和决策 = 210

箭头的高度 > 所有箭头 = 60

TOP >(基于前一个形状的顶部 + 前一个形状的高度 + 箭头的长度的计算)。例如,如果形状 1 是连接器,形状 2 是进程,那么形状 2 从 150 开始(假设形状 1 的顶部从 0 开始... [0 + 90 + 60]

下面的代码确实生成了所有的形状,但是它将它们全部堆叠在顶点零 (0) 处。

Sub TestRun()

Dim ws1 As Worksheet
Set ws1 = Worksheets("Process A")

Dim LDS As Shape

Dim ws2 As Worksheet
Set ws2 = Worksheets("Sheet2")


Dim LEFT As Integer
Dim TOP As Integer
Dim WIDTH As Integer
Dim HEIGHT As Integer

Dim LRange As Range
For Each LRange In ws1.Range("T2:T23")
LEFT = LRange.Value
Next LRange

Dim TRange As Range
For Each TRange In ws1.Range("U2:U23")
TOP = TRange.Value
Next TRange

Dim WRange As Range
For Each WRange In ws1.Range("V2:V23")
WIDTH = WRange.Value
Next WRange

Dim HRange As Range
For Each HRange In ws1.Range("W2:W23")
HEIGHT = HRange.Value
Next HRange

Dim ShpRange As Range
For Each ShpRange In ws1.Range("D2:D23")
If ShpRange.Value = "Connector" Then
Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartConnector, LEFT, TOP, WIDTH, HEIGHT)

ElseIf ShpRange.Value = "Process" Then
Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartProcess, LEFT, TOP, WIDTH, HEIGHT)

ElseIf ShpRange.Value = "Decision" Then
Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartDecision, LEFT, TOP, WIDTH, HEIGHT)

End If


Next ShpRange

End Sub

我在编码的位置上尝试了以下变化:

(1) 列出“For Each”语句及其条件。然后列出所有的“下一个语句”。(2) 一起列出所有“For Each”语句,然后是一起列出的所有条件语句,然后是一起列出的所有“Next Statements”。

当我在这些编辑后运行宏时,我收到“编译错误:无效的下一个控制变量引用”。

我是 VBA 的新手,并且尝试了很多方法来完成这项工作,但我觉得我一次又一次地撞到了一堵砖墙。非常感谢您的帮助!先感谢您!

4

1 回答 1

0

您可以将其简化为一个For Each循环,使用Offset相对于您循环的范围来引用不同的列。

例如,此代码循环遍历T2:T23,然后使用正偏移量引用 UW 列,并使用负偏移量引用 D 列。

使用Select Case语句可以简化连接器、过程或决策的选择。

Option Explicit

Sub TestRun()
    Dim ws1 As Worksheet: Set ws1 = Worksheets("Process A")
    Dim ws2 As Worksheet: Set ws2 = Worksheets("Sheet2")
    Dim LDS As Shape
    Dim Left As Integer, Top As Integer, Width As Integer, Height As Integer
    Dim rng As Range

    For Each rng In ws1.Range("T2:T23")
        Left = rng.Value
        Top = rng.Offset(, 1).Value
        Width = rng.Offset(, 2).Value
        Height = rng.Offset(, 3).Value

        Select Case rng.Offset(, -16).Value
            Case "Connector"
                Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartConnector, Left, Top, Width, Height)
            Case "Process"
                Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartProcess, Left, Top, Width, Height)
            Case "Decision"
                Set LDS = ws2.Shapes.AddShape(msoShapeFlowchartDecision, Left, Top, Width, Height)
        End Select
    Next rng

End Sub
于 2018-07-30T22:24:50.983 回答