Office 32bit/64bit問題

以前から Office 64bit とそれまでの Office 32bit で VBA のマクロに互換がないことが知られています。

Office の 32 ビット バージョンと 64 ビット バージョン間の互換性

https://docs.microsoft.com/ja-jp/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office

Declare で定義している API の部分や ActiveX コントロール(ocx)が主に影響します。

このため、Office 2016 までは「明示的に選択しない限り、32bit Office がインストールされる」という仕様になっていました。
しかしながら、Office 2019 からは「64bit OSなら、明示的に選択しない限り、64bit Office がインストールされる」という動作に変更となりました。

インストール プロセスを始める前に、明示的に 32 ビット版を選択しなければ、64 ビット版の Office が自動的にインストールされます。

https://support.office.com/ja-jp/article/64-ビット版または-32-ビット版の-office-を選択する-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261#32or64Bit=新しいバージョン

この結果、マクロが動かないといった問い合わせがエンドユーザーから来る、あるいは IT 系部署・担当者に来ることになります。

規模が小さい、自分たちで Office のバージョンを制御できるケース

32bit をインストールし直してもらうようにお願いする・フォローするか、Office 2019 とサポート期間が同じ Office 2016 を当面使うように仕向ければ延命できます。

ただし、次の Office で再燃するので、計画的に 64bit/32bit 両対応を考えた方が良いでしょう。

客先対応が必要なので Office バージョンを制御できないケース

Office 2019 がどのくらいのスピードで普及するかわかりませんが、「動かない!」という問い合わせが来ることになりますので、急いで 64bit 互換対応を考えなければなりません。
(客先次第ですが、32bit のインストール手段の説明に苦労する、納得してくれないなど、難しい可能性があるため)

やっかいなのは ActiveX コントロールを使っているケースです。
64bit 版が存在しない場合がほとんどなので、その代替策を考えて設計・実装することになり、開発期間が延びがちです。

個人的には…

Excel などの VBA はあくまでメイン機能をアシストする立場だと思いますので、Win32API を駆使したり、ActiveX コントロールで画面をリッチにしたりという方面は避けた方が良いと思います。

どうしても高機能なものを開発するのであれば、マクロではなく、アドインの開発を考えるなど、よりモダンな開発環境を使った方が良さそうです。

UWP版Office(Excel)

最近の Office のプリインストール環境は UWP 版 Office(ストアアプリ)がインストールされているケースがあるようです。

UWP 版 Office は COM の公開方法が Desktop Bridge 向けの新しい仕組みが採用されています。

COM Server and OLE Document support for the Desktop Bridge
https://blogs.windows.com/buildingapps/2017/04/13/com-server-ole-document-support-desktop-bridge/

このため、レジストリから Excel.Application を探しても見つからないが、COM オブジェクトは生成できるという不思議な状態になっています。

興味のある方は上記の記事を参照しつつ、UWP 版 Office のインストール先の AppxManifest.xml を覗いてみましょう。

 

なお、今のところ、管理者権限で実行したプロセスからは Excel.Application といった ProgID から COM オブジェクトを生成できないようです。
これが仕様による制限なのか、不具合なのかは不詳です。
CLSID を直接指定すると生成できるという情報(MSDN フォーラム)もありますので、必要な方はそちらも検討してください。

 

管理者権限で Excel をオートメーションで利用されている方は以下のいずれかになります。

  • 管理者権限で実行しないで済むように運用や設計を見直す
  • UWP 版 Office をアンインストールして、従来のデスクトップ版 Office をインストールし直す

Microsoft ストア アプリ版 Office 2016 から、デスクトップ アプリ版 Office 2016 に入れ替えることはできますか。

はい。Microsoft ストア アプリ版 Office 2016 をアンインストール後、マイアカウント ページからデスクトップ アプリ版 Office 2016をインストールすることができます。

https://www.microsoft.com/ja-jp/office/setup/2016pipc/faq.aspx より)

色選択ダイアログ(ColorDialog)の作成した色の保存

わんくまさんネタです。

ColorDialog クラスでは AllowFullOpen プロパティがデフォルトの True であれば、色の作成ボタンから基本色以外を選択すること、作成することができます。

image

ただし、何も実装しなければ、この ColorDialog クラスのインスタンスがなくなった時点で作成した色は失われます。

 

