Warning: session_start(): open(/home/var/php/b/q/sess_bqpebner4aqlhnqp46g44ipdk1, O_RDWR) failed: No such file or directory (2) in /home/users/web07/2/1/0219112/phyokin/devlog/controllers/controller.php on line 15

Warning: session_start(): Failed to read session data: files (path: 2;/home/var/php) in /home/users/web07/2/1/0219112/phyokin/devlog/controllers/controller.php on line 15
devlog
MW211 EXIT

devlog
ExcelVBA/区切文字で区切って値を取得する方法
2014年10月04日
例えば「前:後」の「前」のみを抽出する方法。
┌──────────────────────────────────────┐
│If InStr(値, ":") > 0 Then                                                  │
│    取得値 = Left(値, InStr(値, ":") - 1)                                   │
│Else                                                                        │
│    取得値 = 値                                                             │
│End If                                                                      │
└──────────────────────────────────────┘

これを配列にしてから抽出する方法に切り替えると以下の通り。
┌──────────────────────────────────────┐
│Dim 配列 As Variant                                                         │
│配列 = Split(値, ":")                                                      │
│If UBound(配列) > 0 Then                                                    │
│    取得値 = 配列(0)                                                        │
│Else                                                                        │
│    取得値 = 値                                                             │
│End If                                                                      │
└──────────────────────────────────────┘
「UBound(配列) > 0」の条件式は不要だが(*1)、
二番目以降で応用したい場合向けに記載してある(一番目なら本当に不要)
*1:区切文字の該当がない場合は、一つの配列に全て格納される
    よって、この場合「UBound(配列)」は「0」になり、
    「配列(0)」にもアクセスできる(エラーにはならない)
分類:ExcelVBA
ExcelVBA/文字列数値変換
2014年10月02日
基本的には「Val()」。変換できない文字列については「0」になってくれる。
┌──────────────────────────────────────┐
│数値 = Val(文字列)                                                          │
└──────────────────────────────────────┘

型変換を行うには以下の通り。
┌─────┬─────────┐
│Byte型    │数値 = CByte(数値)│
├─────┼─────────┤
│Integer型 │数値 = CInt(数値) │
├─────┼─────────┤
│Long型    │数値 = CLng(数値) │
├─────┼─────────┤
│Single型  │数値 = CSng(数値) │
├─────┼─────────┤
│Double型  │数値 = CDbl(数値) │
├─────┼─────────┤
│Currency型│数値 = CCur(数値) │
├─────┼─────────┤
│Decimal型 │数値 = CDec(数値) │
└─────┴─────────┘
但し、文字列などを変換しようとするとエラーとなってしまう。
よって、「IsNumeric()」で一旦判定する必要がある。
┌──────────────────────────────────────┐
│If IsNumeric(変換前) = True Then                                            │
│    変換後 = CInt(変換前)                                                   │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/「PERSONAL.XLS」のパス
2014年10月01日
イミディエイトウインドウで以下を入力すると
「PERSONAL.XLS」「PERSONAL.XLSB」のパスが確認できる
┌──────────────────────────────────────┐
│? Application.Workbooks("PERSONAL.XLS").Path                                │
├──────────────────────────────────────┤
│? Application.Workbooks("PERSONAL.XLSB").Path                               │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/引数の参照渡しと値渡し
2014年09月30日
なんと、VBAでは「参照渡し」がデフォルトなのだ。要注意。

【参照渡し(アドレス渡し)】(既定)
┌──────────────────────────────────────┐
│Sub 関数(引数)                                                              │
│    処理                                                                    │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub 関数(ByRef 引数)                                                        │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
→指定した引数が、関数内の処理により影響を受ける。(速度が速い)

【値渡し】
┌──────────────────────────────────────┐
│Sub 関数(ByVal 引数)                                                        │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
→指定した引数が、関数内の処理により影響を受けない。

