Невозможно выбрать фигуру по имени, используя значение ячейки

Я сделал несколько попыток выбрать фигуру (изображение) на листе по ее имени.

У меня есть имена изображений в виде штрих-кодов, я попытался преобразовать имя формы в двойное, затем добавил изображение к каждому имени формы и преобразовал значение ячейки в строку.

Я попробовал функцию StrComp с параметрами vbText и vbBinary.

Я также пытался проверить типы Shape.Name и Cells.Value. Их 8 (струнные) и 5 ​​(двойные). Когда я присваиваю номер переменной a (тип 3 - LongInt) # добавляется, когда макрос запускается, а затем выбираю Shape.Name(cStr(a)) он работает(

For i = 2 To 224
    Sheets("Pilot products").Activate
    a = CStr(ActiveSheet.Cells(i, 9).Value)

    'a = CLng(a)
    'MsgBox (VarType(a))
    'Sheets("images").Activate
    For Each sh In ActiveSheet.Shapes
        If CStr(sh.Name) = CStr("Picture " + a) Then
        sh("Picture " + a).Select
        Selection.Copy
        Sheets("Pilot products").Cells(i, 10).Select
        ActiveSheet.Paste
        Else: MsgBox CStr(a)
        End If
    Next sh

Next i

person Elina    schedule 22.11.2020    source источник
comment
Конкатенация строк в VBA это &.   -  person JMP    schedule 22.11.2020


Ответы (1)


Копировать фигуры из списка (словарь)

Кодекс

Option Explicit

Sub copyShapes()
    
    With CreateObject("Scripting.Dictionary")
        ' Allow case-insensitivity e.g. 'Picture = PICturE'.
        .CompareMode = vbTextCompare
        ' Define workbook.
        Dim wb As Workbook
        Set wb = ThisWorkbook ' The workbook containing this code.
        ' Define Source Worksheet.
        Dim src As Worksheet
        Set src = wb.Worksheets("Images")
        ' Write the names of its shapes to the Dictionary.
        Dim shp As Shape
        For Each shp In src.Shapes
            .Item(shp.Name) = Empty
        Next shp
        ' Check if any shapes were found.
        If .Count > 0 Then
            ' Define Destination Worksheet.
            Dim dst As Worksheet
            Set dst = wb.Worksheets("Pilot products")
            ' Declare variables.
            Dim i As Long
            Dim ShapeIndex As String
            Dim ShapeName As String
            ' Loop through cells containing the shape indexes and copy
            ' the found shapes in the Dictionary from Source Worksheet
            ' to Destination Worksheet.
            For i = 2 To 224
                ShapeIndex = CStr(dst.Cells(i, 9).Value)
                If ShapeIndex <> "" And ShapeIndex <> "0" Then
                    ShapeName = "Picture " & ShapeIndex
                    If .Exists(ShapeName) Then
                        src.Shapes(ShapeName).Copy
                        dst.Paste Destination:=dst.Cells(i, 10)
                    Else
                      ' A shape (picture) with this number doesn't exist.
                    End If
                Else
                  ' NumStr is either "" or "0".
                End If
            Next i
        Else
          ' Dictionary is empty i.e. no shapes found.
        End If
    End With

End Sub

Если вы не слишком хорошо знакомы с объектом Dictionary, вам следует использовать его следующим образом: (Обратите внимание на '***, обозначающий изменения.)

Sub copyShapes2()
    
    Dim dict As Object '***
    Set dict = CreateObject("Scripting.Dictionary") '***
    ' Allow case-insensitivity e.g. 'Picture = PICturE'.
    dict.CompareMode = vbTextCompare '***
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook ' The workbook containing this code.
    ' Define Source Worksheet.
    Dim src As Worksheet
    Set src = wb.Worksheets("Images")
    ' Write its shape names to the Dictionary.
    Dim shp As Shape
    For Each shp In src.Shapes
        dict(shp.Name) = Empty '***
    Next shp
    
    If dict.Count > 0 Then '***
        ' Define Destination Worksheet.
        Dim dst As Worksheet
        Set dst = wb.Worksheets("Pilot products")
        ' Declare variables.
        Dim i As Long
        Dim NumStr As String
        Dim ShapeName As String
        ' Loop through cells containing the shape indexes and copy
        ' the found shapes in the Dictionary from Source Worksheet
        ' to Destination Worksheet.
        For i = 2 To 224
            NumStr = CStr(dst.Cells(i, 9).Value)
            If NumStr <> "" And NumStr <> "0" Then
                ShapeName = "Picture " & NumStr
                If dict.Exists(ShapeName) Then '***
                    src.Shapes(ShapeName).Copy
                    dst.Paste Destination:=dst.Cells(i, 10)
                Else
                  ' A shape (picture) with this number doesn't exist.
                End If
            Else
              ' NumStr is either "" or "0".
            End If
        Next i
    Else
      ' Dictionary is empty i.e. no shapes found.
    End If

End Sub
person VBasic2008    schedule 22.11.2020
comment
Это потрясающе. Скоро попробую. Не ожидал такого подробного ответа так быстро. Большое спасибо! Я был действительно в отчаянии сегодня и потратил много времени на поиск решения! - person Elina; 22.11.2020
comment
Все работает. Я только не понял строчку .Item(shp.Name) = Empty.. - person Elina; 22.11.2020
comment
Он добавляет имя формы в словарь. Словарь содержит пару значений, обычно обозначаемую как Key и Value: .Item — это Key, а .Item(Key) — это Value. Строка записывает имя формы в Key и Empty в Value, потому что нам не нужен Value. Узнайте о словаре здесь. - person VBasic2008; 22.11.2020
comment
Я добавил немного измененную версию с более удобным использованием словаря. Вы должны использовать этот способ при ознакомлении с ним. - person VBasic2008; 23.11.2020
comment
Благодарю вас! У меня было представление о ключе, но то, как добавлялся новый элемент, меня смутило, будто я ожидал что-то вроде .add или .append... И более того, я думал, что VBA не поддерживает словари и не думал об этом во-первых, а во-вторых, не могли представить, что shape.name можно использовать как ключ, а не как элемент. - person Elina; 23.11.2020