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

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

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

A 回答 (3件)

もし、aが空だったら


If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then
    • good
    • 17
この回答へのお礼

ふむふむ

お礼日時:2009/05/12 16:05

isを使ってください。

    • good
    • 3
この回答へのお礼

ほぉ

お礼日時:2009/05/12 16:05

オブジェクトの比較には Is演算子を使います



if a Is Nothing then
とすれば aがNothingなのかをチャック出来ます
    • good
    • 5
この回答へのお礼

へー

お礼日時:2009/05/12 16:05

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

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

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

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

QエクセルVBAでファイルを連続して処理する方法は

エクセルVBAで、エクセルファイルを開いた状態で特定処理を行う仕組みを作りました。
ただ、複数のファイルを処理したいのですが、いちいちファイルを開いてから処理しなければならないため効率が今ひとつです。
ファイル名称をテーブル化するなどして、一気に連続して処理するようにしたいのですが、どのように行えばいいでしょうか。

また、処理したいのは、更新日付が一定日以降のエクセルファイルです。
更新日付と対象ファイルのフォルダーを指定すれば、更新日がそれ以降のファイルを検索し、それが順次処理されていくようなVBAをつくりたいと考えています。

部分的にでもよいので、どなたか分かる方、教えてください。
ちなみにエクセルのバージョンは2000です。
よろしくお願いします。

Aベストアンサー

> 選択フォルダのサブフォルダをのものも含むようにはできないでしょうか。

再帰処理すればできますよ。

Microsoft Scripting Runtime を参照してから、次のコードを試してみて
下さい。
取り急ぎで書いたので、エラーがあるかもしれませんが。。。

まあ、環境によっては使えませんし、推奨はできないのですが、FileSearch
を使ってもサブフォルダを含めた検索はできます。調べればサンプルはすぐ
でてくると思いますよ。

ご参考までに。

Private mDateFilter As Date

Sub フォルダ内のXLSファイル順次処理()

  Dim fso As FileSystemObject
  Dim sDir As String
  
  ' // 日付のフィルタ条件設定 例)10日前の 0:00 以降更新のファイルを対象とする場合
  mDateFilter = DateAdd("d", -10, Date) + TimeValue("00:00:00")

  ' // 対象ファイルのあるフォルダを指定
  sDir = BrowseForFolder()
  If Len(sDir) = 0 Then
    Exit Sub
  End If

  Set fso = CreateObject("Scripting.FileSystemObject")
  
  Dim fld As Folder
  Dim iRes As Integer
  
  If fso.FolderExists(sDir) Then
    Set fld = fso.GetFolder(sDir)
    iRes = 0
    If fld.SubFolders.Count > 0 Then
      iRes = MsgBox("サブフォルダも検索しますか?", _
             vbYesNoCancel Or vbInformation)
    End If
    Select Case iRes
      Case vbYes:  Call FindFiles(fld, True)
      Case vbNo, 0: Call FindFiles(fld, False)
      Case Else:  ' // User Cancel
    End Select
  End If
  
  Set fld = Nothing
  Set fso = Nothing


End Sub

' // XLS ファイルを検索するサブプロシージャ
Private Sub FindFiles( _
  ByRef fld As Folder, _
  ByVal fCheckSubfolders As Boolean _
)

  ' // ファイルへの処理
  Dim f   As Object
  For Each f In fld.Files
    If f.Name Like "*.xls" And f.Name <> ThisWorkbook.Name Then
      If f.DateLastModified >= mDateFilter Then
        ' // 処理例
        Call MainProc(f)
      End If
    End If
  Next

  ' // サブフォルダ検索オプション
  Dim subFolder As folder
  If fCheckSubfolders Then
    ' // 再帰呼び出し
    For Each subFolder In fld.SubFolders
      Call FindFiles(subFolder, True)
    Next
  End If

End Sub

