Translate

2011年6月29日水曜日

ExcelVBAかなりざっくりしためも

モジュール、ブック、シートをを全て表示する
Sub SampleCode1() '
    Dim VBComponent As Variant
    For Each VBComponent In ThisWorkbook.VBProject.VBComponents
        Debug.Print VBComponent.CodeModule
        Debug.Print VBComponent.Type
    Next
End Sub
type
1→標準モジュール
2→クラスモジュール
3→フォーム
100→Documentモジュール

'Module1内のプロシージャ名を列挙する
Sub SampleCode2()
    Dim TempProcName As String
    Dim ProcNames As String
    Dim i As Long
    
    With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        For i = 1 To .CountOfLines
            If TempProcName <> .ProcOfLine(i, 0) Then
                TempProcName = .ProcOfLine(i, 0)
                Debug.Print TempProcName
            End If
        Next i
    End With
End Sub

2011年6月25日土曜日

vbscriptメモ

■CUIから実行
cscript ファイル名.vbs で実行

オプション :
//B バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
//D アクティブ デバッグを使用可能にする
//E:engine スクリプト実行時にエンジンを使用する
//H:CScript 既定のスクリプト ホストを CScript.exe に変更する
//H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
//I 対話モード (既定値、//B と逆の動作)
//Job:xxxx WSF ジョブを実行する
//Logo ロゴを表示する (既定値)
//Nologo ロゴを表示しない : 実行時に見出しを表示しない
//S このユーザーの現在のコマンド ライン オプションを保存する
//T:nn 秒単位のタイムアウト時間 : スクリプトを実行できる時間の最大値
//X デバッガでスクリプトを実行する
//U コンソールからリダイレクトされた I/O に Unicode を使用する

例えば、実行時にロゴ↓を表示したくなければ・・・
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

cscript ファイル名.vbs //Nologo とすればよい


■算術演算子
msgbox 7 + 5 '12
msgbox 7 - 5 '2
msgbox 7 * 5 '35
msgbox 7 / 5 '1.4
msgbox 7 \ 5 '1(商)
msgbox 7 Mod 5 '2(余り)
msgbox 7 ^ 5 '16807

■制御文
'If文
If 条件1 THen 処理1

If 条件2 Then
    処理2
ElseIf 条件3 Then
    処理3
ELse
    処理4
End If

'Select Case文
Select Case 値
    Case 値1
        処理1

    Case 値2, 値3
        処理2

    Case 値4, 値5, 値6
        処理3
 
    Case Else
        処理4
End Select

'For文
For 変数 = 初期値 To 最終値 [Step 変化量]
    処理
Next

'For Each文
For Each 変数 In コレクションor配列
    処理
Next

'While文
While 条件
    処理(条件がTrueの間ループする)
Wend

'Do Loop文
Do While 条件
    処理(条件がTrueの間ループ)
Loop


Do
    処理(条件がTrueの間ループ)
Loop While 条件


Do Until
    処理(条件がFasleの間ループ)
Loop

Do
    処理(条件がFalseの間ループ)
Loop Until 条件


■エラー処理
'On Error Resume Next から OnError GoTo 0の間は
'エラーを無視する
On Error Resume Next
    エラーの起きそうな処理

    msgbox Err.Number      'エラーの番号 エラーがない時は0
    msgbox Err.Description 'エラーの説明
    Err.Clear 'エラーの初期化 連続してエラーがおきそうな場合はその都度判定し、クリアする

On Error GoTo 0

■文字列操作
・Replace関数
変数 = Replace(引数1、引数2、引数3[、引数4、引数5、引数6]

引数1…置換を実施する文字列を指定
引数2…引数1から探し出す文字列
引数3…引数2と置き換える文字列
引数4…検索開始位置(1以上の整数)
引数5…置換を実施する回数。-1or指定しないは全て置換
引数6…文字列比較モード vbBinaryCompare or vbTextCompare

引数6を指定→引数4,引数5も指定
引数5を指定→引数4も指定


■Timerで100分の1以下を取得する
Timerで表示されるのは0時から現在までの秒を100分の1秒まで返してくれる。
例)85547.14

それ以下の値が欲しい場合は整数部を取り除くと取り出すことができる。
Dim CurrentTime : CurrentTime  = Timer '86274.84
Dim IntegralPart: IntegralPart = Fix(CurrentTime) '86274
Dim FractionPart: FractionPart = CurrentTime - IntegralPart '0.84375

msgbox FractionPart

2011年5月22日日曜日

ちょいとExcelVBAのメモ

■Application.ActiveCell.Address
ReadOnly
意味:現在選択しているセルを返します


■Application.Calculation
値 :xlCalculationManual/xlCalculationAutomatic
意味:xlCalculationManualの時、手動で更新をしないと値がかわりません。
   計算式を多数含む状態のシートに値を大量に入力するのであれば一度手動にしてから実行した方が高速になります。
   ※手動中にマクロが停止すると、手動のままとなるのでエラートラップする
    なりしてマクロが終了する前に必ず戻す必要があります。

