Nazywanie obiektu w Excel VBA, aby można go było wybrać po skopiowaniu do innego arkusza / skoroszytu

1

Amatorsko łączę makro / VBA w Excelu. Polega na skopiowaniu obrazu, który jest legendą w innym języku, z Source.xlsx, i wklejeniu go do Destination.xlsx. Obraz jest taki, że nie jest już Obiektem na Mapie.

Poniższy kod działa. Jednak teraz próbuję wyrównać nowy obraz, aby zastąpił stary xlamLegendGroup w pliku Destination.xlsx. Obecnie wklejam go do pobliskiej komórki („AO6”) i ręcznie go przenoszę.

Mój problem polega na tym, że nie mogę wybrać obrazu, gdy jest on w pliku Destination.xlsx. Gdybym mógł, jestem pewien, że mógłbym wypracować sposób włączenia tych wartości X i Y do mojego VBA ..

Próbowałem nazwać go za pomocą menedżera nazw, ale mój kod go nie rozpoznaje. Próbowałem nawet nazwać go w VBA podczas selekcji, ale po prostu dostaję błędy i niepoprawne metody itp. (Tak jak powiedziałem, amatorskie rozumienie VBA)

Jeśli ktoś z was mógłby mi pomóc w rozwiązaniu problemu nazewnictwa, a następnie ponownym wyborze problemu, byłby bardzo wdzięczny.

Kopiuje obraz ze skoroszytu soure. To jedyny obraz na arkuszu, więc mogę go wybrać w ten sposób

Workbooks("MyWkbSource.xlsx").Sheets("LEGEND_AVG").Activate
ActiveSheet.DrawingObjects.Select
Selection.Copy

Aktywuj skoroszyt docelowy i wkleja obraz. W tym miejscu chciałbym go wyrównać (centrując go u góry) z obrazem, który zamierzam usunąć.

Workbooks(MyWkbDestination.xlsx").Sheets("AVG").Activate
ActiveSheet.Range("AO6").Select
ActiveSheet.Paste

Wybieram istniejący stary obraz i usuwam go

ActiveSheet.Shapes.Range(Array("xlamLegendGroup")).Select
Selection.Delete
RocketGoal
źródło

Odpowiedzi:

0

Kiedy wkleisz obraz, prawdopodobnie otrzyma on nazwę Picture #, gdzie # zwiększa się o 1, jeśli element już istnieje.

W związku z tym należy nazwać pierwszy wklejany obraz Picture 1. Możesz znaleźć nazwy obrazów aktualnie w twoim dokumencie za pomocą:

For Each Shape In ActiveSheet.DrawingObjects
    MsgBox Shape.Name
Next

Spowodowałoby to zapętlenie każdego z nich i pokazanie go w oknie komunikatu.

Podczas wklejania obiektu nie jest łatwo manipulować nim w tym samym ruchu. Możesz użyć powyższej pętli, aby znaleźć ostatnią Picture #, a wtedy będziesz wiedział, że następny wklejony będzie # + 1 i możesz zmienić nazwę w razie potrzeby, używając ActiveSheet.Shapes.Range(Array("Picture #+1")).Name.

Można również użyć .Topi .Leftaby przesunąć obraz wokół miarę potrzeb, jak również .Heighti .Widthjeśli trzeba go zmienić.

Jonno
źródło
Wielkie dzięki. Pójdę i zacznę opracowywać numer zdjęcia i zabiorę go stamtąd
RocketGoal
Dzięki jeszcze raz. Na szczęście udało mi się wybrać mój obraz o tej samej nazwie, co usunąłem. więcej szczęścia niż cokolwiek innego. Ale to działa. Zobacz komentarz do ucznia @ Gary'ego.
RocketGoal
@RocketGoal Cieszę się, że to rozwiązałeś :)
Jonno
0

Ilekroć kopiujesz pojedynczy Obiekt (powiedzmy Kształt) z jednego arkusza na inny lub jeden skoroszyt do drugiego, możesz odwoływać się do obiektu docelowego, sprawdzając jego miejsce w .Count . Na przykład:

Sub CopyShape()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim shp1 As Shape, shp2 As Shape
    Set sh1 = Sheets("Sheet1")
    Set sh2 = Sheets("Sheet2")
    Set shp1 = sh1.Shapes(1)

    shp1.Copy
    sh2.Paste

    Set shp2 = sh2.Shapes(sh2.Shapes.Count)
    shp2.Name = "Most recent Shape on Sheet2"
End Sub

Po zakończeniu kopiowania najnowszy kształt umieszczony w miejscu docelowym pojawi się jako ostatni na liście Kształty tego miejsca docelowego.

Uczeń Gary'ego
źródło
Dziękuję Ci za to. W końcu odkryłem, że kiedy wkleiłem w źródłowych obiektach DrawingObjects i usunąłem początkową grupę xlamLegendGroup, która znajdowała się na arkuszu docelowym, mogłem wybrać nowy „obraz” za pomocą xlamLegendGroup. To wydaje się być szczęściem bardziej niż planowaniem.
RocketGoal
0

Po prostu nazwij kształt niestandardową nazwą. Unikaj liczb po nazwisku.

Np .: Prostokąt 1 zmień go na> Mój prostokąt

Noel Gallardo
źródło
1
Brzmi jak dobry pomysł.    Jak to zrobić? Proszę nie odpowiadać w komentarzach; edytuj  swoją odpowiedź, aby była jaśniejsza i bardziej kompletna.
Scott,