' // メイン処理 -- FindFiles から順次呼び出されます
Sub MainProc(ByRef f As file)

  ' // ここにご自分で書いたプロシージャを
  ' // とりあえず、セルにでも書き出してみます
  Dim i As Long
  i = Cells(Rows.Count, "A").End(xlUp).Row + 1
  Cells(i, "A").Value = f.Name
  Cells(i, "B").Value = f.DateLastModified

End Sub

' // フォルダ選択ダイアログ
Private Function BrowseForFolder() As String

  Const BIF_RETURNONLYFSDIRS = &H1

  Dim fld As Object
  Set fld = CreateObject("Shell.Application") _
       .BrowseForFolder(0&, "選択します", BIF_RETURNONLYFSDIRS)
  If Not fld Is Nothing Then
    BrowseForFolder = fld.Self.Path
  End If
  Set fld = Nothing

End Function

> 選択フォルダのサブフォルダをのものも含むようにはできないでしょうか。

再帰処理すればできますよ。

Microsoft Scripting Runtime を参照してから、次のコードを試してみて
下さい。
取り急ぎで書いたので、エラーがあるかもしれませんが。。。

まあ、環境によっては使えませんし、推奨はできないのですが、FileSearch
を使ってもサブフォルダを含めた検索はできます。調べればサンプルはすぐ
でてくると思いますよ。

ご参考までに。

Private mDateFilter As Date

Sub フォルダ内のXLS...続きを読む

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

QエクセルVBA 2千万行のCSVファイルを開きたい

上から順に読み込み、順次処理していき最終的には全部処理します。CSVファイルは読むだけです。

やり方はいくつか考えられます。
1
100万行ずつシートに読み込み、終わったら次を読み込む。CSVファイルは開きっぱなし。

2
100万行ずつのエクセルファイルに分割し、順次開いて処理。ファイル開閉に時間がかかる

3
2千万行の巨大な配列に代入し、順次処理。
CSVファイルは閉じることが出来る。

3がいいように思えますが、どうでしょうか?使用メモリは1と同じですか?

Aベストアンサー

> 懸念点は、最初から最後まで巨大なCSVファイルを開いたまま処理することです。

それに関しては問題ないです。VBAのOpenでファイルを開いた場合、実は一切読んでいません。今何行目を読んでいるかを示すカウンタを用意するだけです。またLine Inputで読み込む場合も、今操作している一行しか相手にしません。

だからこそ、実装している物理メモリ量をはるかに超えるサイズのファイルを扱っていても、仮想メモリのお世話にならずに済むわけです。

なので懸念材料はそこではなく、分割処理することによってデータ同士の断絶が起きると言うか、連続性がなくなることでしょうか。最初の100万行の固まりと、次の100万個の固まりには全くつながりがないことになるので。

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QVBAからファイルをセル入力から開く方法

VBAからファイルをセル入力から開く方法

だれかご教授頂けませんでしょうか?VBAからエクセルファイルを開こうとしています。
そこでシート1のA1セルにファイル名を記述してあり、そのファイル名からファイルを開く事は出来ますでしょうか?
何か良い方法がありましたら教えて頂きたいのですが。

Aベストアンサー

下記で試してください。
パス名の最後には\を付けるようにしてください。

Workbooks.Open "D:\ABC\" & Sheets("シート1").Range("A1").Value


ワークシートのイベントを使う方法も考えられると思います。
BeforeDoubleClickイベント辺りを使って
ファイル名セルをダブルクリックすれば

Excel(エクセル) VBA入門:ワークシートのイベント
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html

Q複数該当の検索処理でエラーになる(オブジェクト変数または With ブロック変数が設定されていません)

ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、1つ目だけ該当して、2件目以降を検索する結果セルには該当があってもなくてもNothingが返ってきてしまいます。

