none
[Excel-Export] Hyperlink auf gleiche Mappe, anderes Blatt? RRS feed

  • Frage

  • Hallo zusammen,

    wie schon in der Überschrift erwähnt, verstehe ich die Hyperlink-Eigenschaft nicht. (http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=DE-DE&k=k%28MICROSOFT.OFFICE.INTEROP.EXCEL._WORKSHEET.HYPERLINKS%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&rd=true)

     

    Wenn ich im Excel ein Hyperlink auf ein anderes Blatt in der gleichen Mappe erzeugen möchte, funktioniert das bei mir nicht.

    Ich sehe zwar, wie der Hyperlink aussehen sollte, jedoch befinden sich keine Referenzen hinter dem Link.

     

    Beispiel:

    Tabelle1:

        A   B   C     D

    1|1   a   70    70

    2|2   b   80    80

    3|3   c   90    90

     

    Tabelle2:

        A     B   C

    1|70   d  

    2|80   e  

    3|90   f  

     

    Spalten: A => Index; B=> Name; C=>Verweis-Nummer ;D = Hyperlink

    Aufgabe: In Tabelle1 soll in der Hyperlink-Spalte(D1) durch einen SVerweis nach der Verweis-Nummer(C1) aus der gleichen Zeile in der Tabelle2 (A:A (ganze Spalte)) gesucht werden.

    Findet er diese Nummer (C1 in A:A), soll ein Hyperlink in der Hyperlink-Spalte erzeugt werden (D1).

    In Excel sähe D1 so aus:

    =HYPERLINK("#'Tabelle2'!A"&VERGLICH(C1;'Tabelle2'!A:A;0);

    SVERWEIS(C1;'Tabelle2'!A:A;1;FALSCH))

     

    Wie schreibe ich dies jetzt in C#?

    Microsoft.Office.Interop.Excel.Worksheet excelWorkSheet = new Microsoft.Office.Interop.Excel.Worksheet();

    Microsoft.Office.Interop.Excel.Range rangeToHoldHyperlink = excelWorkSheet.get_Range("A" + rowIndex, Type.Missing);

    string hyperlinkTargetAddress = "\"#'" + excelWorkSheet.Name + "'!" + "A" + "\"&"
                                            + "VERGLEICH(" + "A" + rowIndex + ";'" + excelWorkSheet.Name + "'!" + matrix + ";0)";


    excelWorkSheet.Hyperlinks.Add(rangeToHoldHyperlink, hyperlinkTargetAddress, Type.Missing, Type.Missing, "SVERWEIS(" +                dataRow["X"].ToString() + ";" + excelWorkSheet.Name + "'!" + matrix + ";1;FALSCH))");

     

    ??? => So funktioniert es wie beschrieben (also  nicht).

     

    Bin über jede Hilfe dankbar :)

     

    Dienstag, 17. Januar 2012 08:25

Antworten

  • Hallo Honey-Heart,

    Man muss sich entscheiden, ob man eine Formel, oder einen Hyperlink einfügen möchte. Im ersten Fall, weist man der Range.Formula-Eigenschaft einen entsprechenden Formel-String zu (Achtung Stolperfalle: engl. Nomenklatur notwendig!). Im zweiten Fall setzt man einfach die im voraus ermittelten Werte für die Parameter ein:

    using System;
    using System.Reflection;
    using System.Windows.Forms;
    using Excel = Microsoft.Office.Interop.Excel; // getestet mit Excel 2010
    
    namespace HyperlinksDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void buttonCreateWorkbook_Click(object sender, EventArgs e)
            {
                Excel.Application excelApp;
                Excel._Workbook workbook;
                Excel._Worksheet sheet1;
                Excel._Worksheet sheet2;
    
                try
                {
                    //Exel starten
                    excelApp = new Excel.Application();
                    excelApp.Visible = true;
    
                    //Arbeitsmappe erstellen
                    workbook = (Excel._Workbook)(excelApp.Workbooks.Add(Missing.Value));
                    sheet1 = (Excel._Worksheet)workbook.Sheets[1];
                    sheet2 = (Excel._Worksheet)workbook.Sheets[2];
    
                    //Tabelle 2 - Daten eingeben
                    sheet2.Cells[1, 1] = 70;
                    sheet2.Cells[1, 2] = "d";
                    sheet2.Cells[2, 1] = 80;
                    sheet2.Cells[2, 2] = "e";
                    sheet2.Cells[3, 1] = 90;
                    sheet2.Cells[3, 2] = "f";
    
                    //Tabelle 1 - Daten eingeben
                    
                    //Variante 1: Über Formelzuweisung 
                    sheet1.Cells[1, 1] = 1;
                    sheet1.Cells[1, 2] = "a";
                    sheet1.Cells[1, 3] = 70;
                    sheet1.get_Range("D1").Formula = "=HYPERLINK(\"#'Tabelle2'!A\" & MATCH(C1,'Tabelle2'!A:A,0),VLOOKUP(C1,'Tabelle2'!A:A,1,FALSE))";
                    sheet1.Cells[2, 1] = 2;
                    sheet1.Cells[2, 2] = "b";
                    sheet1.Cells[2, 3] = 80;
                    sheet1.get_Range("D2").Formula = "=HYPERLINK(\"#'Tabelle2'!A\" & MATCH(C2,'Tabelle2'!A:A,0),VLOOKUP(C2,'Tabelle2'!A:A,1,FALSE))";
                    sheet1.Cells[3, 1] = 3;
                    sheet1.Cells[3, 2] = "c";
                    sheet1.Cells[3, 3] = 90;
                    
                    //Variante 2: Über Hyperlink-Objekt
                    sheet1.Cells[3, 4] = null;
                    Excel.Range hyperlinkAnchor = sheet1.get_Range("D3", Missing.Value);
                    string hyperlinkAddress = "#Tabelle2!A3";
                    string hyperlinkDisplay = "90";
                    Excel.Hyperlink hyperlink = sheet1.Hyperlinks.Add(hyperlinkAnchor, hyperlinkAddress, Missing.Value, Missing.Value, hyperlinkDisplay);
    
                    excelApp.Visible = true;
                    excelApp.UserControl = true;
                }
                catch (Exception ex)
                {
                    String errorMessage;
                    errorMessage = "Fehler: ";
                    errorMessage = String.Concat(errorMessage, ex.Message);
                    errorMessage = String.Concat(errorMessage, " Zeile: ");
                    errorMessage = String.Concat(errorMessage, ex.Source);
    
                    MessageBox.Show(errorMessage, "Fehler");
                }
            }
        }
    }
    


    Gruß
    Marcel

    • Als Antwort markiert Honey-Heart Dienstag, 17. Januar 2012 14:12
    Dienstag, 17. Januar 2012 11:03
    Moderator

