Bilder bedingt zum Blasendiagramm hinzufügen?

511
smac

Ich muss Blasendiagramme für eine große Gruppe von Peer-Gruppen in Massenproduktion produzieren, wobei jedes Chart anonymisierte Peer-Group-Daten anzeigt, die Gruppe jedoch mit ihrem Teamlogo hervorhebt. Ich würde dies gerne mit VBA automatisieren, frage mich aber, ob es überhaupt möglich ist, die Blase des Interesses in jedem Diagramm mit einem Bild zu versehen. Im Moment ist es ein manueller Prozess, der viel Zeit in Anspruch nimmt.

In Diagramm 1 ist beispielsweise Team A das Team von Interesse, bei dem das Logo auf der Bubble angezeigt wird, während die verbleibenden Bubbles die gleiche einfarbige Farbe haben. In Grafik 2 ist Team B das Team von Interesse usw.

1
Versuchen Sie, ein Makro zu erfassen, während Sie es manuell ausführen. Wenn Sie es aufzeichnen können und auch die Bedingungen klar definieren können, ist es durchaus möglich, dies mit VBA zu tun. Máté Juhász vor 8 Jahren 0
Danke, Kumpel. Ich habe es ausprobiert, aber es wählt die interessierende Blase aus, auf die das Logo angewendet werden soll, das mich aufhängt. Aus dem Makro scheinen die Blasen eine Nummer zu bekommen, aber selbst wenn ich die Zahlen in der VBA hart codiert habe, müsste ich sie jeden Monat neu machen, um neue und sich ändernde Daten zu berücksichtigen. smac vor 8 Jahren 0
Post das Makro und einige Beispieldaten, und vielleicht können wir helfen, es zu beheben. Máté Juhász vor 8 Jahren 0

2 Antworten auf die Frage

0
Captain Kirk

Ich kann keinen Kommentar posten. Ein Teil des Problems besteht jedoch darin, dass Sie die Daten und Diagramme jedes Mal neu generieren. Daher ist die zu verwendende Lösung normalerweise "Indirektion". Lösen Sie ein einfacheres Problem.

Könnten Sie ein verstecktes Blatt haben, auf dem sich alle Logos befinden. Neben den Logos befindet sich die Nummer, die diesem Logo entspricht (entweder das Logo oder der Dateiname des Logos).

Schreiben Sie als Nächstes ein Makro, das, wenn diese Zahlen korrekt sind, das gewünschte Logo ordnungsgemäß zuweist (dh Sie aktualisieren einfach dieses Blatt und verwenden dieses Blatt als Array in der VBA).

Wenn Sie schließlich das Blatt versenden, aktualisieren Sie immer nur EIN Logo, dann würde ich entweder einen Teil des Dateinamens erstellen (und ihn in einer Formel verwenden) oder in eine sichtbarere Zelle einfügen. Dann ist Ihre Verknüpfung fertig. Eine Änderung in dieser Zelle, drücken Sie das Makro und Sie können loslegen.

Ohne etwas mehr Code zu sehen, mit dem Sie arbeiten. Ich kann nicht mehr helfen.

Danke dafür @captainkirk! Ich sehe, wohin Sie gehen und werde es versuchen. Ich habe die VBA noch nicht gestartet, plane aber bis diese Woche und werde dann weitermachen. smac vor 8 Jahren 0
0
smac

Ich habe es herausgefunden. Es begann damit, dass ich meine Daten mit zwei definierten Reihen einrichten musste, wobei eine Reihe die interessierende Gruppe und die zweite die Peergruppen ist. Anschließend sollten die Zellen in meiner Datentabelle abhängig von der Gruppe bedingt gefüllt werden. Das Setup hat viel Zeit in Anspruch genommen und ist in der folgenden Anleitung erschöpfend, aber eigentlich ist es nicht so schlimm.

Snapshot of table setup

