外出自粛中でも楽しく過ごす!QAまとめ>>

エクセル2013で、IFERROR関数を使うようにしたら、VBAで特定シートの名前の定義を削除するコードを実行すると、途中でエラーがでるようになってしまいました。
そこで、普段表示されない名前の定義を表示させるコードを実行すると、「_xlfn.IFERROR」という名前定義が値や参照範囲が「#NAME?」の状態でありました。

これを削除すると、正常動作するようなのですが、ファイルを開く度に作成されるようです。
そこで、最初に「_xlfn.IFERROR」を名前の定義から削除してエラーがでないようにしたいのですが、削除がうまくできません。
または、「#REF!」や「#NAME?」などのエラーを名前の定義から削除するようにしたいと思っています。

どうすればよいでしょうか?

うまくいっていない該当部分のコードです。

Sub sample()

'見えない名前定義があれば表示させる
Dim wName As Object
Dim wCnt As Long

For Each wName In Names
If wName.Visible = False Then
wName.Visible = True
wCnt = wCnt + 1
End If
Next


'#NAME?を削除
Dim n As Name
For Each n In ActiveWorkbook.Names
On Error Resume Next
If n.RefersToRange.Parent.Name = "#NAME?" Then
n.Delete
End If
If Err.Number > 0 Then
n.Delete
End If
On Error GoTo 0
Next n
End Sub

質問者からの補足コメント

  • うーん・・・

    手動ならいけますが、実際に使う人があまり詳しくないので簡単にできるようにしてあげたいと思っています。
    Sub sa()
    Dim nm As Object
    Dim mystr As String
    For Each nm In ActiveWorkbook.Names
    If InStr(1, nm.RefersTo, "#NAME?") Then
    nm.Delete
    End If
    Next
    End Sub
    だと、nm.Deleteでエラー1004で入力した名前は正しくありません、という内容。
    試しに名前を「_xlfn.IFERROR」から「xlfn.IFERROR」に手動で変更して上記マクロを動かすと削除してくれますが、_があるとだめ。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/07/09 23:00
  • 補足の字数制限があるようなので、さらに続きです。
    「_xlfn.IFERROR」という名前だとどうして前回補足のコードが動作しないのでしょうか?
    「_xlfn.IFERROR」はエクセルが自動で作成する名前の定義なのでどうしようもないし。
    「_xlfn.IFERROR」の名前を消すことができる方法があるでしょうか?

      補足日時:2015/07/09 23:05
  • 拡張子はxlsmです。2013なので最新です。
    IFERROR関数も計算はされています。
    ただし、名前の定義に「_xlfn.IFERROR」というものをエクセルが自動で作るようです。削除しても開くたびに再作成されます。この名前の定義は普通は見えませんが、非表示の名前の定義を表示させるマクロを実行すると存在を確認できます。
    これが、邪魔をして他のマクロの動作を妨げているようです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/07/10 12:47
  • どうもありがとうございます。
    こんなに大変なコードになってしまうのですね。それでも最終的には手動なんですね。了解しました。

    少し改造して、Sub Add_Button()は削除してPrivate Sub ErrNames_DeleteButton()のコード部分を少しだけ改造、それ以下のコードはそのまま。
    改造の部分をぬきだすと、

    Sub ErrNames_DeleteButton改造()
    ・・・
    MsgBox msg & vbCrLf & "しかし、名前:" & msg2 & "は安全ではありません。", vbExclamation
    Else
    Call extraction ’←現在のコードを呼び出してつなげるように追加
    ’ MsgBox msg←コメントアウトに変更


    ・・・・・・字数不足で続きは次回補足で。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/07/12 11:40
  • さらに続き
    ・・・

    If n.Name Like "_xlfn*" Then
    MsgBox "名前「_xlfn.IFERROR」を選択して削除して下さい。", vbExclamation ’←追加
    Application.SendKeys "%D{ENTER}", True

    ・・・

    ' MsgBox "再度・ボタンを押して試してください。" & vbCrLf _
    ' & "一旦保存し、再度開くと、もしかしたら、復活しているかもしれません。", vbInformation
    ’↑コメントアウト
    Call extraction ’現在のコードを呼び出してつなげるように追加

    End Sub

    前の回答でvbaではできないとのことだったので、IFERROR関数を使うのやめようかな?とも考えましたが、今回の回答でこのコードを使って解決することにしました。

      補足日時:2015/07/12 11:42
  • さらに続き
    ・・・

    If n.Name Like "_xlfn*" Then
    MsgBox "名前「_xlfn.IFERROR」を選択して削除して下さい。", vbExclamation ’←追加
    Application.SendKeys "%D{ENTER}", True

    ・・・

    ' MsgBox "再度・ボタンを押して試してください。" & vbCrLf _
    ' & "一旦保存し、再度開くと、もしかしたら、復活しているかもしれません。", vbInformation
    ’↑コメントアウト
    Call extraction ’現在のコードを呼び出してつなげるように追加

    End Sub

    前の回答でvbaではできないとのことだったので、IFERROR関数を使うのやめようかな?とも考えましたが、今回の回答でこのコードを使って解決することにしました。

      補足日時:2015/07/12 11:44

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

