お世話になります。

ExcelVBAで、コマンドバーの類を全て消去した後に残る、
空白部分ができる原因が解りません。
この部分をダブルクリックすると、エラーになって強制終了に
なってしまいます。
完全に消してしまいたいのですが、この状況になってしまう、
原因と対策を教えてください。

内容は、『システム』という名のシートにある『ロック』ボタンを
押すと、コマンドバーを全て消去して、Sheet1に切り替わるといった
流れです。

↓モジュール側
-------------------------------------------------------------
Dim myCB As CommandBar

Public Sub onCmdBarAttr()

DoEvents

With Application

For Each myCB In Application.CommandBars
myCB.Enabled = True
Next myCB

.CommandBars("Standard").Visible = True

.CommandBars("Formatting").Visible = True

.CommandBars("Visual Basic").Visible = True

.CommandBars("Worksheet Menu Bar").Enabled = True
.CommandBars("CELL").Enabled = True

' タスクバーに表示させる
.ShowWindowsInTaskbar = True

' 数式バーを表示
.DisplayFormulaBar = True
' ステータスバーを表示
.DisplayStatusBar = True

End With
End Sub

Public Sub offCmdBarAttr()

Dim myCB As CommandBar

On Error Resume Next

For Each myCB In Application.CommandBars
myCB.Enabled = False
Next myCB

On Error GoTo 0

With Application
.CommandBars("Worksheet Menu Bar").Enabled = False
.CommandBars("CELL").Enabled = False

' 数式バーを消去
.DisplayFormulaBar = False

' ステータスバーを消去
.DisplayStatusBar = False

' タスクバーに表示させない
.ShowWindowsInTaskbar = False
End With

End Sub
' シートロック
Public Sub protectSheet(ByVal stSheetName As String)

Application.ScreenUpdating = False

' 一旦シート保護をかけ直す
With Worksheets(stSheetName)
.Activate
.Unprotect
.Protect UserInterfaceOnly:=True

' カーソルの移動範囲を設定する
.ScrollArea = "$A$1"

' 左上セルを選択
.Range("H16").Select

' 保護されたセルは選択不可にする
.EnableSelection = xlNoRestrictions

End With

Application.ScreenUpdating = True

End Sub
' シートロック解除
Public Sub unprotectSheet(ByVal stSheetName As String)

' 一旦シート保護をかけ直す
With Worksheets(stSheetName)
.Unprotect

' スクロール範囲を解除する
.ScrollArea = ""

' 保護されたセルでも選択可能にする
.EnableSelection = xlUnlockedCells
End With
End Sub
Public Sub setBookAttribute(ByVal bFlg As Boolean)
With Windows(ThisWorkbook.Name)

' タブを設定
.DisplayWorkbookTabs = bFlg

' スクロールバーを設定
.DisplayHorizontalScrollBar = bFlg
.DisplayVerticalScrollBar = bFlg

' グリッドを設定
.DisplayGridlines = bFlg

' 行列数表示を設定
.DisplayHeadings = bFlg
End With
End Sub

↓シート側
------------------------------------------------------
Private Sub btnProtect_Click()

' アプリケーション全体の処理
Call Module1.offCmdBarAttr

' シート単位の処理
Call Module1.protectSheet("Sheet1")

' ブック単位の処理
Call setBookAttribute(False)

Worksheets("Sheet1").Activate
End Sub

Private Sub btnUnprotect_Click()
Call Module1.onCmdBarAttr
Call Module1.unprotectSheet("Sheet1")
Call setBookAttribute(True)
End Sub

以上、よろしくお願いいたします。

「VBA コマンドバーを消した後に残る空白」の質問画像

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

A 回答 (7件)

前述した私の環境と[vista/xl2000SR1]の環境では


・[フォーム]のボタンを使う
・ActiveCell.Selectを入れる
・TakeFocusOnClick=False
それぞれで解消できます。
なので、もしかしたら現象がちょっと違うかも。
(違うというより、+αでPosition = msoBarFloatingのCommandBarがある?)

