(目次)

■VB6基本

[変数・宣言]
 ・配列
 ・Erase
 ・オブジェクト
 ・固定値(Const)
 ・構造体(Type)
 ・列挙体(Enum)
 ・Static
 ・ByVal
 ・ByRef
 ・Optional
 ・Option Explicit
 ・DefInt
 ・VbModal
  ・QBColor()
 ・切り捨て
 ・切り上げ
 ・偶数
 ・奇数

[ファイル操作]
 ・Dir()関数
 ・Name
 ・FileCopy

[エラー処理]
 ・OnErrorResumeNext
 ・OnErrorGoTo~
 ・Err
 ・Error()関数

■VB6応用
  ・ADO
 ・Excel

    ・参照設定
    ・Excel操作の為の変数を宣言
    ・オブジェクト変数に中身を入れる
        ・既存のエクセルファイルを開く場合
        ・新規に開く場合
    ・操作するシートを選択
    ・コーディング中にエクセルを見ながら作業する場合
    ・印刷範囲設定
    ・コピー
    ・貼り付け
    ・何かをコピーしている事を示すエクセル上のセル選択状態を解除
    ・値だけを削除
    ・表示
    ・印刷
    ・処理が終わったら…

 ・VBA
  ・罫線を引く
    ・セルを結合する
  ・選択状態のセル情報を取得する
    ・表の端のセルを参照する
    ・書式を設定する
    ・シート数
  ・シート名
  ・シートコピー
    ・セル位置を取得する
    ・切り取り・コピー・貼り付け
    ・終端取得
    ・検索
    ・並び変え
    ・フィルタリング
    ・オートシェイプで線を引く

 ・ExcelCreater
 ・INIファイル
 ・WSH(WindowsScriptHost)
 ・VBScript
  ・構文
  ・接続オブジェクト
  ・データセットオブジェクト
  ・コマンドオブジェクト

掲示板

-----------------------------------------------------------------

■VB6基本


配列
 ※同じ名前の変数

普通の変数の場合
(例)
 Dim Hensu1 As Integer
 Dim Hensu2 As Integer
 Dim Hensu3 As Integer

 Hensu1 = Year(Date)
 Hensu2 = Year(Date)
 Hensu3 = Year(Date)

(結果)
 Hensu1 = 2009
 Hensu2 = 2009
 Hensu3 = 2009

 ・・・当たり前。
 これを配列を使うと…

  Dim Hensu(2) As Integer
  Dim HensuCnt as Byte

  For HensuCnt = 0 to 2
      Hensu(HensuCnt) = Year(Date)
  Next HensuCnt
 
 (結果)
 Hensu(0) = 2009
 Hensu(1) = 2009
 Hensu(2) = 2009

 ・・・の様にLoop等を使って値を格納できる。

 更に宣言時、
  Dim Hensu() As Integer

 の様に配列の数を指定せず、

 値を格納する直前に、
 ReDim Hensu(2) As Integer
 とする事も出来る。
 この2の所に変数を当てる事もできるので、
 色々と計算した結果、必要な変数の数が決まり、
 それを配列として保持したい時に便利。

  DeDim Preserve Hensu(2) As Integer
 と宣言すると再宣言前の変数の値が保持される。通常消去。でも遅いらしい。


 更に更に、
 UBound(Hensu())
 を使う事で使われている配列の最大値が取得できる。

  For HensuCnt = 0 To UBound(Hensu())
      ・・・
      ・・・
      ・・・
  Next

 とする事で配列を適当に宣言して、適当に値を格納し、
 それを適当に再取得できて便利。


-----------------------------------------------------------------

Erase
 配列の初期化ステートメント

(例)
Dim Hairetsu(99)

Erase Hairetsu
-----------------------------------------------------------------


オブジェクト
 ※プログラム独特の概念。日本語に訳すと「モノ」。
  VB6上のオブジェクトはコントロール(←他にもあると思うけどまずはこれ)。

(①通常)
Me.Text1.Text = "Test"


(②オブジェクト変数使用時)
Dim ObjText as Object    'オブジェクトを格納する変数

Set ObjText = Me.Text1   'オブジェクト変数にオブジェクトを格納
ObjText.Text = "Test"    '←普通に使える。


(③コントロール配列使用時)
Me.Text(0).Text = "Test"
Me.Text(1).Text = "Test"
Me.Text(2).Text = "Test"

 ↓

Dim ObjCnt As Byte

For ObjCnt = 0 To Me.Text.Count - 1    '←コントロール配列の最大値
    Me.Text(ObjCnt).Text = ""         '←一気に初期化
Next ObjCnt