Alles, was blau hervorgehoben ist, ist eine Formel, also habe ich es so gemacht:

  1. In Spalte B habe ich anhand einer Formel ermittelt, welche Serie welche ist: = IF (A5 <> A $ 1, "Peers", "Group")
  2. Ich habe meine X- und Y-Werte eingegeben (Spalten C und D).
  3. Stellen Sie meine Blasengröße (Spalte E) so ein, dass sie anhand der Serie automatisch angepasst wird: = IF (A5 = A $ 1,1000,250)
  4. In den Spalten F und G werden Dezimalstellen getrimmt.
  5. Die Spalten H bis L spiegeln den tatsächlichen Aufbau der Datenreihe wider, je nachdem, ob es sich bei der Gruppe um einen Peer oder um die interessierende Gruppe handelt.
  6. Die X-Werte bleiben immer gleich, sodass die Spalte H mit dem ursprünglichen Wert der X-Achse verknüpft wurde: = C5
  7. Spalte I zieht den entsprechenden Y-Wert, wenn es sich um eine Vergleichsgruppe handelt: = IF ($ B5 = $ I3, $ D5, NA ())
  8. Spalte J legt die Größe der Vergleichsgruppenblase fest: = IF (ISNA ($ I5), NA (), $ E5)
  9. Spalte K zieht den entsprechenden Y-Wert, wenn es sich um die interessierende Gruppe handelt: = IF ($ B5 = $ K $ 3, $ D5, NA ())
  10. Spalte L gibt die Gruppe der Interessenblasengröße an: = IF (ISNA ($ K5), NA (), $ E5)
  11. Spalte M setzt alle Blasengrößen gleich und wird für die endgültige Diagrammerstellung verwendet, in der alle Gruppen und ihre Logos zusammen angezeigt werden.
  12. Zellen O4 (= VLOOKUP (A1, Logos! A: B, 2, FALSE)) und P4 (= IF (O4 = 1, "group1", IF (O4 = 2, "group2", IF (O4 = 3, " group3 ", IF (O4 = 4," group4 "))))) identifizieren und ziehen Sie das richtige Logo ein, wenn die interessierende Gruppe ausgewählt ist.

Ich musste dann alle meine Logos / Bilder auf einer separaten Registerkarte ("Logos") einrichten und verlinken. Das YouTube-Video von Oz du Soleil über "Wählen Sie ein Bild basierend auf einem Zellenwert" war immens hilfreich, um dies zu erreichen. Ich habe nicht genug Ruf, um den direkten Link zu posten.

Ich erstellte und formatierte meine Blasendiagramme und wählte die Daten nach Bedarf für jede Serie aus, wobei die Spalten H (X-Achse), I / K (Y-Achse) und J / L (Z-Achse für die Blasengröße) verwendet wurden.

Für mein vollständiges Gruppenlogo brauchte ich nur eine Serie, da alle Blasen dieselbe Größe hätten. Ich habe die Spalten C, D und M für die X-, Y- und Z-Achse verwendet. Ich habe dann jedes Gruppenlogo auf die jeweiligen Blasen angewendet.

Der Code selbst war nach dem Setup ziemlich unkompliziert:

Dim i As Long Dim iLastRow As Long Dim Cells As Range  'This section looks up each group name on the tab and cycles through the loop Application.ScreenUpdating = False  With ActiveSheet iLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row For i = 4 To iLastRow - 1 'Group names start in A5  'Selects, copies, and pastes the next group name in the list Sheets("Groups").Select ActiveSheet.Cells(i + 1, 1).Copy Range("A1").Select Selection.PasteSpecial paste:=xlPasteValues  'Selects, copies, and pastes the group logo onto the bubble ActiveSheet.Shapes.Range(Array("Picture 7")).Select Selection.CopyPicture xlScreen, xlPicture ActiveSheet.ChartObjects("Chart 6").Activate ActiveChart.FullSeriesCollection(2).Select Selection.paste  'Variables needed for directory and file names GroupName = Sheets("Groups").Range("A1") yearmo = Sheets("Groups").Range("A2")  'Will create a new folder for the final images if it doesn't already exist If Len(Dir("DirPath\" & yearmo, vbDirectory)) = 0 Then MkDir "DirPath\" & yearmo End If  'Set up image file names Dim NewFileName As String NewFileName = "\" & yearmo & " - " & GroupName & " - X_Y.jpg"  'Selects and saves the bubble chart as a JPG ActiveChart.ChartArea.Select ActiveChart.Export "DirPath\" & yearmo & NewFileName  Next i End With  'After all individual bubble have been created, need to 'set up state file name to generate image with all logos for the state Dim StateFileName As String StateFileName = "\" & yearmo & " - STATE - X_Y.jpg"  'Selects and saves the state bubble chart as a JPG ActiveSheet.ChartObjects("Chart 4").Activate ActiveChart.Export "DirPath\" & yearmo & StateFileName 

Populated bubble chart

Ich habe mich gegen die Verwendung von Labels im Diagramm entschieden, weil der Versuch, sie dynamisch zu positionieren, den Aufwand nicht wert war. Ich habe stattdessen mit der Erstellung verknüpfter Textfelder unterhalb des Diagramms begonnen.

Hoffentlich hilft dies anderen; Es ist sicherlich eine enorme Zeitersparnis durch manuelle Updates.