だとすると、CommandBarを仕舞う処理を最後に(ScreenUpdating = Trueの後に)
持ってくると良いでしょう。

念のためbtnProtectのプロパティでTakeFocusOnClickをFalseにして、
Private Sub btnProtect_Click()
  Call Module1.protectSheet("Sheet1")
  Call setBookAttribute(False)
  'この処理を最後に
  Call Module1.offCmdBarAttr
  Worksheets("Sheet1").Activate
End Sub

offCmdBarAttrの内容は以下。
Public Sub offCmdBarAttr()
  Dim myCB As CommandBar

  With Application
    .ScreenUpdating = False '不要と思う。
    .DisplayFormulaBar = False
    .DisplayStatusBar = False
    .ShowWindowsInTaskbar = False
    .ScreenUpdating = True
    '以下の処理を最後に
    On Error Resume Next
    For Each myCB In .CommandBars
      'myCB.Visible = False
      myCB.Enabled = False
    Next myCB
    On Error GoTo 0
  End With
End Sub

#元コードの
#.CommandBars("Worksheet Menu Bar").Enabled = False
#.CommandBars("CELL").Enabled = False
#これは myCB.Enabled = False とダブってるので不要。
    • good
    • 0
この回答へのお礼

end-uさん、何度もありがとうございます。

上記の方法でもなかなかうまくいかなかったので、
全体を見直して、ScreenUpdatingを使用せずに
回せるように書き換えてみることにしました。

本当にいつもありがとうございます。

今後とも、何かありましたらお願いいたします。

お礼日時:2009/05/24 16:50

myRangeです。


当方(WinXp, xl2000sp-3)ではどうやっても再現できないので
はっきりとは言えないのですが、

end-uさんが指摘されたbtnProtectにFocusがある状態が原因だとすれば
提示のように、Activecell.Selectで上手くいくはずですね。

ま、ダメもとで、
即、btnUnProtectにFocusを当てるとかしてみたらどうでしょうか。


'-----------------------------------------
Private Sub btnProtect_Click()

●Sheets("Sheet1").btnUnProtect.Select

  ' アプリケーション全体の処理
  Call Module1.offCmdBarAttr
'----------------------------------------


同じバージョンで現象が出たり出なかったりするわけですから
バグであることは確かでしょう。
 
