2024年8月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

VB6

VB6 DataGirdでデータが表示されない

かなり前にリリースされたプログラムですが、プログラムを実行するパソコンを新しいものに入れ替えを行ったところ、VB6でAdoデータコントロールを使用してAccess2000のデータをDataGridに表示する部分で問題が発生した。
開発環境では問題ないのに、プログラム配布先の環境ではなぜかDataGridが空っぽになってしまう。
以下のように修正したところ問題なく表示された。
DataGridコントロールを使用している箇所が少なかったので助かった。

【修正前】
With Adodc1
        .ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .RecordSource = "select * from hoge"
        .Refresh
End With

【修正後】
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cn.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = db1.mdb"
cn.CursorLocation = adUseClient
With rs
    .ActiveConnection = cn
    .Source = "select * from hoge"
    .CursorType = adOpenStatic
    .LockType = adLockOptimistic
    .Properties("IRowsetIdentity") = True
    .Open
End With
Set DataGrid1.DataSource = rs
DataGrid1.Refresh


※この一文が重要と思われる。
.Properties("IRowsetIdentity") = True

参考URL
[VB]Jet.OLE DB 4.0 Provider で DataGrid に表示できない
http://support.microsoft.com/kb/224192/ja

VB6 コレクション

ハッシュテーブルの代わりに使えそう。
速度的には?だが・・・

[サンプルコード]

    Dim c As New Collection
   
    c.Add "test1", "key1"
    c.Add "test2", "key2"

    Debug.Print c.Count         'コレクション数取得
    Debug.Print c.Item(1)       'Indexでアクセス
    Debug.Print c.Item("key2")  'キーでアクセス
   
    c.Remove "key1"             'キーを指定して削除

VB6 On Error Resume Nextが動作しない

VB6のOn Error Resume Nextはエラーが発生してもエラーを無視して次の行にいってくれるという上手く使えば便利な命令です。

On Error Resume Nextを記述しているにも関わらずデバッグで止まってしまうことがあったら以下の点を確認。

VBのIDEの「ツール」-->「オプション」-->「全般」で「エラートラップ」が「エラー発生時に中断」にチェックがついていると止まってしまいます。デフォルトでは「クラスモジュールで中断」になっています。

VB6 PDF自動印刷(調査中)

PDFファイルをVB6から自動で印刷を行うには
Adobeのサポートページによると
バージョン6はPDF.OCX
バージョン7はAcroPDF.dll
を使用して印刷できそうです。ただ、PDF.OCXはサポートされていません。
また、「OCX ファイルまたは DLL ファイルは再配布できません」という点が残念。

参考URL
http://support.adobe.co.jp/faq/qadoc/spitz.nsf/dfa308f1e716c91649256bfb0014757e/62c6c03d583f11eb49256c01000e8672?OpenDocument

PDF.ocxはファイル自体は存在しませんが、Ver7.07でも同じコードで使えそうです。

VB6コード例

PDF.src = "c:\test.pdf"
DoEvents
PDF.printAll

確認した環境:
Acrobat6.0Standard
Acrobat Reader7.07

printAllメソッドで印刷されるはずなのですが、以下のような画面が毎回表示されてしまいます。
Pdf




「はい」をクリックすれば印刷はできます。
ただ、「以後、このメッセージを表示しない」にチェックをつけると印刷できなくなってしまいます(謎)

もうすこし調査が必要。

FAX送信 続き

FAX送信して、送信状態を取得するコード例

    Dim faxServer As New FAXCOMLib.faxServer
    Dim faxDoc As New FAXCOMLib.faxDoc
    Dim faxNumber As String

    faxServer.Connect "サーバー名"
   
    Set faxDoc = faxServer.CreateDocument("C:\Temp\Fax.doc")

    faxDoc.RecipientName = "受信者名"
    faxDoc.SenderTitle = "件名です"
    faxDoc.DisplayName = "Fax送信テスト"
    faxNumber = "1234567890"    '-は取り除いておく
    faxDoc.faxNumber = faxNumber

    'ここまでは同じ

    Dim varJobId As Variant
    Dim strFaxJob As FaxJobs
    Dim strFaxStatus As FaxJob
    Dim lngCount As Long
   
    '送信後ジョブID取得
    varJobId = faxDoc.Send

    '送信トレイからジョブIDが一致するジョブを探して状態を取得
    Set strFaxJob = faxServer.GetJobs()
    For lngCount = strFaxJob.Count To 1 Step -1
        Set strFaxStatus = strFaxJob.Item(lngCount)
        If strFaxStatus.JobId = varJobId Then
            MsgBox "Jobid: " & strFaxStatus.JobId & " Status:" & strFaxStatus.QueueStatus
            Exit For
        End If
    Next lngCount
   
    faxServer.Disconnect

VB6 ドライブが存在するかチェックする

VB6の関数

Private Function GetDrive(ByVal strDriveName) As Boolean

    Dim objFso As Object
    Dim objDrive As Object
   
    On Error GoTo GetDrive_Err:
   
    GetDrive = False
   
    Set objFso = CreateObject("Scripting.FileSystemObject")
   
    On Error GoTo GetDrive_Err1:
    Set objDrive = objFso.GetDrive(strDriveName)
    On Error GoTo GetDrive_Err:
   
    Set objDrive = Nothing
    Set objFso = Nothing

    GetDrive = True

    Exit Function

GetDrive_Err:

    MsgBox Error$

GetDrive_Err1:

    Exit Function

End Function

呼び出し例

If GetDrive("D:") = False Then
    MsgBox "ドライブが存在しません"
End If
   

VB6 WindowsXPでFAXを送信

1.モデムのインストール
2.FAXサービスをインストール
「プログラムの追加と削除」-->「Windowsコンポーネントの追加と削除」
Faxservice





3.VBの参照設定でFAXCOMLibにチェックを付ける

Fax





4.VB6コード例

    Dim faxServer As New FAXCOMLib.faxServer
    Dim faxDoc As New FAXCOMLib.faxDoc
    Dim faxNumber As String

    faxServer.Connect "PC名"

    Set faxDoc = faxServer.CreateDocument("C:\Temp\Fax.doc")

    faxDoc.RecipientName = "受信者名"
    faxDoc.SenderTitle = "件名です"
    faxDoc.DisplayName = "Fax送信テスト"
    faxNumber = "0000000000000"    '-は取り除いておく
    faxDoc.faxNumber = faxNumber

    faxDoc.Send
    faxServer.Disconnect

VB6 コンピューター名の取得

APIを使ってコンピュータ名を取得するコード例

'APIの宣言
Private Declare Function GetComputerName Lib "kernel32" _
Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function GetPcName()

    Dim buf As String * 256
    Dim size As Long
    Dim r As Long
    size = 256
    r = GetComputerName(buf, size)
    computer_name = Left$(buf, size)
End Function

VB6 \演算子

VBのHelpより
2つの数値の商を計算し、結果を整数で返します

Dim MyValue
MyValue = 100 \ 3   ' 33 を返します。

最近まで知らなかったのですが、Fixを使うよりも見た目がスマートですね。

VB6 フォーム以外からのプログラムの開始方法

基本中の基本ですが社内に知らない人がいたので・・・

「プロジェクト」メニューの一番下の「(アプリケーション名)のプロパティ」を表示します。
スタートアップの設定を「Sub Main」を選択します。

Submain










モジュールのSub Main()を作ります。