home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 January
/
VPR9701A.ISO
/
PROJ95
/
EXAMPLES
/
BATCH
/
PUBLIC.BAS
< prev
Wrap
BASIC Source File
|
1996-08-21
|
20KB
|
446 lines
'モジュール レベルのオプション
Option Explicit '変数は明示的に宣言する必要があります。
Option Base 1 '配列のインデックスは 1 から始めます。
Option Compare Text '大文字と小文字を区別せずに、文字列を比較します。
'グローバルな数値定数
Global Const MAX_BATCHES = 30 'バッチ数の上限 (変更可)
Global Const MAX_BATCH_ITEMS = 100 'バッチ項目数の上限 (変更可)
Global Const BATCH_NEW = 0 '新しいバッチの作成に使用するフラグ
Global Const BATCH_COPY = 1 '既存のバッチのコピーに使用するフラグ
Global Const BATCH_EDIT = 2 '既存のバッチの編集に使用するフラグ
'ファイル ヘッダーの文字列
Global Const FILE_HEADER = "MSProject4.10PrintBatchFile" 'ID の目的でバッチ ファイルの先頭に保存されます。
'*** 編集可能な文字列定数 ***
'バッチ項目の文字列
Global Const VIEWTXT = "ビュー: "
Global Const TABLETXT = "テーブル: "
Global Const FILTERTXT = "フィルタ: "
Global Const REPORTTXT = "レポート: "
Global Const DEFAULT_ITEM = "(既定)"
Global Const NEW_BATCH_NAME = "Batch"
Global Const COPY_BATCH_NAME = " のコピー"
Global Const BATCH_HEAD = "バッチの内容"
Global Const BATCH_END = "(末尾)"
'メッセージ ボックスの文字列とタイトル
Global Const MB_INVALID_FILE = "これは正しい印刷バッチ ファイルではありません。"
Global Const MB_INVALID_FILE_TITLE = "不正なファイル"
Global Const MB_NO_APP_OBJECT_TITLE = "OLE の初期化エラー"
Global Const MB_NO_APP_OBJECT = "Microsoft Project Application オブジェクトにアクセスできません。Microsoft Project を起動してください。Microsoft Project が実行中の場合は、ダイアログ ボックスが表示されていないかどうかを確認してから、もう一度やり直してください。"
Global Const MB_NO_ACTIVEPROJECT_TITLE = "ActiveProject オブジェクトへのアクセス エラー"
Global Const MB_NO_ACTIVEPROJECT = "MSProject ActiveProject オブジェクトにアクセスできません。対象となるプロジェクトを開いてください。プロジェクトが開いている場合は、Microsoft Project でダイアログ ボックスが表示されていないかどうかを確認してから、もう一度やり直してください。"
Global Const MB_MAX_BATCHES = "一覧には既に最大数の印刷バッチが含まれています。不要なバッチを削除してから、新しいバッチを追加してください。"
Global Const MB_MAX_BATCHES_TITLE = "最大数のバッチ"
Global Const MB_MAX_ITEMS = "一覧には既に最大数のバッチ項目が含まれています。不要な項目を削除してから、新しい項目を追加してください。"
Global Const MB_MAX_ITEMS_TITLE = "最大数の項目"
Global Const MB_PREV_INSTANCE = "バッチ印刷プログラムは既に実行されています。"
Global Const MB_PREV_INSTANCE_TITLE = "プログラムは実行中です"
Global Const MB_DELETE = " を削除しますか?"
Global Const MB_DELETE_TITLE = "バッチの削除"
Global Const MB_QUERYSAVE = "変更内容をバッチ ファイルに保存しますか?"
Global Const MB_QUERYSAVE_TITLE = "保存の変更"
Global Const MB_INVALID_NAME = "名前が正しくありません。別のバッチ名を入力してください。"
Global Const MB_INVALID_NAME_TITLE = "無効な名前"
Global Const MB_EMPTY_BATCH = "バッチには項目が最低 1 つは含まれていなければなりません。"
Global Const MB_EMPTY_BATCH_TITLE = "空のバッチ"
Global Const MB_DUPLICATE_NAME = "同じ名前のバッチが既に存在します。別のバッチ名を入力してください。"
Global Const MB_DUPLICATE_NAME_TITLE = "名前の重複"
'コモン ダイアログのコントロールの文字列
Global Const DLG_SAVE_TITLE = "印刷バッチ ファイルの保存"
Global Const DLG_OPEN_TITLE = "印刷バッチ ファイルを開く"
Global Const DLG_OPENFILTER = "印刷バッチ (*.MPB)|*.MPB|すべてのファイル (*.*)|*.*"
Global Const DLG_SAVEFILTER = "印刷バッチ (*.MPB)|*.MPB"
Global Const DLG_EXTENSION = "MPB"
'MsgBox のパラメータ
Global Const MB_ICONSTOP = 16 '警告メッセージ アイコン
Global Const MB_ICONQUESTION = 32 '問い合わせメッセージ アイコン
Global Const MB_ICONEXCLAMATION = 48 '注意メッセージ アイコン
Global Const MB_ICONINFORMATION = 64 '情報メッセージ アイコン
Global Const MB_YESNOCANCEL = 3 '[はい]、[いいえ]、および [キャンセル] ボタン
Global Const MB_YESNO = 4 '[はい] および [いいえ] ボタン
Global Const IDOK = 1 '[OK] ボタンがクリックされた場合
Global Const IDCANCEL = 2 '[キャンセル] ボタンがクリックされた場合
Global Const IDABORT = 3 '[中止] ボタンがクリックされた場合
Global Const IDRETRY = 4 '[再試行] ボタンがクリックされた場合
Global Const IDIGNORE = 5 '[無視] ボタンがクリックされた場合
Global Const IDYES = 6 '[はい] ボタンがクリックされた場合
Global Const IDNO = 7 '[いいえ] ボタンがクリックされた場合
'マウス ポインタ
Global Const DEFAULT = 0 '既定のポインタ
Global Const HOURGLASS = 11 '砂時計ポインタ
'表示のパラメータ
Global Const MODAL = 1
Global Const MODELESS = 0
'アクション プロパティ
Global Const DLG_FILE_OPEN = 1
Global Const DLG_FILE_SAVE = 2
'ファイルを開く/保存のダイアログのフラグ
Global Const OFN_READONLY = &H1&
Global Const OFN_OVERWRITEPROMPT = &H2&
Global Const OFN_HIDEREADONLY = &H4&
Global Const OFN_NOCHANGEDIR = &H8&
Global Const OFN_SHOWHELP = &H10&
Global Const OFN_NOVALIDATE = &H100&
Global Const OFN_ALLOWMULTISELECT = &H200&
Global Const OFN_EXTENSIONDIFFERENT = &H400&
Global Const OFN_PATHMUSTEXIST = &H800&
Global Const OFN_FILEMUSTEXIST = &H1000&
Global Const OFN_CREATEPROMPT = &H2000&
Global Const OFN_SHAREAWARE = &H4000&
Global Const OFN_NOREADONLYRETURN = &H8000&
Global Const CDERR_CANCEL = &H7FF3
'ユーザー定義型
Type utBatchItem 'バッチ項目 (ビュー/レポート) に対する型の定義
ItemName As String 'ビューまたはレポートの名前
Table As String 'テーブルの名前。空白でも可
Filter As String 'フィルタの名前。空白でも可
End Type
Type utBatchType 'バッチに対する型の定義。変数のプリフィックスは "bt" です。
Name As String 'バッチ名
NumItems As Integer 'バッチ項目の数
Items(MAX_BATCH_ITEMS) As utBatchItem 'バッチ項目の配列
End Type
'グローバル変数の宣言
Global goProjApp As object 'Microsoft Project アプリケーション オブジェクト
Global goActiveProj As object '作業中のプロジェクト オブジェクト
Global gbNeedSave As Integer '保存のプロンプトを表示するかどうかを示すフラグ
Global gabtBatches(MAX_BATCHES) As utBatchType 'バッチの配列
Global gnNumOfBatches As Integer 'メモリにあるバッチの数
Global gbtBatchBfr As utBatchType '作成、編集、またはコピーの対象と
'なっているバッチの値を
'保存するためのバッファ
Function bIsTaskView (ByVal sViewName As String) As Integer
'この関数は、ビュー名が TaskViewList にある場合は True、
'そうでなければ False を返します。(万一) 同じ名前のタスク ビューと
'リソース ビューが存在する場合、この関数は True を返します。
Dim iCount As Integer
For iCount = 1 To goActiveProj.TaskViewList.Count
If goActiveProj.TaskViewList(iCount) = sViewName Then
bIsTaskView = True 'タスク ビュー
Exit Function
End If
Next
bIsTaskView = False 'リソース ビュー
End Function
Function bSetActiveProjObj () As Integer
'この関数は、goActiveProj を作業中のプロジェクトに設定し、
'成功した場合は True、そうでなければ False を返します。
On Error GoTo bSetActiveProjObjError
bSetActiveProjObj = True '次のステートメントがエラーにならない限り、True を返します。
Set goActiveProj = goProjApp.ActiveProject
Exit Function
bSetActiveProjObjError:
bSetActiveProjObj = False
Set goActiveProj = Nothing
Select Case Err
Case 429 To 440 'OLE オートメーションのエラー
Case Else '予期しないエラー
Error Err
End Select
Resume Next
End Function
Function bSetProjAppObj () As Integer
'このプロシージャは、goProjApp を Microsoft Project アプリケーション オブジェクトに
'設定し、成功した場合は True、そうでなければ False を返します。
On Error GoTo bSetProjAppObjError
bSetProjAppObj = True '次のステートメントがエラーにならない限り、True を返します。
Set goProjApp = GetObject(, "MSProject.Application")
Exit Function
bSetProjAppObjError:
bSetProjAppObj = False
Select Case Err
Case 429 To 440 'OLE オートメーションのエラー
Set goProjApp = Nothing
Case Else '予期しないエラー
Error Err
End Select
Resume Next
End Function
Sub ClearBatchDef ()
'このプロシージャは、[バッチの定義] フォームの値をすべてクリアし、
'[バッチの内容] ボックスのアウトラインを初期化します。
frmBatchDef.txtBatchName = ""
frmBatchDef.outContents.Clear
frmBatchDef.outContents.AddItem BATCH_HEAD, 0
frmBatchDef.outContents.Indent(0) = 0
frmBatchDef.outContents.PictureType(0) = 1
frmBatchDef.outContents.AddItem BATCH_END, 1
frmBatchDef.outContents.Indent(1) = 1
frmBatchDef.outContents.PictureType(1) = 2
frmBatchDef.outContents.Expand(0) = False
frmBatchDef.outContents.ListIndex = 1
frmBatchDef.optItemType(0).Value = True
End Sub
Function iSearchBatchName (ByVal sName As String) As Integer
'この関数は、バッチ名の現在の一覧から sName をバイナリで検索し、
'見つかった場合は一覧での位置を返し、見つからない場合は -1 を
'返します。このモジュールでは Option Compare の設定が Text に
'なっているので、比較の際に、大文字と小文字は区別されません。
Dim iFirst As Integer '検索する配列セクションの下限のインデックス
Dim iMiddle As Integer '検索する配列セクションの中央のインデックス
Dim iLast As Integer '検索する配列セクションの上限のインデックス
'lstBatches に項目が 1 つもない場合は、
'-1 を返して関数を終了します。
If frmMain.lstBatches.ListCount = 0 Then
iSearchBatchName = -1
Exit Function
End If
'配列の項目 #1 からバイナリ検索を開始するので、
'先に項目 #0 に対して別のチェックを行います。
If frmMain.lstBatches.List(0) = sName Then
iSearchBatchName = 0
Exit Function
End If
iFirst = 1 '下限のインデックスを配列の 1 番目の要素に初期化します。
iLast = gnNumOfBatches '上限のインデックスを配列の末尾の要素に初期化します。
Do 'sName が見つかるまで、一覧のすべての項目に対して検索ループを実行します。
iMiddle = (iFirst + iLast) / 2 '中央のインデックスを計算します。
'sName が一覧の中央の名前より小さい場合、
'続けて一覧の前半を検索します。
If sName < frmMain.lstBatches.List(iMiddle) Then
iLast = iMiddle - 1
'そうでない場合は、続けて配列の後半を検索します。
Else
iFirst = iMiddle + 1
End If
Loop Until (frmMain.lstBatches.List(iMiddle) = sName) Or (iFirst > iLast)
If frmMain.lstBatches.List(iMiddle) <> sName Then
iSearchBatchName = -1 'sName が一覧で見つからない場合
Else
iSearchBatchName = iMiddle 'sName が一覧で見つかった場合
End If
End Function
Sub LoadFilters ()
'このプロシージャは、Microsoft Project のデータを使用して、フィルタ一覧を
'ロードします。一覧は、cboName でビューが選択されるたびに更新されます。
Dim iCount As Integer 'For...Next ループで使用するインデックス
Dim sTemp As String 'ビュー名を保存するための Temp 文字列
frmBatchDef.cboFilter.Clear 'フィルタ一覧をクリアします。
frmBatchDef.cboFilter.AddItem DEFAULT_ITEM '一覧に項目 [(既定)] を追加します。
If bIsTaskView(frmBatchDef.cboName.Text) Then '選択されているビューがタスク ビューの場合
For iCount = 1 To goActiveProj.TaskFilterList.Count
frmBatchDef.cboFilter.AddItem goActiveProj.TaskFilterList(iCount) '各フィルタを一覧に追加します。
Next
Else '選択されているビューがリソース ビューの場合
For iCount = 1 To goActiveProj.ResourceFilterList
frmBatchDef.cboFilter.AddItem goActiveProj.ResourceFilterList(iCount) '各フィルタを一覧に追加します。
Next
End If
frmBatchDef.cboFilter.ListIndex = 0 '項目 [(既定)] を選択します。
End Sub
Sub LoadReports ()
'このプロシージャは、Microsoft Project のデータを使用して、
'レポート一覧をロードします。
Dim iCount As Integer 'For...Next ループのインデックス
Dim nNumReports As Integer 'Microsoft Project のレポートの数
Dim sTemp As String 'レポート名を保存するための Temp 文字列
frmBatchDef.cboTable.Visible = False 'テーブル一覧を非表示にします。
frmBatchDef.cboFilter.Visible = False 'フィルタ一覧を非表示にします。
frmBatchDef.lblTable.Enabled = False 'アクセス キーを無効にします。
frmBatchDef.lblFilter.Enabled = False 'アクセス キーを無効にします。
frmBatchDef.Refresh
frmBatchDef.cboName.Clear '項目名の一覧をクリアします。
nNumReports = goActiveProj.ReportList 'Microsoft Project のレポートの数を取得します。
For iCount = 1 To nNumReports 'Microsoft Project の各レポートについて
sTemp = goActiveProj.ReportList(iCount) 'レポート名を取得します。
frmBatchDef.cboName.AddItem sTemp 'レポート名を一覧に追加します。
Next
frmBatchDef.cboName.ListIndex = 0 '一覧の先頭のレポートを選択します。
End Sub
Sub LoadTables ()
'このプロシージャは、Microsoft Project のデータを使用して、テーブル一覧を
'ロードします。一覧は、cboName でビューが選択されるたびに更新されます。
Dim iCount As Integer 'For...Next ループで使用するインデックス
Dim sTemp As String 'ビュー名を保存するための Temp 文字列
frmBatchDef.cboTable.Clear 'テーブル一覧をクリアします。
frmBatchDef.cboTable.AddItem DEFAULT_ITEM '一覧に項目 [(既定)] を追加します。
If bIsTaskView(frmBatchDef.cboName.Text) Then '選択されているビューがタスク ビューの場合
For iCount = 1 To goActiveProj.TaskTableList.Count
frmBatchDef.cboTable.AddItem goActiveProj.TaskTableList(iCount) '各テーブルを一覧に追加します。
Next
Else '選択されているビューがリソース ビューの場合
For iCount = 1 To goActiveProj.ResourceTableList.Count
frmBatchDef.cboTable.AddItem goActiveProj.ResourceTableList(iCount) '各テーブルを一覧に追加します。
Next
End If
frmBatchDef.cboTable.ListIndex = 0 '項目 [(既定)] を選択します。
End Sub
Sub LoadViews ()
'このプロシージャは、作業中のプロジェクトで設定されている
'タスク ビューとリソース ビューを使用して、項目名の一覧を
'ロードします。一覧には、分割ビューやモジュール エディタは
'含まれません。また、VB からは、ビューが印刷可能かどうかを
'簡単に確認できないので、印刷できないビューも選択可能になります。
Dim iCount As Integer 'For...Next ループで使用するインデックス
Dim nNumTaskViews As Integer 'Microsoft Project の現在のタスク ビューの数
Dim sTemp As String 'ビュー名を保存するための Temp 文字列
frmBatchDef.cboTable.Visible = True 'テーブル一覧を表示します。
frmBatchDef.lblTable.Enabled = True 'アクセス キーを有効にします。
frmBatchDef.cboTable.ListIndex = -1 '一覧の選択をクリアします。
frmBatchDef.cboFilter.Visible = True 'フィルタ一覧を表示します。
frmBatchDef.lblFilter.Enabled = True 'アクセス キーを有効にします。
frmBatchDef.cboFilter.ListIndex = -1 '一覧の選択をクリアします。
frmBatchDef.Refresh
frmBatchDef.cboName.Clear 'バッチ名の一覧をクリアします。
'一覧のタスク ビューの項目を更新します。
nNumTaskViews = goActiveProj.TaskViewList.Count 'プロジェクトのタスク ビューの数
For iCount = 1 To nNumTaskViews
sTemp = goActiveProj.TaskViewList(iCount) 'タスク ビューの名前を取得します。
frmBatchDef.cboName.AddItem sTemp '各ビューを一覧に追加します。
Next
'一覧のリソース ビューの項目を更新します。
For iCount = 1 To goActiveProj.ResourceViewList.Count
sTemp = goActiveProj.ResourceViewList(iCount) 'リソース ビューの名前を取得します。
frmBatchDef.cboName.AddItem sTemp '各ビューを一覧に追加します。
Next
frmBatchDef.cboName.ListIndex = 0 '一覧の先頭のビューを選択します。
End Sub
Sub SetBatchDef (ByVal iBatchNum As Integer, ByVal nMode As Integer)
'このプロシージャは、バッチ番号 iBatchNum の値を使用して、
'[バッチの定義] フォームのフィールドをロードします。
'バッチの既定の名前は nMode で指定されます。
Dim iItems As Integer 'gabtBatches().Items() のインデックス
Dim iList As Integer 'frmBatchDef.outContents のインデックス
Static nNewBatchNum As Integer '新しいバッチ名のインクリメント番号
ClearBatchDef 'フォームの元の値をクリアします。
'nMode に基づいて [バッチの定義] フォームのバッチ名フィールドを設定します。
Select Case nMode
Case BATCH_NEW '新しいバッチを作成している場合
Do '"BatchX" の名前の番号を、有効なものが見つかるまでインクリメントします。
nNewBatchNum = nNewBatchNum + 1 '新しいバッチの番号をインクリメントします。
Loop Until iSearchBatchName("Batch" + Format$(nNewBatchNum, "0")) = -1
'既定のバッチ名をフォームに入力します。
frmBatchDef.txtBatchName = NEW_BATCH_NAME + Format$(nNewBatchNum, "0")
Exit Sub 'この場合、ほかに設定されているフィールドがないので、サブルーチンを終了します。
Case BATCH_COPY '既存のバッチをコピーしている場合
frmBatchDef.txtBatchName = gabtBatches(iBatchNum).Name + COPY_BATCH_NAME
Case BATCH_EDIT '既存のバッチを編集している場合
frmBatchDef.txtBatchName = gabtBatches(iBatchNum).Name
End Select
'[バッチの定義] フォームの残りのフィールドの値を設定します。
iList = 0
For iItems = 1 To gabtBatches(iBatchNum).NumItems 'バッチのすべての項目に対してループを実行します。
'[バッチの内容] ボックスの一覧に項目名を追加します。
iList = iList + 1 'frmBatchDef.outContents のインデックスをインクリメントします。
'[バッチの内容] ボックスの一覧に項目名を追加します。
frmBatchDef.outContents.AddItem gabtBatches(iBatchNum).Items(iItems).ItemName, iList
'この項目がテーブルである場合は、一覧にテーブルを追加します。
If gabtBatches(iBatchNum).Items(iItems).Table <> "" Then
iList = iList + 1 'frmBatchDef.outContents のインデックスをインクリメントします。
'[バッチの内容] ボックスの一覧にテーブルを追加します。
frmBatchDef.outContents.AddItem gabtBatches(iBatchNum).Items(iItems).Table, iList
'テーブル名をインデントします。
frmBatchDef.outContents.Indent(iList) = 2
End If
'この項目がフィルタである場合は、一覧にフィルタを追加します。
If gabtBatches(iBatchNum).Items(iItems).Filter <> "" Then
iList = iList + 1 'frmBatchDef.outContents のインデックスをインクリメントします。
'[バッチの内容] ボックスの一覧にフィルタを追加します。
frmBatchDef.outContents.AddItem gabtBatches(iBatchNum).Items(iItems).Filter, iList
'フィルタ名をインデントします。
frmBatchDef.outContents.Indent(iList) = 2
End If
Next
frmBatchDef.outContents.ListIndex = frmBatchDef.outContents.ListCount - 1
End Sub