MW211 EXIT

devlog
C#/データグリッドビューの座標指定
2019年02月20日
DataGridView型(データグリッドビュー)において、以下は同じ。
┌──────────────────────────────────────┐
│データグリッドビュー.Rows[Y].Cells[X].Value                                 │
├──────────────────────────────────────┤
│データグリッドビュー[X, Y].Value                                            │
└──────────────────────────────────────┘
分類:VC#
ExcelVBA/プロジェクトまたはライブラリが見つかりません。
2019年02月19日
【現象】
  新しいExcel(例えばExcel2016)で保存したマクロ付きExcelを
  古いExcel(例えばExcel2010)で開いたら、エラーが発生
  ┌───────────────────────┐
  │コンパイルエラー:                             │
  │プロジェクトまたはライブラリが見つかりません。│
  └───────────────────────┘
【原因】
  参照設定が自動変換されるが、その際に変換できないものがあった
  (当該事象は、ファイルを保存するだけで発生する)
  →「参照設定」ダイアログにて、チェックの入っている参照設定中に
    「参照不可」との文言が混じっているはずで、それが直接の原因
【処置】
  当該チェックをはずせばエラーは解消される
  しかし、当該オブジェクトを参照している箇所が動作しなくなるので
  オブジェクト型を汎用的なものにするなどの工夫が必要
  ┌───┬────────────────────────────────┐
  │改善前│Dim objメーラ New As Outlook.Application                        │
  ├───┼────────────────────────────────┤
  │改善後│Dim objメーラ As Object                                         │
  │      │Set objメーラ = CreateObject("Outlook.Application")             │
  └───┴────────────────────────────────┘
分類:ExcelVBA
Excel/条件付き書式の条件を満たす場合は停止
2019年02月18日
過去Excelとの互換性を維持するという観点から
条件付き書式の「条件を満たす場合は停止」を(どちらでもよい場合には)
チェックを入れておいた方がよい。

なお、「条件を満たす場合は停止」これは
IFでTHENの場合にRETURNで抜けるかという話らしい。
分類:Excel
C#/プロジェクトの流用とGUID
2019年02月13日
VisualStudioでプロジェクトをまるごと流用する場合、
主要なファイルをコピーした上で、プロジェクト名に関わる部分を置換することになる。
この時、GUID変更したいわけだが、変更する方法は、
これまた地道に置換しかないようだ、
但し、適当な新GUIDにしたのでは意味がないので、採番の方法はあるようだ。

【新GUIDの採番方法】
  メニューバー「ツール」より「GUIDの作成」を選択。
  そこで「4.レジストリ形式」を選択し「コピー」ボタンを押下
  (「新規GUID」ボタン押下で別のGUIDが生成される)
  →これでいくつかGUIDを採番しておく

【GUIDの置換】
  秀丸エディタの正規表現であれば、以下でGUIDを洗い出し
  同一GUIDごとに新GUIDに置換していく
┌──────────────────────────────────────┐
│\{\c{8}\-\c{4}\-\c{4}\-\c{4}\-\c{12}\}                                      │
├──────────────────────────────────────┤
│\c{8}\-\c{4}\-\c{4}\-\c{4}\-\c{12}                                          │
└──────────────────────────────────────┘

【アセンブリ情報のGUID】
  アセンブリ情報のGUIDについては、上記でも置換できるが(正規表現的には後者で検索)
  VisualStudioの画面から以下の通り変更することができる。

  「ソリューションエクスプローラー」上の、
  C#プロジェクトの右クリックメニューから「プロパティ」を選ぶ。
  開いた画面にて、左メニューの「アプリケーション」で
  (画面右の)「アセンブリ情報」ボタンを押下。

  「アセンブリ情報」ウインドウにて、「GUID」に貼り付け
  ちなみに「{}」付で貼り付けてもOK(自動で除去される)

  →「\Properties\AssemblyInfo.cs」のGUIDが置換される
分類:VC#
Excel/条件付きセルの書式(2)
2019年02月12日
数式にてある列が特定の値の場合に、セルを着色したりする場合の条件式の記載の方法。

左端が「×」の場合という条件
┌──────────────────────────────────────┐
│=$A1=×"                                                                    │
└──────────────────────────────────────┘

左端が「×」か「△」の場合という条件
┌──────────────────────────────────────┐
│=OR($A1="×",$A1="△")                                                      │
└──────────────────────────────────────┘

一番左の「=」は気にせず、IF()の条件文(第一引数)を記載すればよいようだ。

