VB6上で、ODBCのデータソースの自動登録を行おうと思っています。
その際、実際の登録処理を行う前に、
既にデータソースへ登録されているかどうかを
チェックしたいのですが、どのようにすればいいのでしょうか?
(チェックしたいのはシステムDSNの内容です・・・)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

多少ODBCを勉強しなおしましたので、報告いたします。


O S:WIN2KServer SP2
TOOL:VB6SP5
での検証報告です。


Cのヘッダファイル
C:\Profram Files\Microsoft Visual Studio\Vc98\Inculude\ODBCINST.H

// SQLConfigDataSource request flags
#define ODBC_ADD_DSN 1 // Add data source
#define ODBC_CONFIG_DSN 2 // Configure (edit) data source
#define ODBC_REMOVE_DSN 3 // Remove data source

#if (ODBCVER >= 0x0250)
#define ODBC_ADD_SYS_DSN 4 // add a system DSN
#define ODBC_CONFIG_SYS_DSN5 // Configure a system DSN
#define ODBC_REMOVE_SYS_DSN6 // remove a system DSN
#if (ODBCVER >= 0x0300)
#define ODBC_REMOVE_DEFAULT_DSN7// remove the default DSN
#endif /* ODBCVER >= 0x0300 */
という宣言がありました。
SQLConfigDataSource関数に与える定数を変更することで、システムDSNへの登録が可能なようです。(未検証)


さらにユーザDSNの情報は
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
システムDSNの情報は
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
内部に設定されるようです。

システムDSNの情報はレジストリを読み取ることによって可能だと思います。

参考URLは二つあります。
http://www.galliver.co.jp/writing/msdn/msdn01/in …(かなり下の方)
http://www.vbvbvb.com/jp/gtips/index0251.html(レジストリ操作)

参考URL:http://www.vbvbvb.com/jp/gtips/index0251.html

この回答への補足

参考URLの2つ目をもとに、検証してみました。

システムDSNの情報、レジストリを問い合わせモードでオープンすることによって、存在の可否を確認することができました。

'レジストリOPEN関数
Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" _
    (ByVal hkey As Long, _
     ByVal lpSubKey As String, _
     ByVal ulOptions As Long, _
     ByVal samDesired As Long, _
     phkResult As Long) As Long

' レジストリの主キーの定義済みハンドルを示す定数の宣言
Public Const HKEY_LOCAL_MACHINE = &H80000002

' セキュリティのアクセスマスクを示す定数の宣言
Public Const KEY_QUERY_VALUE = &H1

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

RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
       《レジストリのキー名》, _
       0, _
       KEY_QUERY_VALUE, _
       lngRegSubKeyHandle)

(この関数の戻り値を見ることによって判断します・・・)

これでシステムDSNに登録されていない時のみ
確認することができそうです。

補足日時:2002/03/26 20:25
    • good
    • 0
この回答へのお礼

詳しい調査結果の掲載、ありがとうございます。
システムDSNへの登録は、先週末に私も少し検証をしました。
どうやら「ODBC_ADD_SYS_DSN(=4)」で可能なようです。
ちなみに、削除についても「ODBC_REMOVE_SYS_DSN(=6)」でできました。

レジストリの話のところまでは私もまだ未確認ですので
こちらでも、参考URL等を元にもう少し調査してみることにします。

お礼日時:2002/03/26 10:27

>ODBCのデータソース登録内容の確認


これは無理かも?

おそらくどこかのファイルに情報が書き込まれているのだと思いますが、わかりません。。。
しかし、エラー回避(On Error ・・・)を実行後に削除、そして追加を行ったら、すでにあろうと無かろうと関係なく、登録ができると思います。



参考URLにSQLとAccessへのODBCの登録方法を載せてあります。そちらを参考にしてみてください。
もしOracleなら、ちょっと改造するだけで登録できます。


ぼくはODBC接続をたまにしますが、データソースを使用しないでODBC接続を行っています。
必要であれば、そちらも公開しますよ。

(ODBCで接続するDBの種類も書くようにしてくださいね。)

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=108207

