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

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

C# と VB.NET の入門サイト

excelと画面の表示スケール

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

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

分類:[C#] 

Windowsフォームでexcelを起動させるプログラムを作りました。
しかしアプリ側からexcelを立ち上げるとexcelの表示文字がぼやけているようになります。
恐らくPCのディスプレイの表示スケールを125%にしているのが原因ではないかと考えています。
フォームアプリを使わずに立ち上げるとぼやけずに起動します。
表示スケールを変更してもぼやけずにexcelを起動させるにはどうしたらいいでしょうか?
サンプルコード、もしくは参考になるサイトがあったら教えてください。
それとも別の原因も考えられるのでしょうか?
引用返信 編集キー/
■94071 / inTopicNo.2)  Re[1]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 (2601回)-(2020/03/10(Tue) 20:42:28)
No94070 (だんぼ さん) に返信
> フォームアプリを使わずに立ち上げるとぼやけずに起動します。

そういうことが起きるのですね…。(試していません)


お使いの .NET Framework のバージョンは何でしょうか。
また、manifest による高 DPI 対応について、どのように設定されていますか?


> サンプルコード、もしくは参考になるサイトがあったら教えてください。

直接の解決策になるかは分かりませんが:

2019-07-30 [Windowsフォームでの高DPI(Hi-DPI)対応のコツ]
https://qiita.com/mono1729/items/a93505a5cb3fe194b7dc

2019-05-26 [WindowsのDPIスケーリング処理について一考察]
https://www.timbreofprogram.info/blog/archives/1528

2018-11-19 [高DPI環境で作るフォームアプリケーション(C#)]
https://elesynd.blogspot.com/2018/11/hDpiForm.html

2017-05-16 [Windows フォームでの高 DPI サポート]
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/high-dpi-support-in-windows-forms

2017-01-24 [Windows Formsアプリケーションの高DPI対応]
https://qiita.com/felis_silv/items/efee4b1a397b0b95100a
引用返信 編集キー/
■94075 / inTopicNo.3)  Re[2]: excelと画面の表示スケール
□投稿者/ だんぼ (2回)-(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を追加する前までは問題なく動作していました。
引用返信 編集キー/
■94076 / inTopicNo.4)  Re[3]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 (2604回)-(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); }
}
引用返信 編集キー/
■94077 / inTopicNo.5)  Re[4]: excelと画面の表示スケール
□投稿者/ furu (20回)-(2020/03/11(Wed) 14:17:17)
No94076 (魔界の仮面弁士 さん) に返信
いつもみても参考になります。
重箱の隅を突くようですみません。

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

 正 listBoxSheet.SelectedIndex = selectedIndex;
引用返信 編集キー/
■94085 / inTopicNo.6)  Re[5]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 (2607回)-(2020/03/11(Wed) 18:27:21)
No94077 (furu さん) に返信
> 重箱の隅を突くようですみません。

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


開発環境ではなく、掲示板上に直接書いたコードなので、
動くかどうかは保証できません。
引用返信 編集キー/
■94093 / inTopicNo.7)  Re[4]: excelと画面の表示スケール
□投稿者/ だんぼ (3回)-(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さん
ありがとうございました。
引用返信 編集キー/
■94094 / inTopicNo.8)  Re[5]: excelと画面の表示スケール
□投稿者/ だんぼ (4回)-(2020/03/12(Thu) 11:48:38)
2020/03/12(Thu) 11:58:23 編集(投稿者)
2020/03/12(Thu) 11:58:18 編集(投稿者)

解決したと思ったのですが再度質問させていただきます。
上記の話の続きですがアプリから開いたexcelファイルの表示ボケは直ったのですが
元々開いてた別のエクセルファイルがアプリから開いたexcelが立ち上がると同時に表示ボケしました。これはmanifestの設定次第って事でしょうか?
引用返信 編集キー/
■94097 / inTopicNo.9)  Re[6]: excelと画面の表示スケール
□投稿者/ 魔界の仮面弁士 (2611回)-(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


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

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

魔界の仮面弁士さん、ありがとうございました。
また、何かありましたらよろしくお願いします。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