A 回答 (4件)

>手動ならいけますが、実際に使う人があまり詳しくないので簡単にできるようにしてあげたい



>「_xlfn.IFERROR」から「xlfn.IFERROR」に手動で変更して上記マクロを動かすと削除してくれますが、

これだけでは、再起動して、マクロで、Visible=Trueで、復活してきませんでしたか?

繰り返しますが、
>「_xlfn.IFERROR」の名前を消すことができる方法があるでしょうか?

※「名前の登録(見えないオブジェクト)」問題は、マクロでなければ解決しないことと、手動でなければ解決しないことと、二種類あるということです。
(これは、Excel 97 時代からの言い伝えですが……)

ということは、実際は、ワークシートの仕組みとVBAというものは、別もので、インターフェースがあって始めて、同じものではないということです。しかし、これを「自動で削除」というのは、考えられる方法はあるものの、いずれにしても、通常、私たちが使うようなVBAではなく、かなり特殊なマクロになってしまうことはいたしかたがありません。なるべく、このマクロの目的とする考え方を理解した上で、手動で行うことをお勧めします。

'----
以下のマクロは、見えない名前の登録の削除を確実にさせるものではありません。また、VBEditor 画面は、閉じて行ってください。最初のAdd_Button で、ワークシートのボタンが作られ、そこで、マクロを実行させます。問題のファイルは実行した後、保存し再度開いて、再度、マクロを実行ってください。

実行させた後、一度、ファイルを保存して閉じます。再度、ファイルを開けて試します。不要になったボタンは削除して構いません。

'//
Sub Add_Button()
'ボタン登録
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
 With ActiveCell
  If .Value <> "" Then
   MsgBox "データのない所に置いて実行してください。", vbExclamation
   Exit Sub
  End If
  x1 = .Left
  y1 = .Top
  x2 = .Offset(, 2).Left
  y2 = .Offset(1).Top
 End With
 With ActiveSheet.Buttons.Add(x1, y1, x2 - x1, y2 - y1)
  .OnAction = "'" & ThisWorkbook.Name & "'!ErrNames_DeleteButton"
  .Text = "不良名前削除"
 End With
