2017-02-15 6 views
0

私は500のハイパーリンクを追加するワークシートを持っており、この処理には約90秒かかります。私は部分的には、Microsoft Interop Excelを使用することが強制されていることと、部分的にはfor loopを使用することが原因であることを知っていますが、そのような高速化/効率化の方法が必要です。これは現在の構文ですハイパーリンクの追加の最適化構文

public static void AddThatHyper() 
{ 
    long lr, i; 
    string cellVal; 
    WS = xlApp.ActiveWorkbook.ActiveSheet; 
    lr = WS.Cells[WS.Rows.Count, 2].End(Excel.XlDirection.xlUp).Row; 
    for (i = 2; i <= lr; i++) 
    { 
     Object Anchor = WS.Cells[i, 9]; 
     Object TextToDisplay = Convert.ToString(WS.Cells[i, 9]); 
     cellVal = WS.Cells[i, 1].Value; 
     cellVal = cellVal.Substring(0, Math.Min(28, cellVal.Length)); 
     rangeToHoldHyperlink = WS.Range["I" + i]; 

     if (cellVal.Contains("&") || 
      cellVal.Contains(",") || 
      cellVal.Contains("-") || 
      cellVal.Contains(".") 
      ) 
     { 
      xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "CR " + cellVal + "'!A1", "", TextToDisplay); 
     } 
     if (cellVal.Contains("'")) 
     { 
      cellVal = cellVal.Replace("'", "''"); 
      xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "CR " + cellVal + "'!A1", "", TextToDisplay); 
     } 
     else 
     { 
      xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "FR " + cellVal + "'!A1", "", TextToDisplay); 
     } 
    } 
} 

この構文を最適化し、より高速な時間枠で完了させるには、ここで何ができますか?

+0

問題は、セルに個別に読み書きしようとしていることです。実行時間を短縮する最善の方法は、すべての値を範囲として読み取り、これらを配列に格納することです。その後、これを操作して、範囲全体の値を設定します。したがって、プログラムしているCOM呼び出しの量を減らす必要があります。この質問を見てください:http://stackoverflow.com/questions/6846958/optimized-way-of-adding-multiple-hyperlinks-in-excel-file-with-c-sharp?rq=1。 – Seunhaab

+0

@セウナハブ - そのオプションは機能するかもしれませんが、それを達成する方法は不明です。サンプル構文を提供できますか?これらの回答のURL設定は、URLとは異なる3つの条件があるため、私とは異なります。 –

答えて

0

注:このコードはテストされていません。私が以前作ったプログラムに基づいた例です。値が適切に抽出/変換されているかどうかを確認するには、手動でデバッグする必要があります。

public static void AddThatHyper() 
{ 
    long lr, i; 
    string cellVal; 
    WS = xlApp.ActiveWorkbook.ActiveSheet; 
    lr = WS.Cells[WS.Rows.Count, 2].End(Excel.XlDirection.xlUp).Row; 
    string prefix = "";  

    string topCell = "I" + 2; 
    string bottomCell = "I" + lr; 

    //get_Range returns object array 
    Range range = ws.get_Range(topCell, bottomCell); 

    object[,] rangeValues = new object[lr - 2, 1]; 
    string[,] rangeStringValues = new string[lr - 2, 1]; 
    rangeValues = range.Cells.Formula; 

    //turn object array into string array 
    //should contain strings like "=hyperlink(url, text)" 
    for (int i = 0; i < rangeValues.GetLength(0); i++) 
    { 
     rangeStringValues[i, 0] = rangeValues[i, 0]?.ToString() ?? ""; 
    } 

    //edit hyperlinks 
    for (int i = 0; i < rangeStringValues.GetLength(0); i++) 
    { 
     prefix = "FR" 
     string hyperlink = rangeStringValues[i, 0]; 
     MatchCollection fields = Regex.Matches(hyperlink, @"("[A-Za-z0-9\.]*")"); 
     string url = fields[0]?.ToString() ?? ""; 
     string text = fields[1]?.ToString() ?? ""; 

     if (Regex.IsMatch(url, @"[&,\-\.]")) 
      prefix = "CR"; 
     else if (url.Contains("'")) 
     { 
      prefix = "CR" 
      url.Replace("'", "''"); 
     } 
     string formattedUrl = "'" + prefix + url + "'!A1"; 
     rangeStringValues[i, 0]= $"=HYPERLINK(""{formattedUrl }"", ""{text}"")"; 

    } 
    range.set_Value(value: values); 
    range.Formula = range.Value; 
} 
関連する問題