(④オブジェクト変数&コントロール配列使用時)

Dim ObjText As Object

Set ObjText = Me.ActiveControl

ObjText.Text = "Text"    '←現在フォーカスを持つテキストボックスに値を表示する

-----------------------------------------------------------------


※注
コントロール配列…設計時に画面上で同種類のオブジェクトに同名を付け、
その代わりにインデックスプロパティに一意の数字を振る事により個々を識別する方法。
前述③の様にオブジェクトを配列として扱う事ができ、Loopで回したりできて便利。

しかしこれはVB6特有の機能ではあるものの考え方としてはプログラム全般では普通。
VB6ではテキストボックスを使う時に、ツールボックスから配置するが、
内部では一個一個、テキストボックスの名前は何で位置はどこで…の様にプロパティを持たせて宣言している。
コントロール配列の場合、NameプロパティとIndexプロパティがちょっと違うだけ。
内部での宣言時、通常コントロールは通常変数として宣言するが、
コントロール配列時のコントロールはそれを配列として宣言している。




-----------------------------------------------------------------


 ※注意:多分色々間違ってます!!

ADO
 ※SQLサーバー、Pervasive等、データベースを持つ場合に、
  VB6からSQL命令でDBを操作、
  更に様々な方法でデータを参照する方法を持つ、変数への格納・取得ツール。

  Microsoftが作って標準で使える様にしてくれている一種の関数。
  ListBoxに値を入れてその2番目の値を取得する…みたいな事ができる(ListBox参照)。
  それのコントロールという見た目を持たないバージョン。
  エー・ディー・オーと読む。そのままだけど。
  ActiveXDataBaseObject の略(のはず)。Microsoftが作ったデータベース式変数と訳。


通常、
変数 = 値
で値を格納し、それを使う時は、
Call MsgBox(変数)
の様に直接変数の中身を参照する。

ADOというツールを使うと、
特別な方法で値を格納し、それを使う時はまた特別な方法で使う。
上記の様にリストボックスでもその値を参照するには特別なメソッドがあるのでこれは当然。
以下、その特別な方法。

①設定
②宣言
③接続
④値の取得
⑤操作

の手順が必要。
標準の関数ではないので参照設定と使用宣言が必要。この辺りはMicrosoftの気分次第。
普通の標準の関数やコントロールはこういう事のほとんどの部分を自動でやってくれているはず。



設定
プロジェクト>参照設定 にて、
「Microsoft ActiveX Data Objects 2.5 Library (msado15.dll)」
にチェックを入れる。

※標準コントロールでないFlexGridコントロールを使う時なんかと同じ。
関数の記述元ファイルが標準のものとは別場所にあるのでそれを教えてあげる。


更に ODBCというADOの前バージョン的接続ツールの設定をする。
ADOにはADOの接続方法があるらしいけど知らないのでこれで。
無駄だし遅いし良い点はないと思うけど…。

スタートメニュー>プログラム>管理ツール>データソース(ODBC)を開く。
データベースソフト(SQLサーバーやPervasiveにおけるDB)のODBC設定を行う。



↓追加を押し…



SQLサーバーを選択、その後更にDB名を指定したりする。


これで DBソフト側でADOという技術を使われた時にデータを参照される様になる?
前述したが、本当はVB6のコード内でADOによる接続を行う。
接続するDBへのパスやパスワードなんかが書かれた文字列を引数として、後述の宣言時に使う。
この方法はそれの代わり。
アクセスやエクセルも選べる。色々奥が深そう。




宣言
Dim 接続用変数 As ADODB.Connection
Dim 格納用変数 As ADODB.Recordset

(例)
Dim Obj_AdoCN As ADODB.Connection
Dim Obj_AdoRS As ADODB.Recordset


※宣言の後、このオブジェクト変数に値を格納する。
コントロールのオブジェクト変数への格納:Set ObjText = Me.Text1 みたいなもの。
格納したらObjTextをText1の代わりに使える。

Set Obj_AdoCN = New ADODB.Connection    '←前述の接続文字を使った接続をする場合はここで何かするかも?
Set Obj_AdoRS = New ADODB.Recordset     '←前述の接続文字を使った接続をする場合はここで何かするかも?

※↑Newキーワードを使っているのはクラスの証拠(後述)
まあ、普通のコントロールよりややこしい参照の仕方をするというだけ。




接続

↓以下の構成のDBと接続する場合…。(DB名:master、テーブル名:AllEigtime)



①VBScriptの場合
Set 接続用オブジェクト変数 = ~
接続用オブジェクト変数.Open DB名    'DBと接続する。