End Sub
Private Sub ErrNames_DeleteButton()
 Dim cnt As Long
 Dim c As Range
 Dim n As Name
 Dim msg As String
 Dim msg2 As String
 If ErrNameCheck() = 0 Then
  msg = "現在は、エラーの[名前定義]は見つかりません。"
 End If
 If msg <> "" Then
  msg2 = PossibleErrNameCheck()
  Call PossibleErrNameCheck2
  If msg2 <> "" Then
   MsgBox msg & vbCrLf & "しかし、名前:" & msg2 & "は安全ではありません。", vbExclamation
  Else
   MsgBox msg
  End If
  Exit Sub
 End If
 On Error Resume Next
 With ActiveSheet
  For Each c In .UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
   Debug.Print c.Address; Tab
   c.Delete
  Next c
 End With
 With ActiveWorkbook
  For Each n In .Names
   If IsError(Evaluate(n.Value)) Then
    n.Delete
   End If
  Next
 End With
 For Each n In ActiveWorkbook.Names
  If n.Name Like "_xlfn*" Then
   Application.SendKeys "%D{ENTER}", True
   Application.Dialogs(xlDialogNameManager).Show
   Exit For
  End If
 Next n
 For Each n In ActiveWorkbook.Names
  If n.Visible = False Then
   n.Visible = True
  End If
 Next n
 MsgBox "再度・ボタンを押して試してください。" & vbCrLf _
 & "一旦保存し、再度開くと、もしかしたら、復活しているかもしれません。", vbInformation
 
End Sub
Private Function ErrNameCheck() As Long
Dim n As Name
Dim cnt As Long
For Each n In ActiveWorkbook.Names
 If n.Visible = False Then
  n.Visible = True
 End If
 If n.Name Like "_xlfn*" Then
  cnt = cnt + 1
 End If
Next n
ErrNameCheck = cnt
End Function
Private Function PossibleErrNameCheck() As String
Dim n As Name
Dim r As Range
Dim r2 As Range
Dim buf As String
For Each n In ActiveWorkbook.Names
   On Error Resume Next
    If n.RefersToRange.Parent Is ActiveSheet Then
    Set r = n.RefersToRange.Precedents
    Set r2 = r.SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0
    End If
    If Not r2 Is Nothing Then
     buf = buf & ", " & n.Name & ":" & r.Address
    End If
    Set r2 = Nothing
Next n
PossibleErrNameCheck = Mid(buf, 2)
End Function
Private Function PossibleErrNameCheck2() As String
Dim n As Name
Dim f As Variant
Dim Funcs As Variant
Dim buf As String
Const NewFUNCS = "AVERAGEIF,AVERAGEIFS,COUNTIFS,IFERROR,SUMIFS"
Funcs = Split(NewFUNCS, ",")
For Each n In ActiveWorkbook.Names
 For Each f In Funcs
  If InStr(1, n.RefersToRange(1, 1).Formula, f, 1) > 1 Then
   buf = buf & vbCrLf & n & ": " & f
   n.RefersToRange(1, 1).Formula = "'" & n.RefersToRange(1, 1).Formula
  End If
 Next f
Next n
 PossibleErrNameCheck2 = Mid(buf, 2)
End Function
'///
この回答への補足あり
    • good
    • 0
この回答へのお礼

長く難しいコードどうもありがとうございました。

お礼日時:2015/07/12 15:28

こんにちは。



最終的には、IFERROR関数が、問題を引き起こしているようです。Excel 2007以降、同じ問題がずっと続いているようで、バグの類であると私は考えています。この関数を使った[名前の登録]にエラーが発生すると、見えないオブジェクトの_xlfn.IFERROR が発生し、表面化するということで、関数を使う限りは、#3のマクロで、一応は消えている状態になっているということです。エラー値が生じていなければ、問題はありません。

互換性チェックをして、バージョンダウンした数式を使うなら、せっかくの上位バージョンを使う意味もなくなってしまいます。

もし、このエラーが、どんどん増えたとしたら、メモリ枠を使いきってしまいます。Excelのメモリというのは、それぞれの機能で割り振りされていますから、全体のメモリがあっても、個々の書式にしても、マクロにしても、それほど大きくはありません。したがって、トラブルの発生の元にはなりますでしょう。

あまり、スッキリとした解決方法ではなかったのですが、私自身、いずれ、再び、この問題に直面する時が来るかもしれません。
    • good
    • 0