この回答への補足

DBの種類はAccess(95です)を使っています。
作業でAccessしか使っていなくてSQL-ServerとかOracleの存在を忘れてました。すみません。。。


他に、ご存知の方、いらっしゃいましたらまだ締め切らないでおこうと思いますので回答をお願い致します・・・。

補足日時:2002/03/23 09:47
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

・・・実は、そのソース、過去ログからちょっと参考にさせていただいてたりします^^;
登録の作業そのものに関しては、TAGOSAKU7さんが公開しているそのソースでいけるということが確認できました。

登録をする前に、既に登録されていないかどうかをチェックして、登録されていない場合のみ処理を行いたかったのですが、どうも無理っぽいですね・・・。

でも、既にあっても無くても登録作業自体はできるようですね。

お礼日時:2002/03/23 09:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QODBCの自動登録について

VB6のプログラム上から、ODBCのデータソースを登録する方法は、ありますか?

Aベストアンサー

どもども田吾作7です。
以下のソースを標準モジュールにて実行してみてください。

※注意
スペースは全て全角で行っていますので、コピペがうまくいかないときは、全角スペース1つを、半角スペース2つに置き換えてください。


Option Explicit

Private Const ODBC_ADD_DSN = 1  ' 追加
Private Const ODBC_CONFIG_DSN = 2 ' 編集
Private Const ODBC_REMOVE_DSN = 3 ' 削除

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
    (ByVal hwndParent As Long, _
     ByVal fRequest As Long, _
     ByVal lpszDriver As String, _
     ByVal lpszAttributes As String) As Long

Sub Main()
  'SQL-Server
  Call AddDSN_SQL("SQL_DSN")
  Call RemoveDSN("SQL_DSN", "SQL Server")
  
  'Access
  Call AddDSN_ACCESS("AccessDSN", "《MDBファイルのフルパス》")
  Call RemoveDSN("AccessDSN", "Microsoft Access Driver (*.mdb)")
End Sub


' データソースの追加 for SQL-Server
Private Sub AddDSN_SQL(inDSNName As String)
  Dim wkSts      As Long
  Dim strDriver    As String
  Dim strAttributes  As String
  
  ' ODBCドライバ
  strDriver = "SQL Server"
  
  ' 属性
  strAttributes = "DSN=" & inDSNName & vbNullChar & _
          "Description=SampleDSN" & vbNullChar & _
          "Server=(local)" & vbNullChar & _
          "Database=pubs" & vbNullChar
  
  ' データソースの登録
  wkSts = SQLConfigDataSource(0&, ODBC_ADD_DSN, strDriver, strAttributes)
  
  ' 登録の成功・失敗の判断
  If wkSts Then
    MsgBox "登録成功 SQL"
  Else
    MsgBox "登録失敗 SQL"
  End If
  
End Sub

' データソースの追加 for ACCESS
Private Sub AddDSN_ACCESS(inDSNName As String, inMdbFile As String)
  Dim wkSts      As Long
  Dim strDriver    As String
  Dim strAttributes  As String
  
  ' ODBCドライバ
  strDriver = "Microsoft Access Driver (*.mdb)"
  
  ' 属性
  strAttributes = "DSN=" & inDSNName & vbNullChar & _
          "Uid=Admin" & vbNullChar & "pwd=" & vbNullChar & _
          "DBQ=" & inMdbFile & vbNullChar
   
  ' データソースの登録
  wkSts = SQLConfigDataSource(0&, ODBC_ADD_DSN, strDriver, strAttributes)
  
  ' 登録の成功・失敗の判断
  If wkSts Then
    MsgBox "登録成功 ACCESS"
  Else
    MsgBox "登録失敗 ACCESS"
  End If
End Sub