(例)
Set adoConn = server.createobject("ADODB.Connection")    '←よく分かりません(スミマセン)
adoConn.Open "master"    'DBと接続する。


④データの格納

↓以下のテーブルを格納する場合



(1)SQL命令の作成
 SQLS = " Select * "
 SQLS = SQLS & " From AllEigTime " 


(2)データの格納
Set 格納用配列オブジェクト = ~
格納用配列オブジェクト.Open SQL文,

(例)
Set adoRset = server.createobject("ADODB.Recordset")    '←よく分かりません(スミマセン)
adoRset.Open SQLS, adoConn


⑤変数の操作
 ※VBScriptを参照

-----------------------------------------------------------------

[WSH(WindowsScriptHost)]
 ※Windows上で動作するスクリプト
  VBScirptかJavaScriptで記述する。
  バッチファイルより複雑な操作が可能。

・ファイル
 テキストファイルにVBScriptのソースコードを書き、拡張子を「.vbs」で保存する。
 後はWindows上でダブルクリック等で実行させるだけ。

・宣言

 'シェルを作成。
 Set objShell = WScript.CreateObject("WScript.Shell") 

 '↑シェルを使ってメモ帳を開く。
 Set objExec = objShell.Exec("notepad.exe test.txt")  

・待つ

 '起動処理が終わるまで
 Do Until objShell.AppActivate(objExec.ProcessID)   
  WScript.Sleep 1000  '1秒?                 
 Loop

・キー押下処理
 objShell.SendKeys "hello"   '「Hello」と入力したのと同じ動作をさせる
 objShell.SendKeys "{TAB}"   '[Tab]キーを押したのと同じ動作をさせる
 objShell.SendKeys " "     'スペースキーを押したのと同じ動作をさせる
キー SenKeysメソッドのパラメータ
+ {+}
^ {^}
% {%}
Shift +
Ctrl ^
Alt %
Enter {ENTER} または ~
{DOWN}
{LEFT}
{RIGHT}
{UP}
Back Space {BACKSPACE}、{BS}、または {BKSP}
Break {BREAK}
Caps Lock {CAPSLOCK}
Delete {DELETE} または {DEL}
End {END}
Esc {ESC}
Help {HELP}
Home {HOME}
Insert {INSERT} または {INS}
Num Lock {NUMLOCK}
Page Down {PGDN}
Page Up {PGUP}
Print Screen {PRTSC}
Scroll Lock {SCROLLLOCK}
Tab {TAB}
F1 {F1}
F2 (F3~F12も同様) {F2}


・メッセージボックス表示
 WScript.Echo "Hello"


***************************************************************
[VBScript]
 ※ASPにおける記述に限定(違いがあるのか知らないが…)。
***************************************************************

[基本]
・VBScriptの構文は初めと終わりを<% と %>で囲む。囲まない文字はHTMLと見なされる。
・<% Language=VBScript %>
 最初にVBScriptを使うと宣言する。


Response.Write
※HTML中にVBScriptの値を表示させる。
(例)Response.Write adoRset.Fields("フィールド名")

ReturnValue = IsNull(adoRset.Fields("フィールド名"))
※値があるか否か?を判断する。
ReturnValue = True (Or False)


[メソッド・ステートメント]

<a href=ジャンプ先ASPファイル名.asp?引数1=値1&引数2=値2%>リンク文章</a>
※HTML構文のリンクと組み合わせて。
 構文が間違っているというエラーが出るが…。


ジャンプ先


・ジャンプ
Response.Redirect "~"
※指定したURLにジャンプする。

(例)If adoRset.EOF Then Response.Redirect "s_error.asp?error1=005"
  ↑クエリーによって値を取得できなかった場合、
   エラーメッセージを表示するページにジャンプ。
   更にエラー番号によってエラーメッセージを変える。


ReturnValue = Request.QueryString("引数1")
※自ページを開くに当たり、引数を渡されている場合に引数を取得する。





以下、ADOを用いたDB操作方法。
ADOはVB共通のツールでVBS専用ではなく使い方も同じ(はず)
以下の使い方をする前提としてODBCにて接続情報を作っておく必要がある。

-----------------------------------------------------------------
[DB接続オブジェクト]
 ※Microsoftが最初から作ってくれているツール(PG、関数)
  標準では使えないが参照設定を行う事で使える。API的なもの。
  DBに接続する機能を持つ
-----------------------------------------------------------------

'DB接続オブジェクトの宣言
Set adoConn = Server.CreateObject("ADODB.Connection")

'DB接続
adoConn.Open "DB名" 





-----------------------------------------------------------------
[データセット]
 ※Microsoftが最初から作ってくれているツール(PG、関数)
  標準では使えないが参照設定を行う事で使える。API的なもの。
  データを丸ごと変数に格納する機能、それを操作する機能を持つ。
-----------------------------------------------------------------

'データセットオブジェクト
Set adoRset = Server.Createobject("ADODB.Recordset")

ReturnValue = adoRset.Fields("フィールド名")
※DBにおける指定したフィールドの値を参照する。

ReturnValue = adoRset.Fields(列数)
※DBにおける指定した列数のフィールドを参照する。0から数える。0が一番左。

adoRset.MoveNext   
※取得した変数群の参照を次のインデックスへ移動させる。

adoRset.MoveFirst  
※取得した変数群の参照を先頭へ移動させる。

adoRset.MoveLast  
※取得した変数群の参照を最後尾へ移動させる。

adoRset.MovePreve 
※取得した変数群の参照を前のインデックスへ移動させる。
 (Open時に何かの引数が必要)

adoRset.Count      
※取得した変数群のインデックス数





-----------------------------------------------------------------
[コマンドオブジェクト]
 ※Microsoftが最初から作ってくれているツール(PG、関数)
  標準では使えないが参照設定を行う事で使える。API的なもの。
  ストアドを実行する機能を持つ。他にもある?
-----------------------------------------------------------------

'ストアド実行オブジェクト
Set cmdProc = Server.CreateObject("ADODB.Command")


'行き先コードの取得ストアドの実行
With cmdProc
    .Commandtext = "GetIkiCd"                 'ストアドプロシージャ名
    .CommandType = 4                          '(ユーザー定義型を示す定数)

    .ActiveConnection = adoConn
    .Parameters.Append.CreateParameter( _
        "@変数名", 型, INかOUTか?の定数, 長さ, ストアドへ渡す引数)

    (例)
    .Parameters.Append.CreateParameter("@prmEigCd", 16, 1, 1, intEigCd)
    '引数が2個ある場合。以後続ける。
    .Parameters.Append.CreateParameter("@prmProjCd", 16, 1, 1, intProjCd)

    Set adoRset = .Execute '↑ストアドを実行してデータセットに格納

End with

'別のストアドを実行する場合
Set cmdProc = Nothing
Set cmdProc = Server.CreateObject("ADODB.Command")
パラメータは追加していく事しかできないので一回全てクリアする。
クリアする命令もあるはずだけど取りあえずこれ。


定数
ASP内では使えない。
定数の記述ファイルをどこかからダウンロードしてきて参照設定したら使える。
OSのバージョンによって最初から記述ファイルがある?

'adCmdStoredProc = 4    'ユーザー定義型を示す定数
'adParamInput = 1       'INかOUTか?の定数
'adParamOutput = 2      'INかOUTか?の定数


定数  
EMPTY 0
SMALLINT 2
INTEGER 3
SINGLE 4
DOUBLE 5
CURRENCY 6
DATE 7
BOOLEAN 11
VARIANT 12
DECIMAL 14
TINYINT 16
BIGINT 20
CHAR 129
NUMERIC 131
VARCHAR 200


-----------------------------------------------------------------

固定値(Const)
 ※プログラム全体で使う値が格納された変数。
  プログラムが開始されてから変数に値を格納するのではなく、開始前にする。
  標準モジュールの一番上の一番目立つ場所や、共通ファイルに書いておく。

  これをやっておくとその値を変更する必要が生じた場合に一か所を修正するだけで済む。

(例)Private Const FontColor = vbBlack

  帳票の文字色に関してお客さんの要求が当初、黒だったが後になって青になった時。
  固定値を使っていないと、プログラム全体から色を指定している処理を探し出して修正する必要がある。
  探し残しがあるとバグ。それを未然に防いでくれて便利。


-----------------------------------------------------------------

ByVal
 ※関数に渡した引数を、渡し先の関数内でどう処理されても戻ってきた際に変化させない

(例)引数 = 1
  Call 関数(引数)
  Debug.Print 引数

Private Sub 関数(ByVal 引数 As Integer)
    引数 = 0
End Sub

結果:1

-----------------------------------------------------------------

ByRef
 ※関数に渡した引数を、渡し先の関数内でどう処理された様に変化させる

(例)引数 = 1
  Call 関数(引数)
  Debug.Print 引数

Private Sub 関数(ByRef 引数 As Integer)
    引数 = 0
End Sub

結果:0

-----------------------------------------------------------------

Optional
 ※ByRef時限定。引数なしを許容する。