この回答へのお礼

やはりバグなんですかね?
一応は、これで解決ということとして今回は終わります。
当初は、この名前を削除すれば解決と安易に考えていましたが意外と難しい問題だったようでお手数をおかけしました。
今回はどうもありがとうございました。

お礼日時:2015/07/12 15:27

xlfnで検索すると以下のサイトが見つかります。


https://support.office.com/ja-jp/article/%e5%95% …

これによると現在実行中の Excel バージョンではサポートされていない関数が含まれています
とありますので拡張子がxlsで作成されているファイルなのではないでしょうか?
この回答への補足あり
    • good
    • 0

この同様の質問は、以前、私(WindFaller) が答えています。


http://oshiete.goo.ne.jp/qa/8872886.html

思ってもみない問題ですが、もう誰が言ったのか、私が言ったのか、すでに私の教訓のひとつですが、

※「名前の登録(見えないオブジェクト)」問題は、マクロでなければ解決しないことと、手動でなければ解決しないことと、二種類あるということです。

今回は、その別編の手動でなければ解決しないこと、のようです。(マクロでの処理は考えていません。)

私の手順を試してみて、ダメだったら、また返事ください。なお、私のExcel 2010で行っております。
もし、(1) の場所がすぐに特定できるなら、(2)に飛んで構いません。

(1) ファイル・タブから、[共有の準備]→[互換性のチェツク]を起動してください。
「機能の大幅の損失
「このブック内の一部の関数は、Excel 2007 より前のバージョンでは使用できません。……」
と出てきますので、「検索」をクリックして、その場所を特定してください。

---------------------------------------------------
(2)  この[名前の登録]の「アドレス」と[名前の登録]の「名前」を新たに設置するなら、数式を書き換えなくてはなりません。

例:
=IFERROR(SUM(C1:C50),"Error")
    ↓
=IF(ISERROR(SUM(C1:C50)),"Error",SUM(C1:C50))
言い換えると、#NAME? のエラーを取り去ることです。

(3) 次に、手動ですが、数式グループ-[名前の管理]-
_xlfn.IFERROR  #NAME?
を選択して削除-閉じる

一度、以下の検索用のマクロを試してみました。
Sub Find_InvisibleNames()
出てきません。(念のための確認で、ここでの必要性はあまり高くありません)

保存して、再起動し、もう一度確認しました。
私が使った検査用のマクロ
'//
Sub Find_InvisibleNames()
Dim n As Name
For Each n In ActiveWorkbook.Names
 If n.Visible = False Then
  n.Visible = True
 End If
 If n.Name Like "_xlfn*" Then
  MsgBox n.Name, vbExclamation
 End If
Next
End Sub
'///

メッセージが出てこなければ、この問題は解決になります。
---------------------------------

この問題を発生するのは、以下のような関数があります。
AVERAGEIF、AVERAGEIFS、CUBEKPIMEMBER、CUBEMEMBER、CUBEMEMBERPROPERTY、CUBERANKEDMEMBER、CUBESET、CUBESETCOUNT、CUBEVALUE、COUNTIFS、IFERROR、SUMIFS
などがあるそうです。

Excelの作業自体が、マクロだけで処理できるなら、[名前の登録]とは、共存させないほうがよいようです。
参考にした所:
https://support.office.com/ja-jp/article/%e5%95% …
「エクセル2013vbaで、見えない名前の」の回答画像1
この回答への補足あり
    • good
    • 0

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

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

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

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

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

Q名前を一括削除するマクロ

次のようなマクロを組んで、エクセルファイル上の「名前」を一括削除しようとしています。

For Each objName In ActiveWorkbook.Names
objName.Delete
Next

実行すると
「実行時エラー"1004":その名前は正しくありません」
というエラーになってしまいます。
名前を一括削除する方法、またはエラーの解決方法がわかれば教えてください。

環境:WindowsXP+Excel2003