当方では現象の再現を確認できませんので、
後はend-uさんにお任せ、ということで。(^^;;;
お役に立てず申し訳ないことです。
 
 
 
    • good
    • 0
この回答へのお礼

myRangeさん、なんどもありがとうございます。

再現できませんでしたか…。

完全にExcelの『不具合』ということであれば、それはそれで
あきらめはつくのですが…。

なにはともあれ、何度もありがとうございました。
何とか回避方法を見つけて、対処したいと思います。

お礼日時:2009/05/24 16:46

[フォーム]のボタンでも解消しませんでしたか?


もしくはCommandButtonのプロパティでTakeFocusOnClickをFalseにしてみるとかはどうでしょう。

次善の策として
>ScreenUpdatingを無効にしておかないと、一瞬でもユーザー
>情報が表示されてしまうため
これはコードを見直す事によって対応可能だと思います。
内容不明なので具体的には書けませんが表示やSelectしてなくても検索は可能ですが?
    • good
    • 0

ぁ...CommandButtonにフォーカスを残しておかなければいいので


Private Sub btnProtect_Click()
  ActiveCell.Select '●
  ' アプリケーション全体の処理
  Call Module1.offCmdBarAttr
  ' シート単位の処理
  Call Module1.protectSheet("Sheet1")
  ' ブック単位の処理
  Call setBookAttribute(False)
  Worksheets("Sheet1").Activate
End Sub
これでもいいかも。

この回答への補足

end-uさん、いつもありがとうございます。

いただいた方法で試してみましたが(Activecell.Select)、
私のほうでは解消しませんでした。

現在はダミーでツールバーを表示させておく方法で、
回避していますが、できればきれいに解決したいものです。

ScreenUpdatingを無効にしておかないと、一瞬でもユーザー
情報が表示されてしまうため、なんとか解決しないといけないの
ですが…。

お手数をおかけしますが、引き続きお願いできたらと思います。

補足日時:2009/05/24 10:42
    • good
    • 0

[win2000sp4/xl2000sp3]の環境で、提示コードの2種類を試して再現しました。


実行後、CommandButtonがある『システム』シートに切り替えると出てくるようですね。
Application.ScreenUpdating = False を削除すれば出ないわけですから、
それで良いような気がしないでもないです。
(画面のチラつきも全然気になりませんが)

試してみてもいいかもしれないのは
Sub test()
  Call offCmdBarAttr
  Call protectSheet("Sheet1")
  Call setBookAttribute(False)
  Worksheets("Sheet1").Activate
End Sub
こんなコードを標準モジュールに置いて、
[コントロールツールボックス]ではなく[フォーム]のボタンにこのマクロを登録して実行してみるとか。
少なくとも私の環境では解消されます。
    • good
    • 0

いま、ScreenUpdating=False(画面更新をしない)を


標準モジュールの全てのプロシージャに入れて
最初のコードを実行してみましたが再現できません。

(補足要求)
(1)xl2000は、SP-3になってるでしょうか。
(2)補足のコードは最初のコードからすると大分削除されてますが
   それでも質問の現象が出るのでしょうか?
    (当方ではこれも上手く動作します)


ScreenUpdatingをTrueにすると上手くいくが、
飽くまでも、Falseでやりたいということですね。
 
で、次を試してください。
ツールバー、数式バー、行列番号をFalseにする時に
APIのSleepを使って、200~300ミリ秒実行を止めてみてください。

(ご存知とは思いますが、Sleepの使い方)

●標準モジュールの宣言セクションで次の1行を宣言

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

●プロシージャでは、Sleep 止めたいミリ秒 とするだけです

Sub test55555()
  MsgBox "aaa"
  Sleep 300
  MsgBox "bbb"
End Sub
 

 

この回答への補足

myRangeさん、続けてありがとうございます。
いただいた方法を試してみたのですが(Sleep)、
やはりだめなようです。

あの後試してみた結果、ツールバーを非表示にし、ScreenUpdatingを
falseにし、シートを切り替えると発生するようです。

サンプルのソースでは、必要なところのみ絞っているので、
ScreenUpdatingを行わなくても、大きな問題にはならないのですが、
実は本活用部分では、直前にユーザ情報を開き、そこから
ユーザIDとハスワードを検索するといった処理が入っているため、
Updatingを無効にしないと、一瞬とはいえ、ユーザー情報が
見えてしまうため、どうしてもUpdatingは無効にしておかないと
いけないのです。

現在では、『開く』と『閉じる』の二つのボタンをもったツールバー
を表示させておき、応急手段としています。

…が、やはり気分的には納得したいので、できればきちんと
解決できればと思います。

お手数をおかけいたしますが、よろしくお願いいたします。

補足日時:2009/05/24 10:34
    • good
    • 0

xl2000で提示のコードを試してみましたが再現できませんでした。



考えられる原因としては、画面表示更新にあるようにも思えますが
提示のOnOffのプロシージャにはScreenUpdating = Falseがないので
ん?という感じですが。

で、ダメもとで
標準モジュールの全てのプロシージャに
強制的に、画面表示更新の
Application.ScreenUpdating = True
を入れてみたらどうでしょうか。


●それから、Excelのバージョンも提示しておいた方がベターだと思いますが。
 
 


 

この回答への補足

myRangeさん、ありがとうございます。
あれからいろいろ試してみたのですが、やはり
状況は変わりませんでした。後、最初に掲示したサンプルでは
頭にScrollUpdatingが抜けていました。これを行わなければ
問題の空白部分は出ないのですが…。記述漏れですみませんでした。

今回もサンプルを掲示します。必要な限り絞って調べてみました。

↓モジュール側
---------------------------------------------------
Option Explicit

Dim myCB As CommandBar

'*******************************

Public Sub onCmdBarAttr()

DoEvents

With Application

For Each myCB In Application.CommandBars
myCB.Enabled = True
Next myCB

.CommandBars("Standard").Visible = True

.CommandBars("Formatting").Visible = True

.CommandBars("Visual Basic").Visible = True

.CommandBars("Worksheet Menu Bar").Enabled = True
.CommandBars("CELL").Enabled = True

End With



End Sub

'******************************

Public Sub offCmdBarAttr()

Dim myCB As CommandBar

On Error Resume Next

Application.ScreenUpdating = False

For Each myCB In Application.CommandBars
myCB.Enabled = False
Next myCB

On Error GoTo 0

With Application
.CommandBars("Worksheet Menu Bar").Enabled = False
.CommandBars("CELL").Enabled = False

End With

Application.ScreenUpdating = True

End Sub

↓シート側
---------------------------------------------------
Option Explicit

Private Sub btnProtect_Click()

Call Module1.offCmdBarAttr

Worksheets("Sheet1").Activate
End Sub

Private Sub btnUnprotect_Click()
Call Module1.onCmdBarAttr

End Sub

なお、使用しているVerは2000ですが、2003でも同じ現象が
起きました。

以上、よろしくお願いいたします。

補足日時:2009/05/22 18:14
    • good
    • 0

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

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

この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...続きを読む

QMaskEdBox.Enable= False だと、BackColor が効きません

MaskEdBox の Enable を False にして、BackColor を設定すると、
BackColor が、有効になりませんでした。
解決方法を教えて下さい。

Aベストアンサー

VBのバージョンは何でしょうか?

VB6のSP3で単純に組んだプログラムでは再現しませんでした。
他の原因も考えられますのでフォームの様子や周辺のソースなど補足してください。

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

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

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

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

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

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

Aベストアンサー

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

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

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

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

QEnabled=Falseのテキストボックスの文字の色

VB6です。
テキストボックスで、Enabled=Falseに設定されているものについては、基本的にグレーアウトで表示されると思いますが、そのままの設定で色だけを変更する方法はあるのでしょうか。

なければ、ないでいいのですが、もしあれば便利だと思いましたので、ご存知でしたら教えてください。

なお、テキストボックスではなく、ラベルを使いなさいというのはできません。

処理がめんどくさいので、すべてをコントロール配列にして一度ですべての処理をさせたいからです。

Aベストアンサー

お気に召すかわかりませんが、このような方法があります。

1.Enable=Falseを設定した後に
 「BackColor = &H80000005(通常のテキストボックスの背景色)」
を設定する。

※文字はグレーのままです。

2.「Enable=False」ではなく、「Locked = True」の設定をする。

※入力はできませんが、「右クリック→貼り付け」はできてしまいます。

いかがでしょうか?

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

QApplication.ScreenUpdating = Falseが効きません

VBA初心者ですが、ブックを開いた際に、別のフォルダにあるエクセルファイル全てをバックグラウンドで開きたいと思い、下記のようなコードを書いたのですが、どこにApplication.ScreenUpdating = Falseを入力しても、別のフォルダにあるエクセルファイルが普通に開いてしまいます。

Sub Auto_open()

Const DIR_PATH = "\\あいうえお\"
Dim fl_name As String

fl_name = Dir(DIR_PATH & "\*.xls*")
If fl_name = "" Then
MsgBox "Excelファイルがありません。"
Exit Sub
End If

Do
Workbooks.Open _
Filename:=DIR_PATH & "\" & fl_name
fl_name = Dir
Loop Until fl_name = ""

End Sub

コードを理解していないと言われればそれまでですが、どうしたら上記のようなことができるようになるか、どなたかご教授いただけますか。

VBA初心者ですが、ブックを開いた際に、別のフォルダにあるエクセルファイル全てをバックグラウンドで開きたいと思い、下記のようなコードを書いたのですが、どこにApplication.ScreenUpdating = Falseを入力しても、別のフォルダにあるエクセルファイルが普通に開いてしまいます。

Sub Auto_open()

Const DIR_PATH = "\\あいうえお\"
Dim fl_name As String

fl_name = Dir(DIR_PATH & "\*.xls*")
If fl_name = "" Then
MsgBox "Excelファイルがありません。"
Exit Sub
End If

Do
Workbooks.Ope...続きを読む

Aベストアンサー

こんにちは

Visible属性をFalseに設定することで、非表示にできます。
でも、一瞬は見えるみたいなので、ちらつきのもとになるようです。

http://www.itlab51.com/?p=5346

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

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

Aベストアンサー

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

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

Q[×]ボタン.Enabled = False は可能?

済みません,質問が二つあります。

1.メインフォームから,BorderStyle = 1 のダイアログフォームを Modeless で開くのですが,このフォームを右上の[×]ボタンで閉じさせたくありません。[×]ボタンをクリックしても凹まないようにし(Disabled にし),さらに表示も淡色にする方法があれば,教えていただきたく存じます。

2.テキストボックスに入力された文字列が,ファイル名として有効かどうかを簡単に判定する方法はありますか? つまり,ファイル名に「\/:,…」などが使われていたら NG,しかしパス名で使われている分には OK といった判定が簡単にできるのでしょうか?

どうかよろしくお願いいたします。

Aベストアンサー

こんにちはmaruru01です。
1.について
単に[×]で閉じないようにするなら、FormのUnLoadイベントでCancelをTrueにしてやればよいと思います。
2.について
サンプルを作ってみました。ついでにファイル名が存在するかどうかのチェックもつけました。
No.3の方が言っているように、Open For InputまたはOutputでファイルを開いてみて、エラー値で判断します。
pathNameにファイル名(フルパス)を入れて、今回の質問では、-1が返ったら、ファイル名としては無効(不正なファイル名)ということになります。
参考になれば幸いです。
では。


'ファイルの存在チェック及び、不正ファイル名チェック
Public Function NGfileName(ByVal pathName As String) As Integer

  Dim Num As Integer

  NGfileName = 0
  Err.Number = 0

  On Error Resume Next

  'inputモードでファイルの存在チェック
  Num = FreeFile
  Open pathName For Input As #Num
  If Err.Number = 0 Then
    NGfileName = 1 'ファイルが存在する
  End If
  Close #Num

  If NGfileName = 1 Then Exit Function
  Err.Clear

  'outputモードで不正ファイル名チェック
  Num = FreeFile
  Open pathName For Output As #Num
  If Err.Number <> 0 Then
    NGfileName = -1 'ファイル名が不正
  End If
  Close #Num

  If NGfileName = 0 Then Kill pathName
  Err.Clear

End Function

こんにちはmaruru01です。
1.について
単に[×]で閉じないようにするなら、FormのUnLoadイベントでCancelをTrueにしてやればよいと思います。
2.について
サンプルを作ってみました。ついでにファイル名が存在するかどうかのチェックもつけました。
No.3の方が言っているように、Open For InputまたはOutputでファイルを開いてみて、エラー値で判断します。
pathNameにファイル名(フルパス)を入れて、今回の質問では、-1が返ったら、ファイル名としては無効(不正なファイル名)ということになります。
参...続きを読む

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」に限り
エクスポートします。

QExcelVBA EnableプロパティがFalseの時に文字の色を変えたくない

ユーザーフォーム上のテキストボックスの内容を変えたくないときにEnableプロパティをFalseにすると、文字の色が灰色に変わってしまいますよね。
色を変えたくないので防ぐ方法はないでしょうか。
また、文字を変更させない方法で、ほかによい方法はないでしょうか。

Aベストアンサー

TextBox1.Locked = True


人気Q&Aランキング

おすすめ情報