(例)引数1 = 1
  引数2 = 1

  Call 関数(引数1)    '←第2引数を指定しない

  Debug.Print 引数1 & "_" & 引数1

Private Sub 関数(ByVal 引数1 As Integer, _
        Optional ByRef 引数2 As Integer)

    引数1 = 0
    引数2 = 0  
End Sub

結果:1_1

(補足)
Private Sub 関数(ByVal 引数1 As Integer, _
        Optional ByRef 引数2 As Integer = 5)   

'↑Optional限定。引数が指定されなかった時の初期値を設定する事もできる

    引数1 = 0
    引数2 = 0  
End Sub


-----------------------------------------------------------------

Option Explicit
 ※モジュール内で変数の型宣言を強制させる

-----------------------------------------------------------------

DefInt
 ※変数の型を強制的にIntegerにする?

(例)DefInt A-Z
A~Zを先頭として始まる変数の型をIntegerにする?
その後Stringで宣言したらどうなるのか…
-----------------------------------------------------------------

VbModal
  ※フォームをLoadする時の引数。

①モーダル vbModal
 画面を消去するまで、他画面の操作は出来ない。

(例)Load(Form2 , VbModal)    '←Form2をUnLoadするとこの次の行に処理が戻る
  

②モードレス vbModeless
 画面を消去したままで、他画面の操作を行うことができる。


-----------------------------------------------------------------

QBColor()

()内に、0~15の範囲の整数を指定。

番号   色
------------------------------
 0    黒
 1    青
 2    緑
 3    シアン
 4    赤
 5    マゼンタ
 6    黄
 7    白
 8    灰色
 9    明るい青
 10    明るい緑
 11    明るいシアン
 12    明るい赤
 13    明るいマゼンタ
 14    明るい黄
 15    明るい白

-----------------------------------------------------------------

Dir()関数
  ※ファイル、フォルダの存在を確認する

(公式1) ReturnValue = Dir(パス¥ファイル名)
      ReturnValue = ファイル名 '←ファイルがある場合。ない場合=Null

(例) ReturnValue = Dir(D:\Test\Test.txt)
     ReturnValue = "Test.txt"

(公式2) ReturnValue = Dir(パス¥フォルダ名 , vbDirectory)
      ReturnValue = フォルダ名 '←フォルダがある場合。ない場合=Null

(例) ReturnValue = Dir(D:\Test , vbDirectory)
   ReturnValue = "Test"

-----------------------------------------------------------------

Name
 ※ファイル名変更

 (公式)Name 変更元 AS 変更先

 (例)
 Name "C:\WORK\TEST.TXT" AS "C:\WORK\SAMPLE.TXT"
 Name "C:\WORK\TEST.TXT" AS "C:\WORK\SAMPLE\TEST.TXT"
 Name "C:\WORK\" AS "C:\SAMPLE\"
 Name "C:\WORK" AS ""C:\SAMPLE"

-----------------------------------------------------------------

FileCopy
 ※ファイル複写

 (公式)FileCopy 複写元, 複写先

 (例)
 FileCopy "C:\WORK\TEST.TXT" , "C:\WORK\SAMPLE.TXT"
 ↑TEST.TXTを複写して、SAMPLE.TXTとして新規作成。

-----------------------------------------------------------------

切り捨て
 ※Int()関数を使用。勝手に切り捨てされる。

 ReturnValue = Int(1.1)
 ReturnValue = 1

-----------------------------------------------------------------

切り上げ
 ※-Int(-対象)で実現。

 ReturnValue = -Int(-1.1)
 ReturnValue = 2

-----------------------------------------------------------------

偶数
 ※ 値/2 = INT(値/2) の時

 ↑値/2が少数点の時、勝手に切り捨てされる。切り捨て参照。

-----------------------------------------------------------------

奇数
 ※ 値/2 <> INT(値/2) の時

-----------------------------------------------------------------

・ExcelCreater
 ※アドバンスソフトウェアという会社のソフトで、エクセルオブジェクトを立ち上げずにエクセルを操作できる。

  メリットとしてはひたすら早く軽くなる。雲泥の差。1/100くらいのスピード。
  デメリットとしては…
  ①操作が面倒
  ②印刷が面倒(←ここだけ通常方法にするのが理想。
         でもエクセルを持ってるお客さんじゃないとダメ。普通持ってると思うけど)


①操作準備(参照)
②オブジェクト作成
③オブジェクト操作
④オブジェクト消去

大きな流れはこう。これはVB6というかプログラム共通。



①操作準備(参照)
 (1)API関数をコード中から宣言、参照する方法と、
 (2)ActiveXコントロールをフォーム上に配置し、そのオブジェクトを使う方法がある。 


