C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.94070 の関連記事表示

<< 0 >>
■94070  excelと画面の表示スケール
□投稿者/ だんぼ -(2020/03/10(Tue) 19:52:36)

    分類:[C#] 

    Windowsフォームでexcelを起動させるプログラムを作りました。
    しかしアプリ側からexcelを立ち上げるとexcelの表示文字がぼやけているようになります。
    恐らくPCのディスプレイの表示スケールを125%にしているのが原因ではないかと考えています。
    フォームアプリを使わずに立ち上げるとぼやけずに起動します。
    表示スケールを変更してもぼやけずにexcelを起動させるにはどうしたらいいでしょうか?
    サンプルコード、もしくは参考になるサイトがあったら教えてください。
    それとも別の原因も考えられるのでしょうか?
親記事 /過去ログ163より / 関連記事表示
削除チェック/

■94071  Re[1]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 -(2020/03/10(Tue) 20:42:28)
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94075  Re[2]: excelと画面の表示スケール
□投稿者/ だんぼ -(2020/03/11(Wed) 10:58:40)
    No94071 (魔界の仮面弁士 さん) に返信
    > お使いの .NET Framework のバージョンは何でしょうか。
    > また、manifest による高 DPI 対応について、どのように設定されていますか?

    .NET Frameworkのバージョンは4.6です。
    manifestは使っていませんでしたので追加し、下記の部分だけコメントアウトを外しました。
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
    </application>

    フォームのAutoScaleModeプロパティもDpiモードに変更しました。

    変更後デバッグしてみると
    シート数をカウント⇒シート名をリストボックスにセット⇒アクティブシートの確認で例外になってしまうようになりました。

    error CS103;現在のコンテキストに'ActiveSheet'という名前は存在しません。
    workbookのparentプロパティでネイティブコードのデバッグを有効・・・云々
    プロジェクトのプロパティのデバッグの欄で”ネイティブコードデバッグを有効にする”にチェックを入れましたが変化ありません。

    // Excelを開く
    excelApp.Visible = true;
    // Excel でブックを開く
    workBook = excelApp.Workbooks.Open(path);
    // リストボックス初期化
    listBoxSheet.Items.Clear();
    //シート数をカウント
    for (int i = 1; i <= workBook.Sheets.Count; i++)
    {
    listBoxSheet.Items.Add(workBook.Sheets(i).Name);

    if (workBook.ActiveSheet.Name == workBook.Sheets(i).Name) ←ここで例外
    {
    listBoxSheet.SelectedIndex = i - 1;
    workBook.ActiveSheet.Range("A1").Select();
    }
    }

    スキルが足りず、対処方法がわかりません。よろしくお願いします。
    ちなみにmanifestを追加する前までは問題なく動作していました。
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94076  Re[3]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 -(2020/03/11(Wed) 12:43:52)
    No94075 (だんぼ さん) に返信
    > <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>

    dpiAware で指定できる値は、「True」「False」「True/PM」「Per-Monitor」の 4 種ですね。
    実行 OS にも依存します。
    http://grabacr.net/archives/1132


    > error CS103;現在のコンテキストに'ActiveSheet'という名前は存在しません。
    CS103 というのは、CS0103 の書き間違いでしょうか。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs0103


    ActiveSheet プロパティを持っているのは、Global 系を除けば
     Excel.Application オブジェクト
     Excel.Window オブジェクト
     Excel.Workbook オブジェクト
    の 3 つですね。


    > if (workBook.ActiveSheet.Name == workBook.Sheets(i).Name) ←ここで例外

    workBook 変数のデータ型は、以下のうちどれにしていますか?
    (3) であれば大丈夫と思いますが、もし (1) ならばエラーになりそう。


    (1) object 型 (System.Object クラス)
    (2) dynamic 型
    (3) Workbook 型 (Excel.Workbook インターフェイス)
    (4) WorkbookClass 型 (非推奨)


    > workBook = excelApp.Workbooks.Open(path);

    上記の部分は、
     workbooks = excelApp.Workbooks;
     workBook = workbooks.Open(path);
    の形にしておくことをお奨めします。

    COM オブジェクトを変数として受け取っておかないと、
    処理後に Workbooks コレクションを明示的に解放できなくなってしまいますので。

    ※ここでいう解放処理とは、Marshal クラスの (Final)ReleaseComObject メソッドの事です


    workBook.Sheets.Count や workBook.ActiveSheet.何某 も同様です。


    string acitveSheetName = "";

    dynamic activeSheet = excelApp.ActiveSheet;
    if (activeSheet != null) {
     // activeSheetが null になることはほぼ無いが、一応念のため
     acitveSheetName = activeSheet.Name;
    }

    Excel.Sheets sheets = workBook.Sheets;
    listBoxSheet.BeginUpdate();
    int selectedIndex = -1;
    for (int i = 1; i <= sheets.Count; i++) {
     // どちらの構文がサポートされるのかは、
     // C# バージョンおよび相互運用アセンブリによって異なります。
     dynamic sheet = sheets[i] または sheets(i);

     listBoxSheet.Items.Add(sheet.Name);

     if (sheet.Name == activeSheetName) {
      selectedIndex = i - 1;
     }
     if (Marshal.IsComObject(sheet)) { Marshal.ReleaseComObject(sheet); }
    }
    listBoxSheet.SelectedIndex = i - 1;
    listBoxSheet.EndUpdate();

    if (activeSheet != null) {
     Excel.Range a1 = activeSheet.Range("A1");
     a1.Select();
     if (Marshal.IsComObject(a1)) { Marshal.ReleaseComObject(a1); }
     if (Marshal.IsComObject(activeSheet)) { Marshal.ReleaseComObject(activeSheet); }
    }
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94077  Re[4]: excelと画面の表示スケール
□投稿者/ furu -(2020/03/11(Wed) 14:17:17)
    No94076 (魔界の仮面弁士 さん) に返信
    いつもみても参考になります。
    重箱の隅を突くようですみません。

    > ■No94075 (だんぼ さん) に返信
    > listBoxSheet.SelectedIndex = i - 1;
    forループ変数を外で使用してしまっています。

     正 listBoxSheet.SelectedIndex = selectedIndex;
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94085  Re[5]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 -(2020/03/11(Wed) 18:27:21)
    No94077 (furu さん) に返信
    > 重箱の隅を突くようですみません。

    御指摘感謝。助かります。
    実際にテストしていないことがバレますね…(^^;


    開発環境ではなく、掲示板上に直接書いたコードなので、
    動くかどうかは保証できません。
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94093  Re[4]: excelと画面の表示スケール
□投稿者/ だんぼ -(2020/03/12(Thu) 11:48:11)
    No94076 (魔界の仮面弁士 さん) に返信
    > ■No94075 (だんぼ さん) に返信
    > dpiAware で指定できる値は、「True」「False」「True/PM」「Per-Monitor」の 4 種ですね。
    Per-Monitorにしてみました。
    >
    >>error CS103;現在のコンテキストに'ActiveSheet'という名前は存在しません。
    > CS103 というのは、CS0103 の書き間違いでしょうか。
    CS0103の間違いでした。失礼しました。
    >
    > workBook 変数のデータ型は、以下のうちどれにしていますか?
    > (3) であれば大丈夫と思いますが、もし (1) ならばエラーになりそう。
    >
    > (1) object 型 (System.Object クラス)
    > (2) dynamic 型
    > (3) Workbook 型 (Excel.Workbook インターフェイス)
    > (4) WorkbookClass 型 (非推奨)
    (2)でしたので(3)に変更しました。

    ソースコードをそのまま使わせていただいたら表示ボケが改善されました。

    魔界の仮面弁士さん、furuさん
    ありがとうございました。
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94094  Re[5]: excelと画面の表示スケール
□投稿者/ だんぼ -(2020/03/12(Thu) 11:48:38)
    2020/03/12(Thu) 11:58:23 編集(投稿者)
    2020/03/12(Thu) 11:58:18 編集(投稿者)

    解決したと思ったのですが再度質問させていただきます。
    上記の話の続きですがアプリから開いたexcelファイルの表示ボケは直ったのですが
    元々開いてた別のエクセルファイルがアプリから開いたexcelが立ち上がると同時に表示ボケしました。これはmanifestの設定次第って事でしょうか?
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94097  Re[6]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 -(2020/03/12(Thu) 13:08:38)
    No94094 (だんぼ さん) に返信
    > 上記の話の続きですがアプリから開いたexcelファイルの表示ボケは直ったのですが
    > 元々開いてた別のエクセルファイルがアプリから開いたexcelが立ち上がると同時に表示ボケしました。これはmanifestの設定次第って事でしょうか?

    環境を用意して検証実験する余裕が無いので、今はちょっと分からないです。
    Excel のバージョンに依存している様子はありますか?

    Per-Monitor 設定の場合、ディスプレイモニタごとの設定にあわせて
    表示が変わる可能性がありますが、Excel の表示が起動元アプリの
    manifest に依存しているのかどうかは把握していません。
    https://hide.maruo.co.jp/software/hidemarunew/v869_1.html


    識者の登場を待ちたい所。
記事No.94070 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94100  Re[7]: excelと画面の表示スケール
□投稿者/ だんぼ -(2020/03/12(Thu) 14:04:22)
    No94097 (魔界の仮面弁士 さん) に返信
    > 環境を用意して検証実験する余裕が無いので、今はちょっと分からないです。
    > Excel のバージョンに依存している様子はありますか?
    Excel2007,Win10で差異はありませんでした。

    > Per-Monitor 設定の場合、ディスプレイモニタごとの設定にあわせて
    > 表示が変わる可能性がありますが、Excel の表示が起動元アプリの
    > manifest に依存しているのかどうかは把握していません。
    dpiAwareの値をtrue/PMにしてみたらアプリで立ち上げたexcelも普通に立ち上げたexcelも表示ボケしませんでした。
    とりあえずこれで検証してみようと思います。

    魔界の仮面弁士さん、ありがとうございました。
    また、何かありましたらよろしくお願いします。
記事No.94070 のレス / END /過去ログ163より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -