具有实际定位的VBA形状

时间:2017-10-26 17:05:23

标签: vba excel-vba excel

我有这个代码,但它没有按我的意愿工作。 这就是我要的: - 如果我在单元格A1,A2或A3中写入内容(在工作表1中),则会在工作表(2)中创建一个文本框。这有效,但现在我希望文本框的位置在单元格B1,B2,B3中改变。 我尝试使用下面的代码来做到这一点,但我认为我定义Range("B" & CStr(i))的方式可能存在问题,因为当我使用B1时它起作用。 我需要改变代码两个不同的做两件事: 1-如果我写在B1" cliente"我希望带有来自A1的文本的texbox在toppos = 150中创建,如果我将其更改为" financeiro"我希望在toppos = 20中创建texbox。

2-如果B1和B2有" fianceiro"我希望与A1和A2相关的文本框彼此相邻。 有人能帮我吗? 谢谢

所以这就是我想要的: - 使用工作表2上的单元格A1到A3的内容创建的文本框; - 如果我更改内容,应更新文本框的内容,如果我删除该值,则应删除文本框; - 文本框的位置应该随着我在B列中选择的选项而改变。我希望工作表(2)有4个"切片",第一个是选项" financeiro" ,因此与该页面相关的所有文本框都应位于工作表中的特定位置,例如,位置20,如果另一方面该文本框来自选项" cliente",文本框应该在" cliente",位置150的切片中。 - 而且B列中的每个选项可能有多个文本框,所以我希望同一选项中的文本框并排显示。

Worksheet(1)

RealWorksheet(2)

idealWorksheet(2)

Sub removercaixas(strName As String)
    Dim shp As Shape
    For Each shp In Worksheets(2).Shapes
        If shp.Type = msoTextBox And shp.Name = strName Then shp.Delete
    Next shp
End Sub

Sub criarcaixastexto(strName As String)
    Dim wsActive As Worksheet
    Dim box As Shape

    Set wsActive = Worksheets(2)

    Dim leftpos As Long
    Dim toppos As Long
    Dim i As Long

    For i = 1 To 3

        If Worksheets(1).Range("B" & CStr(i)).Value = "financeiro" Then
            toppos = 20
        ElseIf Worksheets(1).Range("B" & CStr(i)).Value = "cliente" Then
            toppos = 150
        ElseIf Worksheets(1).Range("B" & CStr(i)).Value = "processos internos" Then
            toppos = 250
        Else:
            toppos = 350
        End If
    Next i

    Select Case strName
        Case Is = "$A$1"
            leftpos = 50
        Case Is = "$A$2"
            leftpos = 200
        Case Is = "$A$3"
            leftpos = 350

    End Select

    Set box = wsActive.Shapes.AddTextbox(msoTextOrientationHorizontal, leftpos, toppos, 100, 50)
    box.TextFrame.Characters.Text = Worksheets(1).Range(strName).Value
    box.Name = strName
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    Select Case Target.Address
        Case "$A$1", "$A$2", "$A$3"
            removercaixas (Target.Address)
            If Len(Target) > 0 Then criarcaixastexto (Target.Address)
        Case Else
            Exit Sub
    End Select
End Sub

1 个答案:

答案 0 :(得分:2)

我不确定OP的某些逻辑或者他想要完成的事情。我会创建一个函数来创建文本框,如果需要,并返回对它的引用,而不是添加和删除文本框。

cocoapods 1.4.1 beta 2