保存するためにはこの ColorDialog クラスの CustomColors プロパティから色を取り出して保存しておき、次回表示時に設定してあげる必要があります。

例:XmlSerializerやBinaryFormatterを使う

何も考えずに1ファイルにこの色情報だけを保存するのであれば、XmlSerializerやBinaryFormatterを使えばそれで終わります。

XmlSerializerの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        targetColorDialog.CustomColors = (int[])xmlSerializer.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog) {
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        xmlSerializer.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

BinaryFormatterの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var formatter = new BinaryFormatter();
        targetColorDialog.CustomColors = (int[])formatter.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

 

これらのサンプルメソッドの内、LoadCustomColors メソッドは Form の Load イベント(やコンストラクタ)、ダイアログの表示直前といったタイミングで呼び出してください。

LoadCustomColors(@"(ファイル名)", colorDialog1);

SaveCustomColors メソッドは Form の FormClosed イベントなどで呼び出してください。

SaveCustomColors(@"(ファイル名)", colorDialog1);

プロジェクトの設定(Properties.Settings)に保存したい

先の例はお手軽なものの、1ファイルに1つの情報だけを保存するのは微妙なので、もう一例紹介しておきます。

設定の構造にはデフォルトで int[] を扱える型がないので文字列で扱う例です。

あらかじめ、プロジェクトのプロパティの設定タブから ColorSettings という文字列型の設定値を「ユーザー」スコープで追加しておいてください。

image

以下は int 型配列を文字列に変えて、「,(カンマ)」区切りで連結しています。

private void LoadCustomColors(ColorDialog targetColorDialog)
{
    targetColorDialog.CustomColors =
        Properties.Settings.Default.ColorSettings.Split(new[] {','}, 16).Select(int.Parse).ToArray();
} private void SaveCustomColors(ColorDialog sourceColorDialog) {
    Properties.Settings.Default.ColorSettings = string.Join(",", sourceColorDialog.CustomColors);
    Properties.Settings.Default.Save();
}

こちらのサンプルメソッドは、LoadCustomColors メソッドを Form の Load イベントで呼び出す、SaveCustomColors メソッドを Form の FormClosed イベントで呼び出すといった想定です。

LoadCustomColors(colorDialog1);
SaveCustomColors(colorDialog1);

メソッドを分けずに、それらのイベントハンドラに直接中身を書く形でも良いでしょう。

Visual Studio 2017/2019で作成したいプロジェクトがない=プロジェクトを作成できない場合

以前の記事 にも挙げましたが、Visual Studio 2017/2019 はデフォルトでインストールすると「何もできない Visual Studio」となります。

新規に作ろうとしても「空のソリューション」だけとなってしまいます。

対応方法としては、この画面の左下の Visual Studio インストーラーを開くをクリックするか、スタートメニューの Visual Studio Installer を起動してください。
インストーラーで「変更」ボタンをクリックすると、ワークロードの選択画面になりますので、自分のやりたいことに応じて選択しましょう。

VB.NET や C# でデスクトップアプリケーションを作りたい方

「.NET デスクトップ開発」を選んでください。

msdn20170701_2

C++ でデスクトップアプリケーションを作りたい方

「C++によるデスクトップ開発」を選んでください。

ストアアプリ(UWP)を作りたい方

言語を問わず、UWP アプリ開発を希望する方は「ユニバーサルWIndowsプラットフォーム開発」を選んでください。

Visual Studio 2017/2019のインストール時の選択

Visual Studio 2017/2019はインストーラーがこれまでと大きく変わっています。
基本的にはやりたいことベースに選べば必要なコンポーネントがインストールされますので、きちんと目的で選びましょう。
もちろん、複数同時に選んでも良いので、可能性があるのならあらかじめチェックを入れておくのも手です。その分、ダウンロードやインストールに時間がかかったり、ディスクの領域を多く消費しますのでご注意ください。

    • .NETデスクトップ開発
      C#やVB.NETでWindowsフォームアプリケーション、コンソールアプリケーション、WPFアプリケーションなど、昔からある方法で、.NETアプリケーションを開発するケース
      多くのC#、VB.NETのWindowsアプリ開発者の方はこれにチェックを入れておいた方が良いでしょう。
      (これを選択してもC++/CLIではWindowsフォームアプリケーションの新規開発はできなくなっています。2012から非推奨になっているためです
    • C++によるデスクトップ開発
      C++を使ったWin32プロジェクト、ATLプロジェクトなどを使いたい場合はこちら。
      C++で開発される方は、個別コンポーネントで「デスクトップC++ x86 およびx64用Windows 10 SDK (10.0.15063.0)」や「Windows SDK (10.0.14393.0)」にもチェックを入れておきましょう。既知の問題を回避するためです。
      また、MFCが必要な方は個別のコンポーネントで「MFCとATLのサポート(x86とx64)」も忘れずに選択しましょう。
    • ユニバーサルWIndowsプラットフォーム開発
      C#、VB.NET、C++などでWindows 10 PC、Mobile、HoloLensなど、UWPアプリを作りたい方はこちら。

ほかにもWeb系などいろいろとありますが、私自身が詳しくないので割愛します。
もし、インストールしたけど特定のプロジェクトが見つからない、ソリューションしか作成できないといった時は、Visual Studio Installerを起動して、変更ボタンをクリックして、オプションを確認しましょう。

何も選んでいなかった場合

ソリューションしか作成できません。

image

.NETデスクトップ開発を選んだ場合

見慣れたWindowsフォームアプリケーション、コンソールアプリケーション、WPFアプリケーションが作成できます。

image

C++によるデスクトップ開発を選んだ場合

Win32コンソールアプリケーション、Win32プロジェクト。
見ての通り、MFCはワークロードを選ぶだけでは入らないので、必要な方はワークロードタブでC++によるデスクトップ開発を選んだ後に、個別コンポーネントでMFCのチェックを入れましょう。

image

ユニバーサルWIndowsプラットフォーム開発

空のアプリほか、ユニバーサルWindowsで必要なプロジェクトのみインストールされます。

image

※本稿はVisual Studio 2017 (15.2)の時点の情報です。Visual Studio 2017はインストーラーを含め、1ヶ月に1度程度のアップデートが提供されていくため、執筆時点と現在とで状況が異なる可能性があります。

VS2017/2019は異なるSKUを共存させることができる

これまでの Visual Studio は Express 以外の Community, Professional, Enterprise を共存させることはできませんでした。

Visual Studio 2017/2019 ではインストールの仕組みが変わったため、Community, Professional, Enterprise といったエディション(SKU)のインスタンスを共存させると言うこともできます。
開発環境のエディションごとの検証が必要な人は便利かもしれません。

なお、それに伴い、Visual Studio のインストール先が必要なケースでは vswhere というツールが便利です。すべてのインスタンスを列挙してくれます。

出力例

Visual Studio Locator, version 1.0.50
Copyright (C) Microsoft Corporation. All rights reserved.

instanceId: 1d4779be
installDate: 2017/03/11
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
installationVersion: 15.0.26228.4
displayName: Visual Studio Community 2017
description: 学生、オープン ソース、および個々の開発者のための無料で完全な機能を備えた IDE
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

instanceId: 29de2085
installDate: 2017/03/12
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
installationVersion: 15.0.26228.4
displayName: Visual Studio Enterprise 2017
description: 生産性向上と、さまざまな規模のチーム間の調整のための Microsoft DevOps ソリューション
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

instanceId: 2df6de13
installDate: 2017/03/11
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional
installationVersion: 15.0.26228.4
displayName: Visual Studio Professional 2017
description: 小規模なチーム向けのプロフェッショナルな開発者向けツールおよびサービス
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

Visual Studioで「Windowsフォームアプリケーション」テンプレートが見つからない?

Visual Studio 2017 の方はインストール時の選択が問題の可能性があります。こちらをご覧ください。


MSDN フォーラムにおいて短期間に 2 件の質問があったので書いてみます。

たとえば、Visual Studio 2015 Community を Windows 10 にインストールすると、スタートメニューの上の方にある、最近追加されたものに以下のように表示されます。

image

ついつい、Visual Studio 2015 という文字に惹かれて起動してしまいそうになりますが、これは Blend といって、WPF などの画面デザインに使うアプリケーションであって、Visual Studio ではありません。
Blend は Windows フォームアプリケーションに対応していないので、プロジェクトの新規作成で表示されず、画面も似ているので混乱してしまいます。

スタートメニューをスクロールして、V のカテゴリにある Visual Studio 2015 のアイコンで起動してください。

image

(備考)Visual C++ では「Windows フォーム アプリケーション」テンプレートは廃止されています

Visual C++ の「Windows フォーム アプリケーション」のプロジェクトテンプレートは 2012 から廃止されています。現在、新規開発は非推奨になっているのでご留意ください。

https://support.microsoft.com/ja-jp/kb/3001686

これを無視して過去のバージョンのテンプレートで作ってくる、あるいは公開・配布されている第三者のテンプレートを使えば新規に作ることはできますが、将来性の懸念があること、C++ と .NET の両方の知識を十分求めるハードルの高さ、サンプルの少なさ、できあがったものは C++/CLI という独自の言語であって C++ ではないことから、この道を選ばないことを推奨します。

Win10 1607(Anniversary Update)とD&D

Technet blogsにこんな記事が掲載されていた。

「資格情報ダイアログが表示されると、ドラッグが開始できなくなる問題について」
https://blogs.technet.microsoft.com/askcorejp/2016/09/14/cannot-drag-on-an-application-with-windows-10-anniversary-update/

 

この記事によると、Anniversary Update を当てた Windows 10、つまり Win10 Ver1607 において、資格情報ダイアログが表示されるようなことがあると、そのプロセスではドラッグが開始できなくなるそうだ。

手元で実験してみると、確かに、.NET の DoDragDrop メソッドを呼んでも何も起きなくなる
自前で MouseDown から MouseMove、MouseUp とドラッグ&ドロップを実装しているのであれば影響しないのかもしれないが、DoDragDrop メソッドを使っていればこの不具合に遭遇しうる。
そして、現状の回避策はプロセスの再起動しかない。

もっとも、資格情報が表示されるケースとなると、ユーザーが指定した任意のパスにアクセスするロジックを持つか、アプリが表示したコモンダイアログでユーザーがそういったパスを入力した時なので、発生現場は限られるのかもしれない。

(ファイラー機能を持つアプリは死亡率が上がりますが…)

Skype for Business(SfB) Web Appで「オーディオデバイスエラー」となって音が聞こえない場合

Skype for BusinessのWeb Appの会議に招待されるなどしても、「オーディオデバイスエラー」となって音が聞こえないことがあります。

このときは、マイクなどの録音(入力)デバイスが1つ以上あるかを確認してみましょう。
ヘッドホン・スピーカーなどの再生デバイスだけしか存在しない場合は、音を聞くこともできないようです。(2016/08/01現在)
入力デバイスがあっても接続されていないことでエラーになっているかもしれないので、もし、何もつながっていない場合は何かマイクをつないでみて改善するか試してみましょう。

Visual Studio 2015でTeam Explorer for Microsoft Visual Studio 2015のインストール中に致命的なエラーが発生するケース

前からの事例ですが、備忘として残しておきます。

発生する事象

Visual Studio 2015 のインストールにおいて、以下のようなエラーが表示されることがあります。

  • Team Explorer for Microsoft Visual Studio 2015で「インストール中に致命的なエラーが発生しました。
  • Microsoft NuGet – Visual Studio 2015 などのいくつかのパッケージでで「パッケージの実行は失敗しました。」

私自身も職場で遭遇して困りました。再度インストーラーを立ち上げても同様のエラーで進まないためです。

 

対策

コマンドライン引数/uninstallを指定して実行し、アンインストール処理を実行する。
それからインストールをやり直せばうまくいきました。
MSDN フォーラムでの成功事例

 

vs_professional.exeやvs_professional_JPN.exeなど、Webインストーラーの起動時にこれを指定すればOKです。メディアからでも同様にvs_professional.exeがあるはずなので、それに/uninstall引数をつけてやればOKです。Community、Express、Enterpriseはファイル名違いますので、それに合わせてください。

 

手順例

コマンドライン引数を指定する方法がわからない方は以下を参考にしてみてください。

  1. vs_community.exeなど、対象のexeをShiftキーを押しながら右クリックし、「パスのコピー」を選ぶ。
    image
  2. Windowsキーを押しながらRキーを押して、名前を指定して実行を開く。
  3. Ctrlキーを押しながらVキーを押して貼り付けて、半角スペースを空けて /uninstall と打ち込む。
    image
  4. Enterキーを押す。

これでコマンドライン引数をつけて実行となります。