②オブジェクト作成
 ↑(1)か(2)で作成したExcelCreaterによるオブジェクト(例:ObjXls)のメソッドを使う。
 作成元既存ファイルをコピーして新しいファイルを作る。
 元は変化しないので安心。

 Form1.objXls.OpenBook 作成先新規ファイル, 作成元既存ファイル, ?

 (例)Form1.objXls.OpenBook NewFilePath, OldFilePath, vbNull


③オブジェクト操作

 エクセルのセル位置を座標で指定して出力。
 ObjXls.Pos(X,Y).Value = ~     

 エクセルのセルに直接"**Pos"と書いておくとそこに出力。
 ObjXls.Cell("**Pos").Value = ~
 
 エクセルのセル"A1"からX,Yの位置を操作
 ObjXls.Cell("A1",X,Y).Value = ~

 計算式を設定
 ObjXls.objXls.Cell("A1").Func = "=sum("A1")"

 1行目を2行目にコピー
 ObjXls.objXls.RowCopy 1, 2      

 1 行目をメモリ上にコピー
 ObjXls.objXls.RowCopy 1         

 コピーされた行を 21 行目に貼り付け
 ObjXls.objXls.RowPaste 2        

 行の値削除(書式も何もかも)
 ObjXls.objXls.RowClear 1        

 罫線を引く("A1"のセルの上や下にラインを引く場合は 0,0)
 ObjXls.Cell("A1", Y, X).LineTop = lsNormal       
 ObjXls.Cell("A1", Y, X).LineBottom = lsNormal    
 ObjXls.Cell("A1", Y, X).LineLeft = lsNormal
 ObjXls.Cell("A1", Y, X).LineRight = lsNormal
 ※何故かこの関数だけYとXの引数の位置が逆?

 フッターを設定するシート番号を設定&フッター設定
 ObjXls.SheetNo = 0
 ObjXls.Footer "&""MS P明朝""&16ExcelCreator新機能一覧フッター", "&A", "&D"


 ヘッダーを設定するシート番号を設定&ヘッダー設定
 ObjXls.SheetNo = 0

 ObjXls.Header "&""MS P明朝""&16ExcelCreator新機能一覧フッター", "&A", "&D"


④オブジェクト消去
 Form1.objXls.CloseBook (True)

-----------------------------------------------------------------

構造体(Type)

 ※グループ分けされた変数

(宣言時)
 Type Type_Group
        Hensu1 As Integer
        Hensu2 as Boolean
        Hensu3 as String
        Hensu4 as String
    End Type
 Private Group as Type_Group

(使用時)
 Group.Hensu1 = 1                '←変数の頭にグループ名が付く。
    Group.Hensu3 = "VBMemo"

-----------------------------------------------------------------

列挙体(Enum)
 ※構造体のCONST版


(宣言時)
 Private Enum Enum_Group
        Hensu1 = 1                   
        Hensu2 = 2
        Hensu3 = "VBMemo"
    End Enum

(使用時)
 Text1.Text = Enum_Group.Hensu3

-----------------------------------------------------------------

Static
 
※プロシージャ内で宣言。そのプロシージャから処理が抜けても値がクリアされない

(例)
Private Sub Test()
 Static
Hensu As Integer    'Dimの代わり
 
 If Hensu = 0 then          '始めてこのプロシージャが呼び出された時(Hensu=0)。この時値は1000になり、
                             '次に呼び出された時も1000のまま。
    Hensu = 1000             'この行は2回目にこのプロシージャが呼び出された時には実行されない。
 End If

End Sub

-----------------------------------------------------------------

[Excel]

参照設定

「 Microsoft Excel 11.0 Object Library 」
等のエクセルDLL。古いのを入れる方が失敗がない。


Excel操作の為の変数を宣言
Dim xlApp   As Excel.Application
Dim xlBook    As Excel.Workbook
Dim xlSheet   As Excel.Worksheet


オブジェクト変数に中身を入れる
Set xlApp = CreateObject("Excel.Application")

(1)既存のエクセルファイルを開く場合
Set xlBook = xlApp.Workbooks.Open("パス")
(2)新規に開く場合
Set xlBook = xlApp.Workbooks.Add

操作するシート
Set xlSheet = xlBook.Worksheets(1)

コーディング中にエクセルを見ながら作業する場合
xlApp.Visible = True
xlSheet.Activate


