2018年5月23日水曜日

コントロール一覧からTextBoxだけ選んでみる

Formsでフォーム一覧、Controlsでコントロール一覧が取得できるのは、なんとなくわかってた。
そのコントロールがナニモノかとゆー判断をドコでするんだろう思ったら、
TypeName()関数ってモノが用意されてた。
一番上にさらっと”objecttype 型のオブジェクト”とか書いてあって、
先日書いたVarType()が定数で返すのに対して、Stringで帰ってくる関数?
と、あやうく流すトコだった。
…いざStringで返されると、定数で帰ってきた方が扱いやすいな( ゚-゚)~゚と思ったり(ぉぃ

TypeName()くん。変数の型だけでなく、オブジェクトの型も教えてくれる。

Private Sub Select_TextBox()
  Dim Con_Type As String
  Dim Con As Control
  For Each Con In Me.Controls
    Con_Type = TypeName(Con)
    If Con_Type = "Textbox" Then
      Debug.Print Con_Type & ":" & Con.Name
    Else
      Debug.Print Con_Type
    End If
  Next
End Sub

コレで、Me(フォーム)に直接乗っかってるオブジェクト…
コントロールの種類がずらずら表示され、
TextBoxだけ、そのコントロール名も併記する例。

これで決まったコントロールだけ初期化するなどできる。んじゃないかな( ゚-゚)~゚


2018年5月22日火曜日

コントロールをまとめて表示/非表示にする

なんかの言語でやったんだ。
フレームにコントロールを並べてグループ化し、まとめて表示させたり非表示にさせたり。
ソレをAccessVBAでやりたいんだけどどーしたらいい?とぐぐったら、
『Accessでは用意されていない。コントロールを拾ってループ処理する。』
と、ゆー模範解答があった。

 『…実に興味深い。』

そこで、代替手段を考えてみた。
…5分後…ふつーにタブにコントロール乗せられるじゃん( ゚-゚)~゚


こんな感じ。タブの名前はタブ10。その中のページ”Test用”。
このタブの部分の名前=表題として出てしまって、消すことは出来なかった。
Accessははみ出して配置できないのが難点かなぁ。
VBAからやろうとしたらなんか怒られたし。

そんなわけで、コマンドボタン9ぽちると、

Private Sub コマンド9_Click()
   タブ10.Visible = Not タブ10.Visible
End Sub

が、動いて、(True/Falseが入れ替わり)
タブ10と乗っかってるコントロールがまとめて出たり消えたりします。

もちろん、その後ろになにかコントロールを隠しておけば、それが表示されます。
複数のタブを重ねても、タブコントロールのVisibleを操作するだけなので、
複数のフォームを開くことなく、簡便にフォームの内容を変化させられます。

…いやまぁ、素直に別フォーム開いた方が遥かにキレイで簡便なんですが、
今回は手順をおって進める仕組みなので…( ゚-゚)~゚

 『ありえない?ありえないなんてありえない。』


2018年5月18日金曜日

変数やプロパティの型を知りたい

VarTypeって関数がある。
返り値と定数を比べろってぇモノ。大変不親切である。
まぁ、わりとなんでも融通利かせちゃうVBならこんなもんかと思わなくもない(ぉぃ
でも、ボクは明示的に宣言するのがスキである。あとで大事故にならないように。

そんなわけで、お手軽に調べられるよう、こんなモンをつくって、
標準モジュールに置いておくようにした。


Public Sub VerTypeCheck(ByRef Variable)
  Dim VarType_Number
  Dim Str_Return As String
  Str_Return = ""
  
  VarType_Number = VarType(Variable)
  If VarType_Number > vbArray Then
    Str_Return = "配列:"
    VarType_Number = VarType_Number - vbArray
  End If
  
  Select Case VarType_Number
    Case vbEmpty
      Debug.Print (Str_Return & "Empty:Empty値 (未初期化)")
    Case vbNull
      Debug.Print (Str_Return & "Null:Null値 (無効な値)")
    Case vbInteger
      Debug.Print (Str_Return & "Integer:整数型")
    Case vbLong
      Debug.Print (Str_Return & "Long:長整数型")
    Case vbSingle
      Debug.Print (Str_Return & "Single:単精度浮動小数点数型")
    Case vbDouble
      Debug.Print (Str_Return & "Double:倍精度浮動小数点数型")
    Case vbCurrency
      Debug.Print (Str_Return & "Currency:通貨型")
    Case vbDate
      Debug.Print (Str_Return & "Date:日付型")
    Case vbString
      Debug.Print (Str_Return & "String:文字列型")
    Case vbObject
      Debug.Print (Str_Return & "Object:オートメーション オブジェクト")
    Case vbError
      Debug.Print (Str_Return & "Error:エラー値")
    Case vbBoolean
      Debug.Print (Str_Return & "Boolean:ブール型")
    Case vbVariant
      Debug.Print (Str_Return & "Variant:バリアント型 (バリアント型配列にのみ使用)")
    Case vbDataObject
      Debug.Print (Str_Return & "DataObject:非OLEオートメーションオブジェクト")
    Case vbDecimal
      Debug.Print (Str_Return & "Decimal:10進数型")
    Case vbByte
      Debug.Print (Str_Return & "Byte:バイト型")
    Case vbArray
      Debug.Print (Str_Return & "Array:配列")
    Case Else
      Debug.Print (Str_Return & "???:わかんない:" & VarType(Variable))
  End Select

End Sub


VerTypeCheck 変数やプロパティ
とか、
Call VerTypeCheck(変数やプロパティ)
って呼び出してやると、Debugにナニモノかを吐き出してくれる。
仕様上、”Array:配列”が出力されるコトはないんだけど、一応Caseに含ませてある。
やってることは、まぁMSDNでゆってること丸写しなだけ( ゚-゚)~゚

[Access]ちっこいけど便利なアレ。








フォームデザインのとき、レコードソースを指定すると出てきてくれるこの子。
フィールド名をひょいひょいドラッグアンドロップだけで、連結コントロールが作れて大変便利。

…×押して消してしまった(パニック

そんな便利な彼女の名は、『フィールドリスト』。
メニューの[表示]→[フィールドリスト]で再会できました(*゚-゚)
よかったよかった。

[Access]ラベルとかコロンとか勝手につけないようにしてみる。

ちからは『過度な情報はインターフェイスのアクセシビリティを下げる』と思っている。
簡単にいうと、見てわかるモンに表題なんかつけんな!ってコト。
主に、閲覧画面の場合、どう見たって、ソコには名前が入ってるんだから、
ソコにわざわざ「名前:」なんてラベルつける必要はない。と思っている。
まして、帳票フォームに(以下略

そんなわけで、フォームデザイン時、勝手につけられるのを防ぐ方法。

『ツールボックス』のラベルつけたくない子をぽちる。ツールバーんトコのでもOK
今回はテキストボックス。チェックボックスとかにも同じコトができる。


すると、規定の[コントロール名]って画面が開くので

「ラベル自動作成」をいいえにする。同様に「コロン付加」も外せる。

これで、『このファイルのみ』勝手につける設定を外すコトができる。
Access自体の規定にはできないぽ。

帳票フォームの場合、フォームヘッダにラベルがあると見やすいので、
ボクは先に、必要分のフォームにラベル付きで作っておいて、
それ以外は、この、規定をいじってから作るようにしよう!と決めました。

…でも、次の開発んときには、とっくに忘れてて、
勝手に作られてあひゃ!ってなるに10点( ゚-゚)~゚


2018年5月16日水曜日

TopMostでハマってみた。

最前面に表示するプロパティ.TopMost = Trueを指定したハズのtoolが隠れてしまった。
どっか間違ってたかな?ちゃんとTopに来てたと思ったんだが…と、リビルド。
お、ちゃんとTopに来てる来てる。別マシンにコピって…あれ?( ゚-゚)~゚
…なんかの拍子に.TopMostが機能しなくなる?

テストモジュール作ってみたけど、最初のビルドでは隠れてしまったり、
コード内で指定してやったら、なんかちゃんと動いてるぽ?
…とおもったら、アレ?隠れた?てゆか、どのバージョン動かしてる?オレ!?

って、なったので、元々のTOOLに、こしょーり、ココをクリックすると、
.TopMostの値を表示する仕掛けを仕込んでみた。
再現が楽しみ(*゚-゚)

ちなみにコレがテストモジュール。気に入ったぜ、リッチテキストボックス!


  Private Sub TopMost_Test()
    Me.Rtb_Display.Clear()
    Me.Rtb_Display.AppendText("TopMost_Test" & vbCrLf)
    Me.Rtb_Display.AppendText("フォームデザインのまま" & vbCrLf)
    Me.Rtb_Display.AppendText("TopMost:" & Me.TopMost & vbCrLf)
  End Sub
  Private Sub Btn_Etc_Click(sender As Object, e As EventArgs) Handles Btn_Etc.Click
    Me.TopMost = Not Me.TopMost
    Me.Rtb_Display.AppendText("Codeで指定" & vbCrLf)
    Me.Rtb_Display.AppendText("TopMost:" & Me.TopMost & vbCrLf)
  End Sub

試す方はフォームに、ボタン: Btn_Etc と リッチテキストボックス: Rtb_Display を用意してあげてください。 …いねーと思うけど( ゚-゚)~゚ ん~、VBのコード内部(FormのLoadの最後)で、Me.TopMost = true 、ReleaseでRebuildした子がなんか安定してる気がする。

多次元配列の要素数をとってみる。

2次元配列をぐるぐるさせるのに、1次元配列と同様、.Lengthで終了判断したら、
実行時にOut of rangeだかで怒られた( ゚-゚)~゚
…じゃぁ、こうだ!Arr(0).Length!!
コンパイルすら通らなかった(笑

素直にググると、.GetLengthなるプロパティがあった。
ちょっと動作確認で作ってみた。

  Private Sub GetLength_Sample()
    Dim Arr(3, 5, 9) As String
    Dim i, j, k As Integer
    Debug.Print(Arr.GetLength(0)) '4
    Debug.Print(Arr.GetLength(1)) '6
    Debug.Print(Arr.GetLength(2)) '10

    For i = 0 To Arr.GetLength(0) - 1
      For j = 0 To Arr.GetLength(1) - 1
        For k = 0 To Arr.GetLength(2) - 1
          Debug.Print(i & ":" & j & ":" & k)
        Next
      Next
    Next
  End Sub

うむ。コレでよし(*゚-゚)

てゆかね、それなら1次元配列でも、.GetLengthを使うべきでしょ( ゚-゚)~゚
あちこちで、.Lengthで終了判定させてるExampleあるけど、
多次元でも対応できる.GetLengthに統一すべきだと声を大にして言いたい!!
…ボクみたいにハマるヤツがいるから( ゚-゚)~゚

ソレよりもまぁ、配列宣言と、要素数、MAXの添字が
ばらんばらんなVBの配列のほーが分かりづらいが。

元々、BASICで、配列のINDEXは1から始まっていたので、すげースッキリしてたのに、
他の言語との対応のためかねぇ…中途半端にINDEXだけを0からにしやがって。
どうせ変えるなら、そっくりそのままCなりと同様にすればよかったのに…。

2018年5月15日火曜日

クリップボードを監視してみる。

作業がペンディングになり開発?が止まるとブログの更新も止まってしまう。こまった。

そんなわけで、VBでクリップボードを監視してみる。
vistaより前は、なにやら不都合のある関数を使っていたらしいのだが、
vista以降は、AddClipboardFormatListenerなるAPI関数が用意されているらしい。
そんなわけで、vistaより前のPCでは動かないハズなプログラム。
そのうちXPで試してみよう。


Public Class MainForm
  'API宣言
  Private Declare Function AddClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  Private Declare Function RemoveClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  'クリップボードに書かれたWnnProc定数:WM_DRAWCLIPBOARD = &H031D
  Private Const WM_DRAWCLIPBOARD As Integer = &H31D

  Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddClipboardFormatListener(Me.Handle)
  End Sub

  Private Sub MainForm_Closed(sender As Object, e As EventArgs) Handles Me.Closed
    RemoveClipboardFormatListener(Me.Handle)
  End Sub

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Dim iData As IDataObject = Clipboard.GetDataObject()

    If m.Msg = WM_DRAWCLIPBOARD Then
      Debug.Print("")
      If iData.GetDataPresent(DataFormats.Text) Then
        Debug.Print(CType(iData.GetData(DataFormats.Text), String))
      End If
    End If

    MyBase.WndProc(m)
  End Sub
End Class

AddClipboardFormatListenerで、
Windowメッセージでクリップボードの更新を受け取れるようにし、
内容の型をチェックしtextならDebug.Printする。
フォームを閉じるときRemoveClipboardFormatListenerしてるけど、いらない処理だよな( ゚-゚)~゚
ちなみにWndProc()は、ひっきりなしに呼ばれる関数なため、
Ifの外にはよけーな動作をさせないように。
てゆか、クリップボード関連のモノだけをHOOKするよーな方法がありそうなモンだが…
なんかすげーオーバーヘッド食ってる気がして(Debugger見る限り気のせい)なんかイヤ(ぉぃ

追記:XPで動かしてみた。
 Debugだけじゃなく、RichTextBoxとかゆーなんか贅沢そーなヤツに吐いてみた。
 とりあえず開発環境のWin10。
 うんうん、想定通りの動作。

  そしてXPくん。
ふつーに怒られた( ゚-゚)~゚
なんかもうちょっと異常な動作を期待したのに(*゚-゚)

…UserID?気にしない気にしない(ぉぃ


2018年5月7日月曜日

google/code-prettify導入 その2

先の記事で、code-prettifyの公式HPからコードをコピペしたら、
なんかキレイに成形されてたので、もしかして簡単なのか?と、
ちょっといじりたくなった。

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow-wrap: break-word; overflow: auto; word-break: break-all; word-wrap: break-word;">
  source code here
</pre>

なんかちょっと近づいた(*゚-゚)
<pre>にちょみっと書き足しただけ。
でも長い文章は折り返してほしいのだけれども、なんかスクロールバーが出てしまう。
いやまぁ知ってる人は、そう設定してるじゃん!って言うかもだけど…( ゚-゚)~゚

てゆか、ちょっと調べてみたけれども、
いろいろオプションだのの説明してくれてる人たちがいたが、
未だに、こんな可読性の低いHtmlやCSSを手書きしてるのか?
なんかWordとかみたいにイメージ書いたら
HtmlとかCSSに翻訳してくれるよーなモンなんか簡単に作れそうな気がするのだが…

ボク的導入方法はこちらgoogle/code-prettify導入

2018年5月6日日曜日

google/code-prettify導入

google/code-prettifyを導入してみた。
例はこちら
外部ファイルを持てないBloggerでは、別のサーバなりからCSSファイルをもらう方法もとれるらしいが、Google内部で済ませたいからBlogger選んだのにヨソも使うぐらいなら引っ越すわ!ぐらいにめんどちいので、なんとかならんか?と本気で調べてみたら、code-prettifyなるものがあるとゆーこと、CDN…コンテンツデリバリーネットワークだっけ?…から、CSSをもってこれるとゆーことがわかったのでやってみた。

…いろいろハマったわっ!orz

ボクのHTMLの知識ってのは、ウチにある本…最新版!Ver.1.1!とうたってる本の範囲。
CSSって聞いたことあるぞ。スタイルシートってのとは違うのか?( ゚-゚)~゚
ってレベル(笑

でも、実際やることは、2手順。
しかも、一つは、一回設定すりゃソレでOK。

そんなわけで、やること。
まず、新しい投稿で、test用の記事を作ります。
そこでHTMLモードで、
<pre class="prettyprint linenums">
source code here
</pre>
と、書きます。(公式からコピペしたらなんかキレイに(*゚-゚)
source code hereのトコロに、適当な言語を…まぁそのままでもいいけど( ゚-゚)~゚
投稿したら、別ウィンドウででも、そのページを表示しておいてください。

次は、Auto-Loaderの設置
Bloggerのテーマ→HTMLの編集を開き、</head>を探します。
([Ctrl]+[F]で検索ウィンドウが出せます。/headで検索すればOK)
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
その直前に、この行を追加します。

[テーマの保存]をポチったら、先程のtest用記事をリロード[F5]します。
コレで表示が変わり、行番号が追加されれば成功。
もし表示が変わらなければ、どっか間違ってます。一旦、[変更を元に戻す]をポチって
見直し、やり直しをオススメします。
ボクは敢行したため、テーマを新規に選び直すハメになりました(*゚-゚)テヘ

ちなみに、この変更は、Blogger的最適化が行われるらしく、記述順や、
なんてゆーの?</>この閉じる方の…タグ?の書式が簡略化されたりするけど気にしない。


次はカスタマイズ。といっても、簡易にいじれる範囲は大したコトはできないけど。

●テーマの設定方法。
ココ( skin gallery)から、好みのテーマを選びます。
Auto-Loader(テーマの変更で追加した行)に、skinの設定をします。
< script  src = " https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></ script >
ここで大きな罠。
skin galleryではskin名が大文字混じりで書かれています。
でも、skin=…には、全て小文字で入れてやらないと正しく動作しませんでした。
ボクの2時間を返せorz

次に、test用記事の部分。
linenumsオプションを、判別しやすいように入れました。
コレは行番号を表示するオプション。不要なら外してください。
skinによっては、しましまになります。しましまっていいよね(*゚-゚)(なにが?

こちらは記事毎に毎回書く(ボクはひな形をtextでつくってコピペするコトにした)ので、
簡単にTPOに応じて使い分けられると思います。

あとは、一応、自動的に言語の判断はしてくれるらしいのだけど、明示する方法。
Auto-Loaderに、lang=を追加します。
< script  src = " https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?lang=vb&amp;lang=basic&amp;lang=css&amp;lang=sql&amp;lang=wiki&amp;skin=sunburst"></ script >
こんな感じ(だんだん適当になってきた。
ボク環境では、公式の記述じゃうまく書けず、
&を&ampと書き換え…エスケープ?する必要がありました。

index of language handlersで、対応している言語を確認できます。
基本的にはSouce Fileの拡張子と同じだそうです。
…CとかHtmlとかどこいった( ゚-゚)~゚

ちなみに、記事の側で、
<pre class="prettyprint lang-vb">
source code here
</pre>
と、(自動判断の?)ヒントを書くコトもできます。
…でも、Auto-LoaderでLoadしてない言語はどーなるんだろう( ゚-゚)~゚(調べろよ

そんなわけで、公式な書式はココから。

ホントなら、VBEと同じ色にできたら最高なんだけど、
がっつりCSSとかいじって外部ファイルとしてuploadできないとだめぽ。

いっそそれなら、Sourceコピペしたら、色指定したHTML吐き出すようなtool作ろうかとか、
時代を逆行した考えがよぎってしまいました(*゚-゚)

もちっとカスタマイズできた(*゚-゚)



グラフィックドライバーのリセット ショートカットキー

ボクのセカンドマシンは、ビデオボードがイかれてるのか、ドライバが悪いのか、
いつぞやのWindowsの大型Update以来、
各種メニューが表示されないとか、 メッセージボックスの内容が表示されないとか、
そーゆー不具合に直面している。
いろいろ考えられる対策はしたのだが、
時間が経つと再発したりで解決には至っていない。

だがしかし、2018Aprilの大型UpdateでMicrosoftがなんかやらかしたらしく、
Chromeとか使うとPCがフリーズしてしまう状況がでるよーになったらしい。
そろそろ対応完了のようだけど…  対応までの一時的な処置として、
ディスプレイドライバのリセット」のショートカットキーを公開した。

[Win]+[Ctrl]+[Shift]+[B]

…見事不具合解消したよ( ゚-゚)~゚

まぁ、時間たてば、また現象がでるとは思うんだけど、
そしたらまた、[Win]+[Ctrl]+[Shift]+[B]叩いてやりゃOKだろう(*゚-゚)

まぁ、ディスプレイドライバは最適なのを入れてるつもりなので、
やっぱり(?)ビデオボードの物理的問題だと思われる。
おそらく、アプデで、なんかしらの不適切な状態を拾うように変わって、
転げ回ってるんじゃないかと。

ちなみに、syslogには何も出ていない。
元はWin7マシンだったかなぁ?
対応するビデオボードが中古でも1万近くして
金かけてまで直すマシンでもないしなぁ( ゚-゚)~゚と諦めていたトコロに、
すげー朗報(こらこらこら)が届いて超ラッキーでした(*゚-゚)

※2日半後追記
 未だに元気にさくさく反応してくれます。
 根本的なトコを解決してくれたぽい。
 もしかして、実家のPCのコンテキストメニューの表示にラグがあったのも直ってるかも?



2018年5月5日土曜日

WhsShellを使ってみる

カレントディレクトリを指定して外部実行ファイルを実行したくなった。
WhsShellオブジェクトで可能ぽい。
ついでにちょっと便利そうな、SpecialFolders一覧を出してみる。
そして、肩慣らしに、実行時バインディングで書いてみる。


Option Compare Database
Option Explicit

Public Sub WshShell_Test()
  Dim WshShell As Object 'WshShell Object
  '実行する実行ファイル or 拡張子に関連付けされていればそのプログラムが開く。
  Dim Wsh_exe As String  
  Dim Wsh_arg As String  '引数用
  
  Set WshShell = CreateObject("WScript.Shell")
  With WshShell
    '    SpecialFolders の表示
    Debug.Print "AllUsersDesktop:" & .SpecialFolders("AllUsersDesktop")
    Debug.Print "AllUsersStartMenu:" & .SpecialFolders("AllUsersStartMenu")
    Debug.Print "AllUsersPrograms:" & .SpecialFolders("AllUsersPrograms")
    Debug.Print "AllUsersStartup:" & .SpecialFolders("AllUsersStartup")
    Debug.Print "Desktop:" & .SpecialFolders("Desktop")
    Debug.Print "Favorites:" & .SpecialFolders("Favorites")
    Debug.Print "Fonts:" & .SpecialFolders("Fonts")
    Debug.Print "MyDocuments:" & .SpecialFolders("MyDocuments")
    Debug.Print "NetHood:" & .SpecialFolders("NetHood")
    Debug.Print "PrintHood:" & .SpecialFolders("PrintHood")
    Debug.Print "Programs:" & .SpecialFolders("Programs")
    Debug.Print "Recent:" & .SpecialFolders("Recent")
    Debug.Print "SendTo:" & .SpecialFolders("SendTo")
    Debug.Print "StartMenu:" & .SpecialFolders("StartMenu")
    Debug.Print "Startup:" & .SpecialFolders("Startup")
    Debug.Print "Templates:" & .SpecialFolders("Templates")
  End With
  WshShell.currentdirectory = "c:\"  'カレントディレクトリを設定してみる
  '実行ファイルは、cmd.exe。環境変数%ComSpec%からとってきてみる
  Wsh_exe = Environ("ComSpec")
  '起動オプション。 コマンド"set"を実行→ウィンドウを閉じない
  Wsh_arg = " /K set"

  'ウィンドウをふつーに開いて、終了を待たない。
  WshShell.Run Wsh_exe & Wsh_arg, 1, False
End Sub

こんな感じ。( ゚-゚)~゚ ※Wsh_arg = "(こっそりスペース)/K set"
SpecialFoldersや環境変数の他、コマンドプロンプトで、
カレントディレクトリが指定したディレクトリに移動しているコトも確認してください。

…SpecialFoldersは、DesctopとMyDocumentsしか使わなそう。
てゆかそれならEnviron(”USERPROFILE”) & "\Desctop"の方が手っ取り早いか( ゚-゚)~゚
いいもの見つけたと思ったのにゴミだったorz

なんかさ、.Runの引数の説明頑張ってくれてる人や、ADODBの記事みたりしてる中で、

ここの引数は文字列型なので、”(ダブルクォーテーション)でくくらなきゃいけない!
とか、"でエスケープするので”””としなきゃいけない!!
とか、chr(34)とかキャラクターコードで!!!
とか、'(シングルクォーテーション)と組み合わせて!!!!

とか、いろいろ気合入ってる方々がいました。
んなもん、ふつーにString型変数にいれりゃーいいじゃん( ゚-゚)~゚と…
ちなみにMSDNでもこうやって変数に入れてRunさせてました。

まぁ例えば、ダブルクオーテーション付きcsvのように、
ダブルクオーテーション自体を使いたい場合は、
ふつーに
Private Const WQ = """"
とか
Dim WQ as String
WQ = """"
とかしといて文字列連結すりゃ、そーそーややこしいコトにはならないと思うのだが。


2018年5月4日金曜日

オブジェクトまたはクラスがイベントのセットをサポートしていません。

コレは、office2003なんてゆーモンを使ってるせいでおきたモノ。
なかなか同じ状況に陥る人はいないとおもうんだけど一応メモ(笑

VBAを実行させ、ボタンとかでイベント発生させると、
(そのイベントの動作についての説明)+
オブジェクトまたはクラスがイベントのセットをサポートしていません。
とかぬかしてキンコンカンコン鳴るようになってしまった。

おそらく原因は、既存のバグ
実行時エラー '3709'
この動作を実行するために接続を使用できません。
このコンテキストで閉じているかあるいは無効です。
に対応するパッチ。

なんか普通にPatch当たるだけじゃなく、Access起動時にも何回かなんかしてました。

で、ソレがでなくなったら
オブジェクトまたはクラスがイベントのセットをサポートしていません。
の症状。
MSDNに解決法が載っていて、MSACCESS.EXEを管理者で実行すれ!とのこと。
んまぁいいんだけどね…
ちなみに、office12なんてフォルダが出来てて、中にもMSACCESS.EXEがあった。
単独では起動出来ないんだけど、引数にmdbファイルを渡してやると、
あの、悪名高き、左上にWindowsマークのある、フォームが開いた(笑

まぁ正直、ボクは現行のリボン方式もいまいち馴染めてない(探せない)のだけれどもね(笑

CopyFileとFileCopy

VBAでファイルをコピーしたい。
でも、書き込み先が、ReadOnlyで開いていて書けないコトがある。
とゆー状況。
FileCopyステートメントを使ったら頻繁に実行時エラーが出てしまう。
on Error GoToでエラー処理するようcodingしてみた。
On Error GoTo ErrorHandlerSJ
    FileCopy source, destination
    Shell_Return = Shell(browser_exe, vbNormalFocus)
Exit Sub
ErrorHandlerSJ:
    MsgBox ("ErrorSJ")
Exit Sub
…なんか、美しくないな…( ゚-゚)~゚
やっぱりね、プロシージャの途中で終わるなんての、ダメだよね。
やっぱりね、返り値で成否を教えてくれないステートメントなんか使うのが
いけないよね。

そんなわけで、ちゃんと返り値で教えてくれる、おりこうさんな、
FileSystemObjectのCopyFileメソッドを使ってみた。
…実行時エラーでやがりましたorz
美しくないぜMicrosoft!

そんなわけで、
Dim FSO As FileSystemObject
Set FSO = New FileSystemObject
(中略)
On Error Resume Next
FSO.CopyFile source, destination
Select Case Err.Number
  Case 0
    Shell_Return = Shell(browser_exe, vbNormalFocus)
  Case Else
    MsgBox ("ErrorSJ:" & Err.Number)
End Select
こーなりました。
でも、入れ子になったりしたら、
On Error GoToですっ飛ばして終わりにしたほうがキレイなんだろうなぁ…

ちなみに、FileSystemObjectを使うには、参照設定に、Microsoft Scripting Runtimeが必要です。MSDNに書いてなくて探した探した(笑
もちろん、実行時バインディングすれば参照設定はいりません。

…ふと思ったんだけど、VBAの場合は実行時バインディングの方がいいんじゃなかろうか。
よほど多量じゃない限り、オーバーヘッドなんかたかが知れてるし、
違う環境(参照設定していないマシン)でも動くモノを~と考えると、
実行時バインディングの方が有利なんじゃないかと…

人様向けに作るときに改めて考えてみよう( ゚-゚)~゚


2018年5月3日木曜日

VBEツールバーカスタム&ショートカットキー

絶対あると思うんだ。選択範囲をコメントアウトしたりする機能。
(…小一時間経過)
…よくわかんないので、独自に設定することにした( ゚-゚)~゚

・メニューバーへ追加
 [表示]→[ツールバー]→[カスタマイズ]→[コマンド]タブ
(Office2003では[表示]→[ツールバー]→[ユーザー設定]→[コマンドの配置の変更])
 編集したいツールバー、メニューバーを選択
 (ボクはツールバーの標準に叩き込んだ(*゚-゚)
 挿入したいトコをクリックして[コマンドの追加]
 カテゴリ[編集]→[選択範囲をコメント化]と[選択範囲のコメントを解除]を追加

・ショートカットキーの設定
 割り当てたいコントロール(今回追加したコメント化とか)をクリックして、
 [選択したボタンの編集]をクリック。
(Office2003では[選択したボタンの編集])
 名前に、&(アンパサンド)[割り当てたいキー]を書き、
 スタイルに[イメージとテキストを表示]を選択する。

 例)
  名前:コメント化(&\)
  こーすると、
  表示:アイコン+コメント化(\)
  ショートカット:[ALT]+[\] で起動
  とゆー、Windowsの一般的な感じになる。

  ちなみにボクは、略しまくって、
  名前:&\
  表示:アイコン+\
  とした。

 ※[グループの始まり]にチェックを入れると、メニューバーに縦線がひかれる。

ボクはコメント化には[ALT]+[\]、解除には[ALT]+[/]を選択した。
 カブってなさそで右、左的なイメージで。[と@でもいいかも?
 ただ、そのツールバーが表示されていないと機能しない。
 ツールバーにメニュー作ってもダメだったorz
 まぁ、エラい競合しまくるコト考えたらコレも仕方なしか…
 ショートカットキー用のツールバー作ってもいいぐらいだしなぁ。

 この他インデントも設定しようとしたが、
 なんか灰色になって使えないので消しちゃった。

 ちなみに、[CTRL]+[K]→[CTRL]+[D]とすると、
 ファイル全体のインデントを整えてくれる。
 選択範囲は、K→Fだったかなぁ?よく覚えてない(ぇ

2018年5月2日水曜日

Visual Studio~アイコン追加~

ソリューションエクスプローラーを右クリック[追加]→[新しい項目]
新しい項目の追加 - ソリューション項目 ウィンドウから、
[アイコンファイル] を選択。
[名前]を入力して[追加]ボタン押下。
で、.icoファイル作成

メニューの[プロジェクト]→["プロジェクト名"のプロパティ]→[アプリケーション]タブ
アイコン:プルダウンメニューから、.icoファイル選択

→ビルド

…しかし相変わらずアイコン作成のセンスがない( ゚-゚)~゚