Aベストアンサー

こんばんは。Wendy02です。

>ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか?

確か、個人間のやり取りは、ここでは禁止されていたはずなので、申し訳ありませんが、それはできません。

「実行時エラー"1004":その名前は正しくありません」

やっと、そのエラーを確認できました。私は、勘違いをしていました。それは、マクロのコード側からではなくて、Excelのワークシート側からでした。

マクロでは、たぶん削除できないと思いますので、

Sub test3()
Dim objName As Object
For Each objName In Application.Names
   objName.Visible =True
Next
End Sub

としてみて、挿入-名前-定義 で確認して、手動で削除してみてください。

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Qエクセルvbaで、開いている名前の管理画面を自動で閉じるには?

お世話になってます。
Excel2013で、以下のようなコードがあります。これは、全体のごく一部を抜き出したものですが、これがないと思ったような動きにならないのですが、途中
Application.Dialogs(xlDialogNameManager).Show
で、名前の管理画面を呼びだしています。呼び出しますが、今の所、実際は何もせずに閉じています。
ですが、この部分をコメントアウトするとなぜかその後の結果が違ってくるので必要なのですが、この名前の管理画面を自動で閉じることはできるでしょうか?
また、どうして名前の管理画面を開いて閉じるだけで結果に違いがでるのでしょうか?
ついでに、その前の、Application.SendKeys "%D{ENTER}", Trueでは、何をしているのでしょうか?

Sub sample()
Dim n As Name
For Each n In ActiveWorkbook.Names
If n.Name Like "_xlfn*" Then
Application.SendKeys "%D{ENTER}", True
Application.Dialogs(xlDialogNameManager).Show
Exit For
End If
Next n
End Sub

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

お世話になってます。
Excel2013で、以下のようなコードがあります。これは、全体のごく一部を抜き出したものですが、これがないと思ったような動きにならないのですが、途中
Application.Dialogs(xlDialogNameManager).Show
で、名前の管理画面を呼びだしています。呼び出しますが、今の所、実際は何もせずに閉じています。
ですが、この部分をコメントアウトするとなぜかその後の結果が違ってくるので必要なのですが、この名前の管理画面を自動で閉じることはできるでしょうか?
また、どうして名前の管理...続きを読む

Aベストアンサー

こんにちは

よくわかっていませんが、ちょっと調べてみました。

SendKeysはキー入力をシュミレートするものです。
"%D{ENTER}"はAlt+D、enterキーの入力を意味しますので、全体では"_xlfn*"に該当する名前があったら、削除するという操作と同じことを行っていることになります。
https://msdn.microsoft.com/ja-jp/library/office/ff821075.aspx

意味として何をやっているかというと、(↓)で論議されているようなことが目的と思われます。
(質問文にはご提示の無い、他の部分の処理との関係で必要なのかと推測されます)
https://oshiete.goo.ne.jp/qa/9019000.html

上記に削除の方法も出ているみたいですが、単純に名前の削除ではできないのかな?
見えない名前ということなので扱いにくいし、試験的に発生させることもうまくできないのでキチンと試せてはいないのですが、以下のどちらかで対応できるのではないでしょうか。

1)ダイアログを閉じるメソッドが見当たらないので、キー操作から閉じる
 タブ+エンターを追加して
 Application.SendKeys "%D{ENTER}", True
      ↓
 Application.SendKeys "%D{ENTER}{TAB}{ENTER}", True
に変更。
 ダイアログがちらりと見えますが、閉じるのではないでしょうか?
 (通常の名前定義ではテストしています。)

2)ダイアログを用いず名前の削除メソッドで削除
 ActiveWorkbook.Names(n.Name).Delete
 こちらも通常の名前ではテストしていますが、問題となっている見えない名前が削除できるのかは不明です。

※ 両方ともうまくいかない場合は、上記の既存回答に出ている削除方法を試してみるのがよろしいかと思います。
(若干長いコードですが・・・)