印刷範囲設定
①xlApp.Windows("~.xls").View = xlPageBreakPreview    '←改ページプレビューモードへ切り替え
②xlSheet.HPageBreaks.Add Before:=.Rows(10)          '水平方向の改ページラインを追加
③xlSheet.VPageBreaks.Add Before:=.Rows(10)          '垂直方向の改ページラインを追加
④xlApp.Windows("~.xls").View = xlNormalView         '←標準表示モードへ切り替え


※①xlApp.Windows("~.xls").View = ~
  Windowsの機能として表示しているウィンドウを指定しているらしい。
  これでないとうまく行かない。VBAは謎が一杯。 


※②xlSheet.HPageBreaks.Add Before:=.Rows(10)
  10行目の上に改行ラインを引く


コピー
xlSheet.Rows(10:15).
Copy        '10~15行目をコピー

貼り付け
xlSheet.Rows(20).Select         '↑コピー内容を20行目から下へ貼り付け
xlSheet.
Paste

何かをコピーしている事を示すエクセル上のセル選択状態を解除
Application.
CutCopyMode = False

値だけを削除
xlSheet.Rows(10:15).
ClearContents

表示
xlSheet.Cells(1,1) = "文字" '←文字出力

印刷
XlBook.PrintOut '印刷


処理が終わったら…
Set xlApp = Nothing
Set xlBook = Nothing
Set xlSheet = Nothing

-----------------------------------------------------------------

[VBA]

  Workbooks.Open ("C:\Time.csv")                     '開く
  Set ObjTime = ActiveWorkbook.Worksheets(1)

  Set ObjTime = Nothing
  Application.DisplayAlerts = False                   '保存時のメッセージをOFFに
 ActiveWorkbook.Close SaveChanges:=True              '保存して閉じる


 With Cells(1,1)

  .Borders(xlEdgeTop).LineStyle = xlContinuous   '上部に線を引く
  .Borders(xlEdgeBottom).LineStyle = xlContinuous  '下部に線を引く
  .Borders(xlEdgeLeft).LineStyle = xlContinuous   '左部に線を引く
  .Borders(xlEdgeRight).LineStyle = xlContinuous  '右部に線を引く
  .Borders.LineStyle = xlContinuous         '格子状に線を引く

   
(例) Range(Cells(2,2),Cells(4,4)).Borders.LineStyle = xlContinuous
  

   
.Borders.Weight = xlMedium            '周りの線を太線に
 
    .Range(Cells(2,2),Cells(7,2)).Merge               'セルを結合する
    ReturnValue = .Cells(2,2).MergeCells              '結合しているか否か?のプロパティ
    ReturnValue = True


  

  Cells(3,2).Select                                '選択状態に
    ReturnValue = Sellection.Row                     '選択状態のセルの情報を取得
    ReturnValue = 2                                   (結合されている場合最上位行)
   
    ReturnValue = Cells(Sellection.Row,2)       '↑の法則を利用して結合セルの内容を取得
    ReturnValue = "Header"

  ReturnValue = Cells(2, 2).End(xlDown).Row    '表の端のセルを参照する()
    ReturnValue = 7

    .NumberFormatLocal = "[h]:mm"                    '書式設定(9:00)
    .NumberFormatLocal = "hh:mm"                     '09:00
    .NumberFormatLocal = "@"                         '文字列
    .VerticalAlignment = xlVAlignCenter              'センター表示
    .HorizontalAlignment = xlHAlignCenter            'センター表示
    .WrapText = True                         '折り返して全体を表示する
    .Orientation = 0                        '方向の角度
    .AddIndent = True                        '前後にスペースを入れる
    .IndentLevel = 0                        'インデントの数値
    .ShrinkToFit = True                       '縮小して全体を表示する
    .ReadingOrder = xlContext                    '文字の方向

    ReturnValue = ActiveWorkbook.Sheets.Count        'シート数(1枚の時は1。0という事はない)
    ReturnValue = 1

    ReturnValue = ActiveWorkbook.Worksheets(1).Name  'シート名
    ReturnValue = "Sheet1"

    ActiveSheets.Copy After:=Worksheets(1)           'シートコピー
    ActiveSheets.Copy Before:=Worksheets(1)

    ReturnValue = .Cells(2, 2).Address               '通常方式のセル位置の文字列を取得
    ReturnValue = "$B$2"                             '(≠R1C1参照形式)

    .Rows(1:1).Copy                                 '行のコピー
    .Rows(1:1).Cut                                  '行の切り取り
    .Columns("A:D").Copy                             '列のコピー
    .Rows(2:2).Insert                                '↑内容の貼り付け

    .Columns("A:D").ColumnWidth = 20                 '列幅
    .Rows("2:2").RowHeight = 20                     '行高

    ReturnValue = .End(xlDown).Row                   '文字が入力されているセルの終端行取得
    ReturnValue = .End(xlToRight).Column             'xlUp,xlDown,xlToLeft,xlToRight

    '検索
    Range("A1:B5000").AdvancedFilter
            Action:=xlFilterCopy, _
            CriteriaRange:=Range("F1:F2"), _         'CriteriaRange … 検索条件
            CopyToRange:=Range("F4"), _              'CopyToRange … 検索結果出力先
            Unique:=False

    'Cells(1, 1)、Cells(1, 2)順に並び変え
    Range("A1:E5").Sort key1:=Cells(1, 1), _         'キー
                        order1:=xlAscending, _       '昇順
                        key2:=Cells(1, 2), _
                        order2:=xlAscending

    'フィルタリング
    Range("A1:D500").AutoFilter
            Field:=2, _                              'フィルタリング対象列番号
            Criteria1:=Array("1","2","3"), _         'Variant型の配列(↓参照)
            Operator:=xlFilterValues

        ※Dim Test(2) As Integer
          Test(0) = 1 : Test(1) = 2 : Test(2) = 3
     の時、Array("1","2","3") = Test


    '■オートシェイプで矢印を引く



    '↑黄色セルの絶対位置を取得。↑にオートシェイプを配置する。
    SX = Obj.Cells(2, 2).Left
    SY = Obj.Cells(2, 2).Top + Obj.Cells(2, 2).Height / 2
    EX = Obj.Cells(2, 5).Left
    EY = Obj.Cells(2, 5).Top + Cells(2, 5).Height / 2

    Set MyLine = Obj.Shapes.AddLine(SX, SY, EX, EY)  '描画


    '点線の矢印
    Obj.Shapes.Range(MyLine.Name).Line.EndArrowheadStyle = msoArrowheadTriangle    '矢印に
    Obj.Shapes.Range(MyLine.Name).Line.Weight = 0.75                               '細さ
    Obj.Shapes.Range(MyLine.Name).Line.DashStyle = msoLineDash                     '点線に




 End With