ちなみに、以下のように実験してみたところ、結果は「参照渡し」が出力された。
つまり、既定(指定なし)は、参照渡しということが確認できる。
┌──────────────────────────────────────┐
│Sub 実験()                                                                  │
│    Dim 変数 As String                                                      │
│    変数 = "値渡し"                                                         │
│    Call サブ関数(変数)                                                     │
│    MsgBox 変数                                                             │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub サブ関数(変数 As String)                                                │
│    変数 = "参照渡し"                                                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/With句で自身を表すメタ文字はない?
2014年09月29日
┌──────────────────────────────────────┐
│Me.StartUpPosition = 2                                                      │
│Unload Me                                                                   │
└──────────────────────────────────────┘
例えば上記のような場合、下位のようにWith句でまとめたとする。
┌──────────────────────────────────────┐
│With Me                                                                     │
│    .StartUpPosition = 2                                                    │
│    Unload Me                                                               │
│End With                                                                    │
└──────────────────────────────────────┘
ただこれだと、まだ「Unload Me」の「Me」とWith句の「Me」が
かぶっているのでもう少し整理したい気がする(このままでも動くが)。
で、パス指定における「Unload .」的な感じにできないか?と思うのだが
そのようなものはないようだ。
ま、無理やりWith句にまとめんなという話だわな。
分類:ExcelVBA
ExcelVBA/フォームの表示位置指定
2014年09月28日
「UserForm_Initialize()」にて、フォームの初期表示位置を以下のように設定する。
┌───────────┬──────────────────────────┐
│Me.StartUpPosition = 0│任意                                                │
│       Me.Top  = Y座標│                                                    │
│       Me.Left = X座標│                                                    │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 1│フォームが属する項目の中央                          │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 2│画面全体の中央                                      │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 3│画面全体の左上                                      │
└───────────┴──────────────────────────┘

任意指定の場合、座標は以下のような感じで指定する。
┌──┬───────────────────────────────────┐
│縦上│Me.Top = Application.Top                                              │
│縦中│Me.Top = Application.Top + ((Application.Height - Me.Height) / 2)     │
│縦下│Me.Top = Application.Top - Application.Height - Me.Height             │
├──┼───────────────────────────────────┤
│横左│Me.Left = Application.Left                                            │
│横中│Me.Left = Application.Left + ((Application.Width - Me.Width) / 2)     │
│横右│Me.Left = Application.Left + Application.Width - Me.Width             │
└──┴───────────────────────────────────┘
もちろんダイレクトに座標を数値で代入しても可。
分類:ExcelVBA
ExcelVBA/シートの表示位置指定
2014年09月27日
左上に表示したいセルを以下のように指定する。
┌──────────────────────────────────────┐
│ActiveWindow.ScrollRow = セルのY座標                                        │
│ActiveWindow.ScrollColumn = セルのX座標                                     │
└──────────────────────────────────────┘

例えば、セルB2を左上に表示する場合には、以下のようになる。
┌──────────────────────────────────────┐
│ActiveWindow.ScrollRow = 2                                                  │
│ActiveWindow.ScrollColumn = 3                                               │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/RangeとCells
2014年09月25日
Range()とCells()の組み合わせで、シート指定が絡んできた場合についてまとめた