こんにちは

よくわかっていませんが、ちょっと調べてみました。

SendKeysはキー入力をシュミレートするものです。
"%D{ENTER}"はAlt+D、enterキーの入力を意味しますので、全体では"_xlfn*"に該当する名前があったら、削除するという操作と同じことを行っていることになります。
https://msdn.microsoft.com/ja-jp/library/office/ff821075.aspx

意味として何をやっているかというと、(↓)で論議されているようなことが目的と思われます。
(質問文にはご提示の無い、他の部分の処理との関係で必要なのか...続きを読む

Qエクセルで名前を削除するときに印刷範囲を削除しない方法について

下記のマクロでエクセル内の名前を一括でいつも削除しています。印刷範囲を設定していると、「Print_Area」という名前が設定されており、これも削除されてしまうので、印刷範囲の設定がなくなってしまいます。
印刷範囲を消さないようにするにはどうしたらいいでしょうか?
---
Sub NameDel()
Dim nm As Name
For Each nm In ActiveWorkbook.Names
nm.Delete
Next
End Sub

Aベストアンサー

例えばこんなマクロでも

Sub NameDel()
Dim nm As Name
 For Each nm In ActiveWorkbook.Names
  If InStr(nm.Name, "Print_Area") = 0 Then
   nm.Delete
  End If
 Next
End Sub

でも過去の質問例を見ていると、エクセルが勝手に「定義」した「名前」が存在する場合があり、その「名前」をDeleteしようとするとエラーになるそうなので
  On Error Resume Next
を入れておく方がよいかもしれません

Qエクセル2003 IFERROR関数がない?

いつも回答して頂きとても感謝しています。

以前ここで教えてもらった関数を会社で打ち込んだ所、NAMEとなり結果NGとなりました。どこかでスペルが間違っているのかと思い、よく見直したところの所、IFERRORだけ小文字のままでした。IFERRORって2003は対応していないようです。

下の式ですが、IFERRORの箇所を2003でもいける様にして欲しいのですが・・・。宜しくお願い致します。


=IFERROR(SUMPRODUCT(SUMIF(B4:B13,B18:B27,OFFSET(C4:C13,0,MATCH(LEFT(S2,3),{"ABN","×","ABS","×","ABJ","×","ABX"},0)-COUNTIF(B18:B27,"天井交換")))),0)*24

Aベストアンサー

今ある計算式をまるごとISERRORに詰め込むような、無駄な計算をするのはナンセンスというモノです。
計算式中の一体どの部分がエラーになると困るのか、考えて作成してみます。

例えば:
=IF(OR({"ANB","ABS","ABJ","ABX"}=LEFT(S2,3)),SUMPRODUCT(SUMIF(B4:B13,B18:B27,OFFSET(C4:C13,0,MATCH(LEFT(S2,3),{"ABN","×","ABS","×","ABJ","×","ABX"},0)-COUNTIF(B18:B27,"天井交換")))),0)*24

QVBAでブックを非表示で開いて処理して閉じる方法

エクセルVBAで質問なのですが、別のブックを非表示で開いて処理をし、処理が終わったらそのブックを閉じるマクロを作りたいです。

ネットで方法をたくさん調べたのですが、うまくいきません。
ActiveWindow.Visible = Falseを使うと非表示でブックを開くのですが、次の処理をしようとすると非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。

どなたか良い方法をご存じないでしょうか?


↓今作ろうとしているマクロを参考に書いておきます。

ブックA内に書かれているブックBを非表示で開く

処理(ブックBのシート内の表に記入漏れの空白セルがあればブックAに空白セルの番地を表示させる)

ブックBを非表示のまま閉じる


非表示にせずにブックBを開けばうまく処理が完了するのですが、ActiveWindow.Visible = Falseを入れて非表示でブックBを開くと処理が開始しないという状況です。

Aベストアンサー

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いますが…)

