2017-08-03 26 views
2

Excel(2016)用のAddInを作成しました。これは印刷領域をjpgファイルとして保存します。それは数ヶ月間うまくいった。最近、私はユーザーからのエラー報告が増えていますが、すべて同じエラーが表示されます(下の図)。ユーザーには、Windows 7(Excel 2013)またはWindows 10(Excel 2016)がありますが、どちらもこのエラーがあります。私のプログラムの最初の回の再インストールは助けになったが、今からは役に立たない。GetDataObject要求されたクリップボード操作が成功しなかった0x800401D0

enter image description here

ここに私のコードです:

public static void Save(string report, string area, RibbonControlEventArgs e) 
{ 
    Excel.Window window = e.Control.Context; 
    Excel.Worksheet sheet = ((Excel.Worksheet)window.Application.ActiveSheet); 
    Excel.Range range = sheet.Range[sheet.PageSetup.PrintArea]; 

    range.CopyPicture(Excel.XlPictureAppearance.xlPrinter, Excel.XlCopyPictureFormat.xlPicture); 
    range.Copy(Type.Missing); 

    string fileName = @"\\server.company.lan\report.jpg"; 

    if (Clipboard.GetDataObject() != null) 
    { 
     IDataObject data = Clipboard.GetDataObject(); 

     Image image = (Image)data.GetData(DataFormats.Bitmap, true); 
     image.Save(fileName, ImageFormat.Jpeg); 
    } 
} 
+1

STA以外のスレッドで実行していますか? (PS:Exceptionのタイプは真剣に助けになるかもしれません...)これもチェックしてください:https://stackoverflow.com/questions/68666/clipbrd-e-cant-open-error-when-setting-the-clipboard-from- net –

+0

@SimonMourierはい、私はSTA以外のスレッドで実行しています。私は私の質問にエラーメッセージを添付しました。それは私のコンピュータ上にこのエラーを再現できないためです。 – Adam

+1

クリップボードにアクセスするには、STAスレッドを使用する必要があります。 –

答えて

3

すべてのクリップボードへのアクセスは、STAスレッドを使用して実行する必要があります。これを行うには多くの方法があります。

  • 使用はBeginInvoke機能コードは(STAでなければなりません)UIスレッド
  • は、独自のスレッドのインスタンスを起動し、SetAparmentStateを使用する上で動作保証(WinformsのかWPF)(STA )、
  • など
関連する問題