■Application.CalculationState
値 :xlDone/xlPending
意味:Excel で実行されているすべての計算について、アプリケーションの計算状態を示すXlCalculationState クラスの定数を返します。値の取得のみ可能です。未計算ありだとxlPending(値:2)、計算済だとxlDone(値0)




■Application.EnableEvents
値 :True/False
意味:Falseの時に発生するイベントは無効となる
   ※手動中にマクロが停止すると、イベント無効のままとなるのでエラートラップする
    なりしてマクロが終了する前に必ず戻す必要があります。

■Application.ScreenUpdating
値 :True/False
意味:Falseの時、描画の更新がストップします。
   別のブックを開きたい時など、こっそり作業したい時にも有効です。
   ※手動中にマクロが停止すると、表示が更新されないままとなるのでエラートラップする
    なりしてマクロが終了する前に必ず戻す必要があります。

■Application.Version
値 :各バージョンを示す値
意味:Excelのバージョンを返す。バージョンによってコードを帰る場合に使う。

Excel 2007 12.0
Excel 2003 11.0
Excel 2002 10.0
Excel 2000 9.0
Excel 97 8.0
Excel 95 7.0
Excel 5.0 5.0

2011年4月17日日曜日

prototypeのメモ

/* Stringにアラートするメソッドを追加 */
String.prototype.say = function(){alert(this)};

var str = new String("すとりんぐ");
str.say(); //すとりんぐ


/* Numberの値を2倍にしてアラートするメソッドを追加 */
Number.prototype.doubleSay = function(){ alert(this * 2) };

var num = new Number(123);
num.doubleSay(); //246


/* Functionに名前をアラートするメソッドを追加 */
Function.prototype.nameSay = function(){ alert(this.name) };

function bar(){};
function foo(){};
bar.nameSay(); //bar
foo.nameSay(); //foo


/* Arrayに要素を全てアラートするメソッドを追加 */
Array.prototype.elementSay = function(){
    for(var i = this.length; i--;){
        alert(this[i]);
    }
};

var list = ["a", "b", "c", "d"];
list.elementSay(); //d → c → b → a

/* カスタムコンストラクタの場合 */
var Person = function(name){
    this.name = name;
}

Person.prototype.say = function(){
    alert("I am " + this.name);
};

var human = new Person("Tarou");
human.say(); //I am Tarou

2011年3月31日木曜日

networkdays

ちゃんと動くか確認していないんだけど、
2000では、分析ツールをいれない限りつかえないNETWORKDAYSの代用コードを書いてみた。
あとで検証する。
Function NETWORKDAY(開始日 As Date, 終了日 As Date, Optional 祭日 As Range)
    Dim 日数 As Integer: 日数 = DateDiff("d", 開始日, 終了日) + 1
    Dim 休日 As Integer: 休日 = Int(日数 / 7) * 2
    Dim temp As Integer: temp = 日数 Mod 7
    
    If temp = 1 Then
        If (Weekday(終了日) = 1 Or Weekday(終了日) = 7) Then 休日 = 休日 + 1
    ElseIf temp = 2 Then
        If (Weekday(終了日) = 7 Or Weekday(終了日) = 2) Then 休日 = 休日 + 1
        If (Weekday(終了日) = 1) Then 休日 = 休日 + 2
    ElseIf temp = 3 Then
        If (Weekday(終了日) = 7 Or Weekday(終了日) = 3) Then 休日 = 休日 + 1
        If (Weekday(終了日) < 3) Then 休日 = 休日 + 2
    ElseIf temp = 4 Then
        If (Weekday(終了日) = 7 Or Weekday(終了日) = 4) Then 休日 = 休日 + 1
        If (Weekday(終了日) < 4) Then 休日 = 休日 + 2
    ElseIf temp = 5 Then
        If (Weekday(終了日) = 7 Or Weekday(終了日) = 5) Then 休日 = 休日 + 1
        If (Weekday(終了日) < 5) Then 休日 = 休日 + 2
    ElseIf temp = 6 Then
        If (Weekday(終了日) = 7 Or Weekday(終了日) = 6) Then 休日 = 休日 + 1
        If (Weekday(終了日) < 6) Then 休日 = 休日 + 2
    End If
    
    Dim i As Integer
    For i = 1 To 祭日.Count
        If 開始日 <= 祭日(i) And 祭日(i) <= 終了日 Then
            If Weekday(祭日(i)) <> 1 And Weekday(祭日(i)) <> 7 Then
                休日 = 休日 + 1
            End If
        End If
    Next

    NETWORKDAY = 日数 - 休日
End Function

Sub Auto_Open()
    Application.MacroOptions Macro:="NETWORKDAY", _
                Description:="開始日と終了日の間にある週の日数を計算します。"
End Sub