2017-10-27 6 views
0

ずにコピー&ペーストのハイパーリンク式Iは、Excelがアドインされていて表を作成し、いずれかの列は、このハイパーリンクの式を有する:エクセル - 式

=HYPERLINK(CONCATENATE("https://www.example.org/",[id]),[id]) 

ユーザーはこのことを含んでいるセルをコピーする場合式、彼らは別のワークシートに貼り付けると、彼らはこの取得:だから

=HYPERLINK(CONCATENATE("https://www.example.org/",ListObject1[id]),ListObject1[id]) 

、彼らは、のは、彼らが最初のワークシートの最初の行からセルをコピーするとしましょう、と別のワークシートの5行目に貼り付け最初のワークシートの5行目の値を取得します。式。

残念ながら、これは意図されていません。ユーザーが期待するのは、式の代わりにコピーした値を取得することです。では、ユーザーが貼り付け操作を実行するときに、式の代わりにハイパーリンクの値を取得するようにするにはどうすればよいですか?

残念ながら、ハイパーリンクが失われるため、「値にペースト」は機能しません。

これで、クリップボードのデータを編集して式を削除し、クリップボードのデータにハイパーリンクの値を挿入する方法があるかどうかを調べるようにしているので、ユーザーが貼り付けを実行するとハイパーリンクのデータ。

これまでのところ動作しません。私はクリップボードのデータオブジェクトの "XML Spreadsheet"を修正しましたが、うまくいかず、変更する必要があるかもしれません。

この問題を解決するための助けや提案がありがとうございます。

ありがとうございます!

編集:クリップボードのデータの「XMLスプレッドシート」から:「フォーミュラSS」

ここで私は削除しようとしたコードです。 "ss:Formula"にはセルの数式が格納されているため、数式を削除する代わりに貼り付けると正確な値が取得されます。

  var dataObject = Clipboard.GetDataObject(); 
      var newDo = new DataObject(); 
      foreach (var format in dataObject.GetFormats()) 
      { 
       try 
       { 
        var value = dataObject.GetData(format); 
        newDo.SetData(format, value); 
       } 
       catch (Exception e) 
       { 
        Logger.Debug(e); 
       } 
      } 

      var xmlSpreadsheetClipboardData = Clipboard.GetData("XML Spreadsheet"); 
      if (xmlSpreadsheetClipboardData != null) 
      { 
       // Read the data and extract the workbook name, worksheet name, and cell. 
       var memoryStream = (MemoryStream) xmlSpreadsheetClipboardData; 
       var reader = new StreamReader(memoryStream, new System.Text.UTF7Encoding(), true); 
       var xml = reader.ReadToEnd().Replace("\0", ""); 
       var xmlDoc = new XmlDocument(); 
       xmlDoc.LoadXml(xml); 
       var node = xmlDoc.SelectSingleNode("/Workbook/Worksheet/Table"); 
       var worksheetXmlElementList = xmlDoc.GetElementsByTagName("Worksheet"); 
       var worksheetXmlElement = worksheetXmlElementList[0] as XmlElement; 
       var tableXmlElement = worksheetXmlElement.GetElementsByTagName("Table")[0] as XmlElement; 
       var rowXmlElement = tableXmlElement.GetElementsByTagName("Row")[0] as XmlElement; 
       var cellXmlElement = rowXmlElement.GetElementsByTagName("Cell")[0] as XmlElement; 
       cellXmlElement.Attributes.RemoveNamedItem("ss:Formula"); 
       newDo.SetData("XML Spreadsheet", xmlDoc.InnerXml); 
       Clipboard.SetDataObject(newDo); 
      } 
+0

あなたが試したコードを共有してください – Bassie

+0

@Bassieは私が試したコードを含めるように私の質問を編集しました。ありがとう! –

答えて

0

これはExcelの構築方法です。 これを無効にしたい場合は、Ctrlキーを押しながら数式をコピーすることができます。 貼り付ける場所は、ctr + alt + Vを押してください。

C# で解決したいのであれば、おそらくuはその行内の関数で非表示にすることができます。 そして、この目に見えない記録の価値を示してください。あなたは新しい列を作成することができるなら、あなたはあなたがしてコピーすることができURLへのリンクを変換するために、VBAを使用することができ https://stackoverflow.com/a/24555571/5713884

0

: Excelで値をコピーしたい場合は、同様に気にいらを使用しています。

Sub ExtractHL() 
Dim HL As Hyperlink 
    For Each HL In ActiveSheet.Hyperlinks 
     HL.Range.Offset(0, 1).Value = HL.Address 
    Next 
End Sub 

https://answers.microsoft.com/en-us/office/forum/office_2007-excel/remove-friendlyname-from-hyperlink-via-function-or/3ccec10d-d7cc-4c56-a9a3-9e13aeda77e1

それとも、第二のカラム計画をスキップすることができ、ちょうどオフセット(0,0)とURLと現在のセル内のリンクを使用して交換してください。このマクロはボタンで実行することができ、ユーザーの別のシートにURLをコピー/ペーストし、元の場所にリンクを残すように編集します。

Excelを使用している場合は、VBAが唯一の解決策だと思います。

+0

私はC#を使ってこれを行うことができますが、残念ながらこれは遅いので、私はハイパーリンクを生成するために式を使用しています。ハイパーリンクするように各セルをフォーマットすると、遅くなる –