-----------------------------------------------------------------

INIファイル
 ※テキストファイルの一種。
  API関数である、
  ①GetPrivateProfileString()関数を使うことで、
   高速に必要な内容だけを読み込む事ができ、
  ②WritePrivateProfileString()関数を使うことで、
   高速に必要な内容だけを書き換える事ができる。

  XMLの普及であまり使われなくなってるのか? それとも現役か?

使用例

[読込先パス]                ←大項目。[]で囲む
データ=C:\DAT            ←小項目。続いて = で値を設定する。
マスタ=C:\MST         ※上記、必要な内容に当たる。

[出力先パス]                ←大項目。[]で囲む
Excel=C:\EXCEL帳票     ←小項目。続いて = で値を設定する。
Coリポーツ=C:\その他帳票  ※上記、必要な内容に当たる。


という様にメモ帳に書き、拡張子をiniにして保存。

-----------------------------------------------------------------

OnErrorResumeNext
 ※エラーが発生したらその行の処理を行わず、次の行に移る。


(例)
Private Sub Test()

On Error Resume Next       ←エラー検知開始。

    Dim intNumber As Integer
 
    intNumber = "あいうえお" ←ここでエラーが発生する。通常落ちる。
                intNumberは初期値:""のまま。
 

End Sub                    ←ここまで来れる。

-----------------------------------------------------------------

OnErrorGoTo~
 ※エラーが発生した際に指定の行へジャンプする。

(例)
Private Sub Test()

On Error GoTo ERROR_TRAP      ←エラー検知開始。

    Dim intNumber As Integer
 
    intNumber = "あいうえお"    ←ここでエラーが発生する。通常落ちる。 

    Exit Function             ←エラーが発生しなかった時の終了処理。

ERROR_TRAP:                   ←エラーが発生するとこの行に来る。
    Call MsgBox("エラー発生!!")
End Sub

-----------------------------------------------------------------

Err
 ※エラー発生時、自動でErr.Numberにエラーの番号を取得する。
  .Numberは省略可能。

On Error Resume Next

エラー発生!!

If Err.Number <> 0 Then Call MsgBox("エラー発生!")
If Err <> 0 Then Call MsgBox("エラー発生!")        ←これも同じ意味。
If Err Then Call MsgBox("エラー発生!")             ←これも同じ意味。

-----------------------------------------------------------------

Error()関数
 ※Err.Numberの値に対応するエラー名を取得する。

(例)

エラー発生!!

Call MsgBox(Error(13))
Call MsgBox(Error(Err.Number))

-----------------------------------------------------------------

掲示板