ちなみに一番左の「=」を入力しないで入力すると、
以下みたいに勝手に解釈(変換)されて、意図した結果とならないので注意。
┌──────────────────────────────────────┐
│="$A1=""×"""                                                               │
└──────────────────────────────────────┘
分類:Excel
C#/数値(自然数)のチェック
2019年02月11日
┌──────────────────────────────────────┐
│int 数値化;                                                                 │
│if ((!int.TryParse(変数.ToString(), out 数値化)) || (数値化 <= 0)) {        │
│    MessageBox.Show("数値(自然数)を入力してください",                       │
│                    "入力エラー",                                           │
│                    MessageBoxButtons.OK,                                   │
│                    MessageBoxIcon.Exclamation);                            │
│}                                                                           │
└──────────────────────────────────────┘
分類:VC#
C#/DataGridViewで編集中に矢印キーで隣に行かせない
2019年02月10日
DataGridViewで編集中に、先頭で左もしくは末尾で右の矢印キーを押すと
隣のセルに移動していまうという現象がある。
Excelの場合はそうはならないので、C#でもそのようにしようと思ったが
結構苦労した(解決できたがそれがベストプラクティスかもわからない)
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【非編集中のみの制限】
┌──────────────────────────────────────┐
│private void データグリッドビュー_KeyDown(object sender, KeyEventArgs e)    │
│{                                                                           │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        e.Handled = true;                                                   │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
まず、データグリッドビュー本体のKeyDownイベントで制限をかけてみたが
まったく矢印キーを受け付けなくなってしまった。
しかも、マウスを使って編集中にして試してみたら本題の部分が筒抜けだった。
これは、まったくの逆効果だ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【編集中のみの制限】
┌──────────────────────────────────────┐
│private void データグリッドビュー_EditingControlShowing(                    │
│    object sender, DataGridViewEditingControlShowingEventArgs e)            │
│{                                                                           │
│    if (e.Control is DataGridViewTextBoxEditingControl) {                   │
│        DataGridViewTextBoxEditingControl テキストボックス                  │
│            = (DataGridViewTextBoxEditingControl)e.Control;                 │
│        テキストボックス.KeyDown -= new KeyEventHandler(自作イベント);      │
│        テキストボックス.KeyDown += new KeyEventHandler(自作イベント);      │
│    }                                                                       │
│}                                                                           │
│──────────────────────────────────────│
│private void 自作イベント(object sender, KeyEventArgs e)                    │
│{                                                                           │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        //e.Handled = true;                                                 │
│        e.SuppressKeyPress = true;                                          │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
次に、編集中(テキストボックス)のKeyDownイベントで制限をかけてみた。
こちらは、子テキストボックスのイベントを自作する感じなのだが
これだと、編集中はまったく矢印キーを受け付けなくなってしまった反面
こちらも本題の部分が筒抜けだった。
こちらも一つ前のと互角の逆効果バージョンだ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【セルを移動させない】
┌──────────────────────────────────────┐
│private void データグリッドビュー_CellValidating(                           │
│    object sender, DataGridViewCellValidatingEventArgs e)                   │
│{                                                                           │
│    e.Cancel = true;                                                        │
│}                                                                           │
└──────────────────────────────────────┘
で、どうも調べてみると、本題の場合、KeyDownイベントの前に
編集中イベントは解散してるっぽいことがわかった。
つまり、編集中に末尾で右矢印キーを押すと、
PreviewKeyDownイベントは反応するのに、KeyDownイベントはまったく反応しないのだ。
ということで、編集後の方で制御できないものかと方針を変更。
セルが移動した時に(移動しそうになった時に)それを禁止する方法を検証。
これだとまったく制御不能でどうしようもないが、検討的には大きな前進だ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【編集中から非編集中に変わる直前での制限】
┌──────────────────────────────────────┐
│private bool mIsセル移動禁止;                                               │
├──────────────────────────────────────┤
│public コンストラクタ()                                                     │
│{                                                                           │
│    mIsセル移動禁止 = false;                                                │
│}                                                                           │
├──────────────────────────────────────┤
│private void データグリッドビュー_CellValidating(                           │
│    object sender, DataGridViewCellValidatingEventArgs e)                   │
│{                                                                           │
│    if (mIsセル移動禁止) {                                                  │
│        e.Cancel = true;                                                    │
│    }                                                                       │
│}                                                                           │
├──────────────────────────────────────┤
│private void データグリッドビュー_EditingControlShowing(                    │
│    object sender, DataGridViewEditingControlShowingEventArgs e)            │
│{                                                                           │
│    if (e.Control is DataGridViewTextBoxEditingControl) {                   │
│        DataGridViewTextBoxEditingControl テキストボックス                  │
│            = (DataGridViewTextBoxEditingControl)e.Control;                 │
│        テキストボックス.PreviewKeyDown                                     │
│            -= new PreviewKeyDownEventHandler(自作イベント);                │
│        テキストボックス.PreviewKeyDown                                     │
│            += new PreviewKeyDownEventHandler(自作イベント);                │
│    }                                                                       │
│}                                                                           │
├──────────────────────────────────────┤
│private void 自作イベント(object sender, PreviewKeyDownEventArgs e)         │
│{                                                                           │
│    mIsセル移動禁止 = false;                                                │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        mIsセル移動禁止 = true;                                             │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
ということで、完成。
自作イベントをPreviewKeyDown側に設置し、編集中の矢印キー押下を認識。
それをメンバ変数で伝達し、さきほどのセル移動させない処理にて
その制限を限定することにより、思った通りの動作となった。
分類:VC#
ExcelVBA/オートシェイプ画像をフォームへ出力
2019年02月09日
オートシェイプとしてシートに貼り付けられた画像は
そのままフォームには表示できない模様。
一旦、画像ファイルとして出力して、それをフォームに表示する形になる。
しかも画像ファイルとして出力する際には、グラフの貼り付けて保存する形をとる。
┌──────────────────────────────────────┐
│Dim 画像 As Shape, 画像パス As String, 仮グラフ As Variant                  │
│For Each 画像 In ActiveSheet.Shapes                                         │
│    If 画像.Type = 13 Or 画像.Type = 11 Then ' 画像の場合                   │
│        画像パス = ThisWorkbook.Path & "\ダミー.jpg"                        │
│                                                                            │
│        画像.CopyPicture                                                    │
│        Set 仮グラフ = ActiveSheet.ChartObjects.Add(0, _                    │
│                                                    0, _                    │
│                                                    画像.Width, _           │
│                                                    画像.Height).Chart      │
│        仮グラフ.Parent.Select  ' Excel2016特有の不具合対策                 │
│        仮グラフ.Paste                                                      │
│        仮グラフ.Export Filename:=画像パス, filtername:="JPG"               │
│        仮グラフ.Parent.Delete                                              │
│                                                                            │
│        ユーザフォーム.画像.Picture = LoadPicture(m画像パス)                │
│        ユーザフォーム.Show                                                 │
│        Kill 画像パス                                                       │
│        ' ユーザフォーム側でクローズして戻ってくる想定                      │
│    End If                                                                  │
│Next 画像                                                                   │
│MsgBox "おしまい", vbInformation, "終"                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
Windows/Windowsアプリの歴史
2019年02月08日
│┌─┬───┬───────┬─────┬───┬─────────────┐
││○│Win32 │Windows95~   │C++,VB6.0 │.exe  │非.netの元祖Windowsアプリ │
┼├─┼───┼───────┼─────┼───┼─────────────┤
││○│Forms │WindowsXP~   │C#        │.exe  │.netを導入                │
│├─┼───┼───────┼─────┼───┼─────────────┤
││△│WPF   │WindowsVista~│C#/XAML   │.exe  │XAMLを導入                │
│├─┼───┼───────┼─────┼───┼─────────────┤
││  │WinRT │Windows8~    │C#/XAML/JS│.appx │スマホ対策(ユニバーサル化)│
│├─┼───┼───────┼─────┼───┼─────────────┤
││△│UWP   │Windows10~   │C#/XAML/JS│.appx │ユニバーサル化の最終形    │
↓└─┴───┴───────┴─────┴───┴─────────────┘
    ここでいうスマホはあくまでWindowsPhoneなので注意

一般的なスマホ対策(iPhone、Android)としては「Xamarin」となるのであろうか

古い世代(Win32、Forms)の方が安定している一方で
新しい世代(WPF、UWP)は不発気味というねじれ現象のため
今はどれに飛びついてよいのか不透明という状況のようだ
(ひとまずやや後ろ向きな感じがするがFormsで様子見か)

分類:Windows
Windows10/Windows Defender
2019年02月07日
「Windows Defender」の定時スキャンを設定したいのだが、
「Microsoft Security Essentials」の場合と違って、設定する方法が見当たらない。

「タスクスケジューラ」でスケジュール設定するという情報もあるが
そこで実行すると、戻り値0x2となりうまくいかない。

一方で、自動メンテナンスで対応するという情報もある。
(定時自動メンテナンスの一部としてスキャンが行われるらしい)

設定方法は以下の通り。
┌──────────────────────────────────────┐
│「コントロールパネル」から「システムとセキュリティ」を選択                  │
│「システムとセキュリティ」から「セキュリティとメンテナンス」を選択          │
│「メンテナンス」の部を開き、                                                │
│「自動メンテナンス」の「メンテナンス設定の変更」を押下                      │
│「自動メンテナンス」ウインドウが開くので                                    │
│「メンテナンスタスクの実行時刻(毎日)」を既定から適宜変更(*1)                │
│「OK」ボタン押下で設定を確定                                                │
│*1:なぜか深夜(「2:00」など)に初期設定されてるっぽい                        │
│    昼休み(「12:00」)とかに変更すればいいのだろうか                         │
└──────────────────────────────────────┘
分類:Windows
前へ 1 … 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 … 156 次へ