Workbooks.Open Filename:="000" & intNendo & strHanki,UpdateLinks:=0
Range("A1").Select
With Range("A1:A37")
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not 結果セル Is Nothing Then
最初アドレス = 結果セル.Address
Do
strIdousyaName = Cells(結果セル.Row, 5).Value
For intteamName2 = 2 To LastTeam
Windows(strBookname).Activate
Sheets("名簿").Select
TeamName2 = Cells(intteamName2, 2).Value
'異動先チーム名簿は飛ばす
If TeamName2 <> TeamName1 Then
Workbooks.Open Filename:=mypath & "チーム名簿\" & TeamName2 & "000" & intNendo & strHanki, UpdateLinks:=0
With Worksheets(1).Range("A6:A37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
'異動者の名前があればoooをセットする
If Not Status Is Nothing Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
Else
With Worksheets(1).Range("E6:E37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False)
'異動者の名前がある&Dataがゼロの時 oooをセットする
If Not Status Is Nothing Then
If Cells(strStatusRow, 35).Value = 0 Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
End If
End If
End With
End If
End With
'該当があったら ループから抜ける
If strFileCloseFLG = "1" Then
ActiveWindow.Close
Windows(TeamName1 & "000" & intNendo & strHanki & ".xls").Activate
Cells(結果セル.Row, 44) = Dataooo1
Exit For
End If
Else
End If
Next intteamName2
Set 結果セル = .FindNext(結果セル)   ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
Loop While Not 結果セル Is Nothing And 結果セル.Address <> 最初アドレス   ←(2)ここでエラーがでます
End If
End With

(1)次の該当があってもなくても結果セルはnothingです。以前テストしていたときは、該当セルがある場合のみ正常に値が返ってきていたのですが。。(特にコードをかえた記憶もありません)
(2)では「オブジェクト変数または With ブロック変数が設定されていません(Error 91)」とでます。
<質問>
・次の検索がうまくヒットするにはどうすればよいでしょうか?
・もし(1)で該当セルがある場合のみ値がかえるようになれば
 (2)を『Loop While Not 結果セル Is Nothing』にしかえてエラーを回避しても問題ないでしょうか?

見よう見真似のコーディングで
とてもみにくいかと思いますが、期限が迫っていてとても困っています。どうかよろしくお願いします。

ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、1つ目だけ該当して、2件目以降を検索する結果セルには該当があってもなくてもNothingが返ってきてしまいます。

Workbooks.Open Filename:="000" & intNendo & strHanki,UpdateLinks:=0
Range("A1").Select
With Range("A1:A37")
...続きを読む

Aベストアンサー

はずしてるかもしれませんが・・・

最初の
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
以後に、別の.Findしてるので、最後の
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
の検索条件が変わってしまっているのだと思います。
という訳で、最初に範囲を取得してしまうか、.Find以外の方法でチェックするといいと思います。
一番簡単な回避方法は(あまりお勧めではありませんが)、
Set 結果セル = .FindNext(結果セル)
の前に、最初の検索と同じ条件のダミーの検索を入れる方法です。
Set dmy = .Find("異動者", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
を入れると、たぶん回避できると思います。

p.s.
このプログラムが最初の"異動者"を探したシートのモジュール部にあるならいいのですが、標準モジュールにある場合は・・・
ダミーの検索の前にActiveSheetを設定する必要があるかもしれません

はずしてるかもしれませんが・・・

最初の
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
以後に、別の.Findしてるので、最後の
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
の検索条件が変わってしまっているのだと思います。
という訳で、最初に範囲を取得してしまうか、.Find以外の方法でチェックするといいと思います。
一番簡...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q「オブジェクト変数または With ブロック変数が設定されていません。」の修正方法が分かりません

 いつも勉強させていただいております.どうぞよろしくお願いいたします.
 とんちんかんな質問でしたらもうしわけございません.

 多分オブジェクト定義あたりの問題だと思うのですが,
.NETでエクセルのオートシェイプ文字をいじる際,
Dim objShape As Object
Dim objSelection As Object
For i = 1 To WB.Worksheets(N_s).Shapes.count
objShape = WB.Worksheets(N_s).Shapes(i)
If objShape.Type = 6 Then
objSelection = objShape.Select()
For Each tbox In objShape.Ungroup()
If TypeName(tbox) = "TextBox" Then
tbox.Text = Replace(tbox.Text, OldStr, NewStr)
End If
Next
objSelection.ShapeRange.Regroup() '←ここでエラーが出ます
Else
End If
Next

ずっと調べておりますと,同じような質問があり,解決しているようなのですが,
理解できませんでした...
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29246&forum=7

 objSelection As Objectで宣言しているからOK.というわけでは
ないのでしょうか??
 とんちんかんな質問かもしれませんが,なんでもアドバイスいただけれると
うれしいです.どうぞよろしくお願いいたします.

 いつも勉強させていただいております.どうぞよろしくお願いいたします.
 とんちんかんな質問でしたらもうしわけございません.

 多分オブジェクト定義あたりの問題だと思うのですが,
.NETでエクセルのオートシェイプ文字をいじる際,
Dim objShape As Object
Dim objSelection As Object
For i = 1 To WB.Worksheets(N_s).Shapes.count
objShape = WB.Worksheets(N_s).Shapes(i)
If objShape.Type = 6 Then
objSelection = objShape.Select()
...続きを読む

Aベストアンサー

#1 redfox63さんの回答について
.NETなので、Setステートメントは必要ないです。

MSDNで調べてみただけですが、ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。
なので、objSelectionに何も値が入っていないのではないかと。
MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので、
> objSelection = objShape.Select()
> For Each tbox In objShape.Ungroup()
この2行が次のようになるのではないかと推測。
objShape.Select()
objSelection = objShape.Ungroup() 'objSelectionにShapeRangeが入る
For Each tbox In objSelection

こうしておいて、再グループ化するときは、
> objSelection.ShapeRange.Regroup()
ではなく
objSelection.Regroup()
とすればよいような気がします。

ご提示されたコードとMSDNを見ただけの推測回答ですが、ご参考になれば。

#1 redfox63さんの回答について
.NETなので、Setステートメントは必要ないです。

MSDNで調べてみただけですが、ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。
なので、objSelectionに何も値が入っていないのではないかと。
MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので、
> objSelection = objShape.Select()
> For Each tbox In objShape.Ungroup()
この2行が次のようになるのではないかと推測。
objShape.Select()
objSelection = objShape...続きを読む

Q他のExcelファイルのVBAコードを検索したい

他のExcelファイルに書かれたVBAコードに、ある特定のキーワード(パス名など)が使われているかを自動的に調べるためのVBAを書きたいと思っています。

仕事で使っているマクロが書かれたExcelファイルからある特定の処理をしているマクロを含むものを検索したいのですが、検索するExcelファイルが膨大なため、順番にExcelファイルを開いてVBAコードをチェックしていく工程をマクロ化したいのです。ファイルを順に開いていく処理はマクロ化できるのですが、書かれたVBAコードのチェックをどうしたらよいか悩んでいます。

「VBAコードに対して検索する」または「VBAコードを1行ずつ変数に代入する」、「モジュールシートをテキストファイルに出力する」などの処理が自動化できれば対応できそうなのですが、そのような処理をExcelVBAで作成できるでしょうか。

なお環境はWindowsXPのExcel2003です。
よろしくお願いいたします。

Aベストアンサー

開いたブックにあるVBAコードをテキストに出力する方法
Sub VBExport(WKB As Workbook)
  Dim A, B
  Set A = WKB.VBProject.VBComponents
  For Each B In A
    B.Export "C:\~" '★テキストファイルでエクスポート
    xxxxxx '★上記テキストファイルを調べる処理
  Next
End Sub
ブックやシートにあるコードも(空でも)出力されます。
もし、標準モジュールのみ処理したい場合は「B.Type = 1」に限り
エクスポートします。

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます


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

人気Q&Aランキング

おすすめ情報