Alle Antworten

  • Hallo Honey-Heart,

    Man muss sich entscheiden, ob man eine Formel, oder einen Hyperlink einfügen möchte. Im ersten Fall, weist man der Range.Formula-Eigenschaft einen entsprechenden Formel-String zu (Achtung Stolperfalle: engl. Nomenklatur notwendig!). Im zweiten Fall setzt man einfach die im voraus ermittelten Werte für die Parameter ein:

    using System;
    using System.Reflection;
    using System.Windows.Forms;
    using Excel = Microsoft.Office.Interop.Excel; // getestet mit Excel 2010
    
    namespace HyperlinksDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void buttonCreateWorkbook_Click(object sender, EventArgs e)
            {
                Excel.Application excelApp;
                Excel._Workbook workbook;
                Excel._Worksheet sheet1;
                Excel._Worksheet sheet2;
    
                try
                {
                    //Exel starten
                    excelApp = new Excel.Application();
                    excelApp.Visible = true;
    
                    //Arbeitsmappe erstellen
                    workbook = (Excel._Workbook)(excelApp.Workbooks.Add(Missing.Value));
                    sheet1 = (Excel._Worksheet)workbook.Sheets[1];
                    sheet2 = (Excel._Worksheet)workbook.Sheets[2];
    
                    //Tabelle 2 - Daten eingeben
                    sheet2.Cells[1, 1] = 70;
                    sheet2.Cells[1, 2] = "d";
                    sheet2.Cells[2, 1] = 80;
                    sheet2.Cells[2, 2] = "e";
                    sheet2.Cells[3, 1] = 90;
                    sheet2.Cells[3, 2] = "f";
    
                    //Tabelle 1 - Daten eingeben
                    
                    //Variante 1: Über Formelzuweisung 
                    sheet1.Cells[1, 1] = 1;
                    sheet1.Cells[1, 2] = "a";
                    sheet1.Cells[1, 3] = 70;
                    sheet1.get_Range("D1").Formula = "=HYPERLINK(\"#'Tabelle2'!A\" & MATCH(C1,'Tabelle2'!A:A,0),VLOOKUP(C1,'Tabelle2'!A:A,1,FALSE))";
                    sheet1.Cells[2, 1] = 2;
                    sheet1.Cells[2, 2] = "b";
                    sheet1.Cells[2, 3] = 80;
                    sheet1.get_Range("D2").Formula = "=HYPERLINK(\"#'Tabelle2'!A\" & MATCH(C2,'Tabelle2'!A:A,0),VLOOKUP(C2,'Tabelle2'!A:A,1,FALSE))";
                    sheet1.Cells[3, 1] = 3;
                    sheet1.Cells[3, 2] = "c";
                    sheet1.Cells[3, 3] = 90;
                    
                    //Variante 2: Über Hyperlink-Objekt
                    sheet1.Cells[3, 4] = null;
                    Excel.Range hyperlinkAnchor = sheet1.get_Range("D3", Missing.Value);
                    string hyperlinkAddress = "#Tabelle2!A3";
                    string hyperlinkDisplay = "90";
                    Excel.Hyperlink hyperlink = sheet1.Hyperlinks.Add(hyperlinkAnchor, hyperlinkAddress, Missing.Value, Missing.Value, hyperlinkDisplay);
    
                    excelApp.Visible = true;
                    excelApp.UserControl = true;
                }
                catch (Exception ex)
                {
                    String errorMessage;
                    errorMessage = "Fehler: ";
                    errorMessage = String.Concat(errorMessage, ex.Message);
                    errorMessage = String.Concat(errorMessage, " Zeile: ");
                    errorMessage = String.Concat(errorMessage, ex.Source);
    
                    MessageBox.Show(errorMessage, "Fehler");
                }
            }
        }
    }
    


    Gruß
    Marcel

    • Als Antwort markiert Honey-Heart Dienstag, 17. Januar 2012 14:12
    Dienstag, 17. Januar 2012 11:03
    Moderator
  • Danke, das ist die richtige Lösung!

    Hatte heute bemerkt, dass ich zusätzlich noch ein Excel-Syntax-Fehler (in der Funktion) hatte. Als ich den heute "eliminiert" hatte, ist mir klar geworden, dass es unmöglich scheint (bzw ist!) eine Funktion in der Hyperlink-Methode miteinzubinden.

    Und da kommst du gerade richtig :)

    Kenne mich noch nicht mit der Bib

     Microsoft.Office.Interop.Excel

    aus :)

     

    Danke noch einmal! (Auch für die schnelle Antwort) :)

    Dienstag, 17. Januar 2012 14:12