【実験内容】
  「Sheet1」にてマクロを実行し「Sheet2」に値を出力できるか試してみる
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
○Range()もCells()も同じシートを指している場合                →「Sheet2」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    .Range(.Cells(1, 1), .Cells(2, 2)).Value = "値"                         │
│End With                                                                    │
└──────────────────────────────────────┘
アクティブシートが「Sheet2」だったら、オーソドックスな
「Range(Cells(1, 1), Cells(2, 2)).Value = "値"」と同じことになる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
△Range()もCells()もシートの指定をしない場合                  →「Sheet1」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    Range(Cells(1, 1), Cells(2, 2)).Value = "値"                            │
│End With                                                                    │
└──────────────────────────────────────┘
アクティブシートが「Sheet1」だから、上記同様「Sheet1」に出力される。
With句は意味をなさないことになる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
○Cells()だけでもちゃんとシートを指定してる場合               →「Sheet2」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    Range(.Cells(1, 1), .Cells(2, 2)).Value = "値"                          │
│End With                                                                    │
└──────────────────────────────────────┘
Range()は「Sheet1」(アクティブシート)傘下なのに、
問題なく「Sheet2」に出力される。
よって、Range()は関数的な扱いとしてシートの指定は省略できるといえそう。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
×Range()とCells()でシート指定に相違がある場合                          →エラー
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    .Range(Cells(1, 1), Cells(2, 2)).Value = "値"                           │
│End With                                                                    │
└──────────────────────────────────────┘
Range()は「Sheet2」を指定しているのに、
Cells()は指定なしでアクティブシート(「Sheet1」)指定となるので
両者に相違が発生しエラーとなる。
ちなみに「Sheet2」をアクティブシートにしておくと
両者は一致するので「Sheet2」に出力される。

相違があるという点では一つ前のパターンと同じなのだがこちらはダメなのだ。
┌──────────────┬───┬───┐
│                            │Sheet1│Sheet2│
├──────────────┼───┼───┤
│Worksheets("Sheet1").Range()│      │      │
│Worksheets("Sheet2").Cells()│  ×  │  ○  │
└──────────────┴───┴───┘
分類:ExcelVBA
ExcelVBA/ソースコード出力
2014年09月23日
ExcelVBAのソースコードを一括してエクスポートしたい場合には
以下のようなマクロを使えばよい
#個人用マクロブック(PERSONAL.XLS)に登録しておけばいつでも使える
┌──────────────────────────────────────┐
│Sub ExcelVBAソースコード出力()                                              │
│    Dim VBC As Variant                                                      │
│    For Each VBC In ActiveWorkbook.VBProject.VBComponents                   │
│        If VBC.CodeModule.CountOfLines > 0 Then                             │
│            Select Case VBC.Type                                            │
│                Case 1      ' 標準モジュール                                │
│                    VBC.Export ActiveWorkbook.Path & "\" & VBC.Name & ".bas"│
│                Case 2      ' クラスモジュール                              │
│                    VBC.Export ActiveWorkbook.Path & "\" & VBC.Name & ".cls"│
│                Case 3      ' フォーム                                      │
│                    VBC.Export ActiveWorkbook.Path & "\" & VBC.Name & ".frm"│
│                Case 100    ' ドキュメント(ブック・シート)                  │
│                    VBC.Export ActiveWorkbook.Path & "\" & VBC.Name & ".cls"│
│            End Select                                                      │
│        End If                                                              │
│    Next VBC                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘

ちなみに「.CodeModule.CountOfLines > 0」で、
ソースコードのあるファイルに限定して出力している。
これがないとマクロのない通常のシートもファイルとして出力されてしまう。

ちなみに、以下のようにすると処理があるファイルのみ(宣言のみのファイルを除く)に
限定することもできる。
「.CodeModule.CountOfDeclarationLines <> .CodeModule.CountOfLines」
「.CountOfLines」がソース全行数、「.CountOfDeclarationLines」が宣言行数を
それぞれ取得できるからだ。(両者が一致するということは宣言のみということになる)
分類:ExcelVBA
ExcelVBA/マクロメニューに表示させない方法
2014年09月21日
関数をPrivate関数とする。
┌──────────────────────────────────────┐
│Private Sub 関数()                                                          │
│  …                                                                        │
│End Sub                                                                     │
└──────────────────────────────────────┘

他もモジュールでも使っているのでPublic関数じゃなきゃダメな場合には
そのモジュール自体をPrivateモジュールにしてしまう。
┌──────────────────────────────────────┐
│Option Private Module                                                       │
│Public Sub 関数()                                                           │
│  …                                                                        │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 次へ