Sub sample()
 Dim wb As Workbook, c As Range
 Dim str As String

 str = ""
 Set wb = Workbooks.Open(ThisWorkbook.Path & "\TestBook.xlsm")
 Windows(wb.Name).Visible = False

 For Each c In wb.Worksheets(1).Range("A1:C20")
  If c = Empty Then
   If str <> "" Then str = str & " , "
   str = str & c.Address
  End If
 Next c
 wb.Close SaveChanges:=False

 MsgBox str
End Sub

※ わざわざ『非表示』に設定しなくても、現在のウィンドウをアクティブにすることで、新しく開いたウィンドウを(裏側に)隠すこともできますね。

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いま...続きを読む

QVBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。

マクロを含むエクセル(EXCEL2000)をHTMLのページからハイパーリンクで呼び出しています。そのエクセルでボタン操作に従い罫線やセルの着色を行っています。しかし、着色結果が更新されません。スクロールバー等で画面を移動すると正しく着色されています。このエクセルを通常に起動した場合は、問題なく動作するのですが、シート全体を更新する方法を教えて下さい。
各関数では、以下のスクリーンアップデータの処理を入れています。
Application.ScreenUpdating = False
    (処理)
Application.ScreenUpdating = False

Aベストアンサー

たぶん、EXCEL独特の問題だと思うのですが、HTML の場合、すでに色の部分を表面上で使用しているので、それでメモリが占有させているのではないかと私は思っています。

他にも、

 ActiveWorkbook.HTMLProject.RefreshDocument True

というのがありますね。
ホスト アプリケーション内のブックに含まれる HTML プロジェクトを更新する、というのがありますね。

QExcel 他のファイルからシートをコピー 名前の定義を引き継がない。

こんにちは、
・EXCELで他で作ったファイルのシートがあります。(シート1)
・シート1には、いろいろと名前が定義されています。

シート1をコピーした際に名前の定義が引き継がれないようにするにはどうすればいいのでしょうか?

何かお分かりの方がいましたら教えてください。よろしくお願いします。

Aベストアンサー

メニューの「編集」から「シートの移動またはコピー」でコピーされたのですね?

こうしてみてください。
1.シート1のA1セルの左上の四角をクリックして全セル選択
2.コピー
3.コピー先のA1セルを選択
4.貼り付け

これで、数式や書式しかコピーペーストされないと思います。

Qエクセル関数で日付かどうかの確認?

ワークシート関数でセル内が日付かどうか調べるものはないでしょうか?
VBAのIsDateなら存じておりますが。

Aベストアンサー

日付を表すデータは、セルの値としては、単なる数値なのですが、どういう種類のセルの書式が設定されているかを調べることはできます。
調べたいセルがA1だとして
=cell("format",A1)

"D1"になれば概ね日付だと判別できます。
時刻を含めたものにする場合は、
Dで始まることをチェックすればいいかも。
詳しくは、CELL関数のヘルプを参照してください。

Qエクセルの名前定義の一括削除の方法

会社に数年前からあるエクセルファイルなのですが、
全てのセルに1,300以上の名前が定義されています。

これらの全てのセルの「名前の定義」を一括で削除することは可能ですか?

これらの定義があるがために、その他ファイルからのコピーがうまくできません。

Aベストアンサー

VBAを使えば可能だと思います。
[Alt+F11]でVisual Basei Editorを起動し、
[ThisWorkbook]の中にでも以下のコードをコピペして
[標準]ツールバーの中にある、右向き△ボタン([Sub/ユーザーフォームの実行])を押します。

Sub 名前定義一括削除()
 Dim objName As Name
 For Each objName In ActiveWorkbook.Names
  objName.Delete
 Next objName
End Sub

なお、VBAを実行して変更した分は「元に戻す」機能がききませんので
あらかじめファイルのバックアップをとっておくとよいでしょう。
成功したら、上のコードはDeleteで消去してください。


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

人気Q&Aランキング