' データソースの削除
Private Sub RemoveDSN(inDSNName As String, inServerDriver As String)
  Dim wkSts      As Long
  Dim strDriver    As String
  Dim strAttributes  As String
  
  ' ドライバ名を指定する
  strDriver = inServerDriver
  
  ' 削除するデータソース名を指定する
  strAttributes = "DSN=" & inDSNName & vbNullChar
  
  ' データソースを削除する
  wkSts = SQLConfigDataSource(0, ODBC_REMOVE_DSN, strDriver, strAttributes)
  
  ' 削除の成功・失敗の判断
  If wkSts Then
    MsgBox "削除成功"
  Else
    MsgBox "削除失敗"
  End If
End Sub

どもども田吾作7です。
以下のソースを標準モジュールにて実行してみてください。

※注意
スペースは全て全角で行っていますので、コピペがうまくいかないときは、全角スペース1つを、半角スペース2つに置き換えてください。


Option Explicit

Private Const ODBC_ADD_DSN = 1  ' 追加
Private Const ODBC_CONFIG_DSN = 2 ' 編集
Private Const ODBC_REMOVE_DSN = 3 ' 削除

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
    (ByVal hwndParent As Long, _
  ...続きを読む

QプログラムからODBCデータソースの一覧を取得したい

C++からODBCのシステムDSNやユーザーDSNに登録されているデータソースの一覧を取得したいのですが、Google検索などで調べてみましたがよく分かりませんでした。

そのためのWindows APIがあるのか?
それともレジストリに書かれているのか?

ヒントをお持ちの方はぜひお願いします。

Aベストアンサー

Microsoft 社のリソースはもう活用されましたか?
まだでしたら参考URLをどうぞ。

参考URL:http://support.microsoft.com/kb/119064/ja

QSQLConfigDataSourceについて。

 VBからODBCに登録するプログラムを作っています。
 API関数のSQLConfigDataSourceを使っています。
 ヘルプやネットで調べて、作成することはできました。
 が、パスワードとユーザ名が登録していない状況での
 ことです。
 ここにもいくつかODBCに接続に関しての投稿を見ました。
 パスワードとユーザ名指定しているサンプルやURL
 なんかもあったのでいってみて、実際に自分のプログラムでも
 試したのですがどうもうまくいきません。

 SQLConfigDataSourceの引数のひとつである、ODBC_REMOVE_SYS_DSNと
 ODBC_ADD_SYS_DSNを使いました。
 ODBC_REMOVE_DSNとODBC_ADD_SYSを先に使ってみましたが
 こちらもできませんでした。
 なぜ"SYS"がつくものとつかないものふたつあるのでしょうか?
 先に質問のパスワードとユーザー名指定して登録できないのは、
 これと関係あるのでしょうか?
 
 全くの初心者で申し訳ありませんが、よろしくお願いします。

 VBからODBCに登録するプログラムを作っています。
 API関数のSQLConfigDataSourceを使っています。
 ヘルプやネットで調べて、作成することはできました。
 が、パスワードとユーザ名が登録していない状況での
 ことです。
 ここにもいくつかODBCに接続に関しての投稿を見ました。
 パスワードとユーザ名指定しているサンプルやURL
 なんかもあったのでいってみて、実際に自分のプログラムでも
 試したのですがどうもうまくいきません。

 SQLConfigDataSourceの引数のひとつである、ODBC...続きを読む

Aベストアンサー

SQLさばについて

データベースのプロパティのセキュリティタブに認証方式がある
混合モード/Windows認証
これらはDBをSQLさばをインストールするときに選択を求められる
接続先のDBをおいているマシンにユーザ権限があって、しかもパスワードが同じなら、Windows認証が働いて、入れてしまう。

SQLさばは、誉れ高いMS商品
初期設定が初心者向きで扱い易い
しかしちょっとつつけば、すーぱゆーざ権限で入れるというセキュリティの弱さダントツを秘めた諸刃の剣


これを回避するにはWin認証を行わない。
ドメイン環境でActiveDirectoryを導入。
などのデフォルト設定以外の事をしないとだめズラ

QODBCの設定をコピーしたい。

ODBCの設定を他のマシンに大量コピーをしたいのですがどうしたら良いでしょうか?
出来ればバッチ等で対応したいのですが…
教えてください。
なにとぞ宜しく御願いいたします。

Aベストアンサー

こんにちは。

milkiさんのODBCの設定がどのタイプであるか解りませんが
設定内容はここから取ることができます。

◆ユーザーDSN

<レジストリ>
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources
の中にあるキーと値

◆システムDSN

<レジストリ>
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
の中にあるキーと値

◆ファイルDSN
<レジストリ>
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC File DSN#DefaultDSNDir
に指定されているディレクトリの中のファイル

レジストリはレジストリエディタなどでファイルに書き出し
そのファイルを他のマシンに取り込ませれば良いでしょうか。
通常、ファイルをダブルクリックで取り込まれます。

※当方WindowsNT4.0なのでもしかしたら構成等違うかもしれませんがお許しください。

こんにちは。

milkiさんのODBCの設定がどのタイプであるか解りませんが
設定内容はここから取ることができます。

◆ユーザーDSN

<レジストリ>
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources
の中にあるキーと値

◆システムDSN

<レジストリ>
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
の中にあるキーと値

◆ファイルDSN
<レジストリ>
HKEY_LOCAL_MACHINE\S...続きを読む

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

Qaccess ODBCリンクテーブルの作り方

 自分のPCで、あるaccessの業務システムを作成し、それを数人で共有してデータの入力をするようにする為に、ODBCリンクテーブルというものを作る必要があると思っています。

 既存で業務的に違う別のシステムがあり、そこでODBCリンクテーブルというものは使用しています。(退職した前担当者が作成。)

 ODBCリンクテーブルというものは、どのうようにして作るのですか?
 (地球マークのテーブルです。)

Aベストアンサー

Accessのテーブルの画面で
何もないところで右クリックすると、「テーブルのリンク」とあると思います。
それをクリックすると今度はファイルを開くダイアログが出てきます。
そこの「ファイルの種類」のドロップダウンリストの一番下の「ODBCデータソース」
を選択するとODBCデータソースの選択画面になります。

但しここで選べるものは、あらかじめ登録されているODBCデータソースだけです。
ODBCデータソースは各PCでコントロールパネル(管理ツール)のODBCデータソースから設定する必要があります。
(ODBCデータソースの登録の方法については長くなるので省きますが)

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QADODB.Streamで開いたファイルに追記

「ADODB.Streamで開いたファイルに追記する」を参考に以下を作成しました。
c:\test.txtファイルを検索し、regEx.Patternで指定した一行を既存のC:\test_new.txtに追記したいと考えています。ちなみにファイルはUTF-8なのでADODB.Streamを使用しています。
C:\test_new.txtの最後の行にregEx.Pattern = "aaa"で指定した行が追記されることは確認していますが、C:\test_new.txtにc:\test.txtがコピーされて最後の行にregEx.Patternが追記されます。
試行錯誤しましたが初心者なため上手く動作しません。
既存のC:\test_new.txtに指定した一行を追記するにはどうしたら良いでしょうか。
お手数ですが、何方かご回答よろしくお願いします。

Option Explicit

Dim objStream,regEx,testLine,tempLine

Const adSaveCreateOverWrite = 2

Set objStream = CreateObject("ADODB.Stream")

objStream.CharSet = "UTF-8"

objStream.Open()

objStream.LoadFromFile("c:\test.txt")

Set regEx = New RegExp

regEx.Pattern = "aaa"

Do Until objStream.eos

tempLine = objStream.readtext(-2)

If regEx.Test(tempLine) Then

testLine = tempLine

End If

Loop

objStream.Position = objStream.size

objStream.WriteText(testLine)

objStream.SaveToFile("C:\test_new.txt"),adSaveCreateOverwrite

objStream.Close()

Msgbox ("End")

「ADODB.Streamで開いたファイルに追記する」を参考に以下を作成しました。
c:\test.txtファイルを検索し、regEx.Patternで指定した一行を既存のC:\test_new.txtに追記したいと考えています。ちなみにファイルはUTF-8なのでADODB.Streamを使用しています。
C:\test_new.txtの最後の行にregEx.Pattern = "aaa"で指定した行が追記されることは確認していますが、C:\test_new.txtにc:\test.txtがコピーされて最後の行にregEx.Patternが追記されます。
試行錯誤しましたが初心者なため上手く動作しません。
既存のC:\t...続きを読む

Aベストアンサー

Option Explicit

Const adSaveCreateOverWrite = 2

'ちゃんとストリームは分けましょう。
Dim objStream1
Dim objStream2


Dim regEx
Dim testLine
Dim tempLine

Set objStream1 = CreateObject("ADODB.Stream")
objStream1.CharSet = "UTF-8"
objStream1.Open()
objStream1.LoadFromFile("test.txt")

Set regEx = New RegExp
regEx.Pattern = "aa[a-z]"

Do Until objStream1.eos
tempLine = objStream1.readtext(-2)
'aa[a-z]という正規表現にマッチする行は(行頭、行末がないので)3行あるが、
'変数の内容がそのたびに書き換えられるので最終的なtestLineの中身はaaxc
If regEx.Test(tempLine) Then
testLine = tempLine
End If
Loop

objStream1.close()

Set objStream2 = CreateObject("ADODB.Stream")

objStream2.CharSet = "UTF-8"
objStream2.Open()
objStream2.LoadFromFile("test_new.txt")

objStream2.Position = objStream2.size
objStream2.WriteText(testLine)
objStream2.SaveToFile("test_new.txt") , adSaveCreateOverwrite
objStream2.Close()


'============================
'テストに使ったデータ(test.txt)。使っている文字列に特に意味はなく適当に打ち込んだ。
'bbb
'aaa
'abc
'aad
'add
'xyz
'aaxc
'====テストに使った実行前のデータ(test_new.txt)。最後に改行が入っている点に注意。
'rrxc

'====実行後のデータ(test_new.txt)
'rxrc
'aaxc
'補足:
'Cドライブに固定されるのを嫌って、ドライブ名やフォルダ名の指定をなくしている。
'作ったコードおいておいた
'http://cid-b89cb784f5346675.office.live.com/browse.aspx/TestCase/Q6311251?uc=3

Option Explicit

Const adSaveCreateOverWrite = 2

'ちゃんとストリームは分けましょう。
Dim objStream1
Dim objStream2


Dim regEx
Dim testLine
Dim tempLine

Set objStream1 = CreateObject("ADODB.Stream")
objStream1.CharSet = "UTF-8"
objStream1.Open()
objStream1.LoadFromFile("test.txt")

Set regEx = New RegExp
regEx.Pattern = "aa[a-z]"

Do Until objStream1.eos
tempLine = objStream1.readtext(-2)
'aa[a-z]という正規表現にマッチする行は(行頭、行末がないので)3行あるが、
'変数の内容...続きを読む

QVBプログラムから「管理者として実行」したい

コマンドプロンプトで実行したいコマンドが
「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP)
だとします。

XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、
そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。

上記を、手作業で行う場合は、それで解決しますが、
同じ事を、VBのコードから実行したい場合、
System.Diagnostics.Process.Start
を使い、(以下サンプルコード)
---------------------------
Dim psi As New System.Diagnostics.ProcessStartInfo()

psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Arguments = "/c route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***"

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
p.WaitForExit()

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

とすると、XPでは、管理者権限を問われないので実行できますが、
Vista以降だと、コマンドが管理者権限で実行されていないためか実行が完了せず、コマンドの内容も行われていません。(route addコマンドの記述にミスは無いとします。)

Vista以降の場合、手作業で、コマンドプロンプトを右クリックして「管理者として実行」を選んで起動し、コマンドを実行するのと同じ事を、
VBのコードから行うには、どうしたらいいのでしょうか?
分かる方、教えてください。お願いします。

コマンドプロンプトで実行したいコマンドが
「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP)
だとします。

XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、
そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。

上記を、手作業で行う場合は、それで解決しますが、
同じ事を、VBのコードから実行したい場合、
System.Diagnostics.Process.Start
を使い、(以下サンプルコード)
---------------------------...続きを読む

Aベストアンサー

http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報