Excel2010でcaptionと表示名の不一致について

このQ&Aのポイント
  • Excel2010のwindowsオブジェクトのcaptionと表示名が一致しない問題について質問です。具体的には、wd.Captionの値とエクセルで表示される名前が異なることを確認しています。
  • wd.Captionの値を確認したところ、[GIP]エクセルシート・・・.xlsと表示されるべき部分が(GIP)エクセルシート・・・.xlsと表示されています。
  • エクセル内のウィンドウの左上に表示される名前は[GIP]エクセルシート・・・.xlsですが、なぜcaptionの値だけが違っているのかわかりません。何か制約事項があるのでしょうか。
回答を見る
  • ベストアンサー

captionの値と実際の表示名が合わない

Excel2010で以下のようにwindowsオブジェクトのcaption判定をしているのですが、 エクセルで表示される名前とcaptionの値が不一致になります。 wd.Captionの値をwatchしたところ、 wd.Caption:(GIP)エクセルシート・・・・.xls wName :[GIP]エクセルシート と、”[]”が”()”に変わってました。 エクセル内のウィンドウの左上で表示されるのは、[GIP]エクセルシート・・・.xlsと 表示されてるのですが、何故かcaptionの値だけ違っており、見つけることができません。 何か制約事項があるのでしょうか。 '検索ウィンドウ名 wName="[GIP]エクセルシート" 'ウィンドウ発見フラグ wdflag = False For Each wd In Windows If InStr(wd.Caption, wName) > 0 Then wbn = wd.Caption wdflag = True Exit For End If Next If wdflag = False Then MsgBox "ウィンドウがみつかりません。", vbCritical + vbOKOnly, "Not found!!!" Exit Sub End If

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 この件の問題点は、不適切なブック名にあります。 決してバグではありませんし、VBAというよりは、Excelの仕様に関わります。 ファイル名はユーザーの好き勝手に付けられるものではなくて OS:オペレーティングシステム Excel:アプリケーション それぞれに命名規則があるということはご理解頂けるものと思います。 この場合は、Excelのブック名には用いることの出来ない文字 "["と"]"が使われていることが問題になります。 Excelにとって角括弧は、数式上で別のブックを参照する際に、 [ブック名]のように表記し、「角括弧の内側にブック名を記してある」 というように、特別な意味を持つ記号です。 実際、XL2010で、新規のブックを[名前を付けて保存]する際に、 [GIP]エクセルシート.xls という名前を指定しようとすると、警告ダイアログが表示されて  ファイルにアクセスできませんでした。次のいずれかを行ってみてください。  ・ 指定したフォルダがあることを確認します。  ・ ファイルを含むフォルダが読み取り専用になっていないことを確認します。  ・ 指定したファイルの名前に次のいずれかの文字も含まれていないことを確認します : < > ? [ ] : | *  ・ ファイル名およびパス名が半角で 218 文字より長くないことを確認します。 と表示されます。 つまり、角括弧を使ったブック名を指定して保存することを禁じています。 ブック名に角括弧を指定できるのは、エクスプローラから直接ファイル名を書き換えた場合になります。 [GIP]エクセルシート.xlsと名前を変更したなら、ブックを開くことも参照することも可能ですが、 他のブックから数式で参照する場合でも、 ='[(GIP)エクセルシート.xls]Sheet1'!A1 のように、別のブックを参照していることを示す角括弧と明確に区別をする意味で、 ブック名にある角括弧[]を括弧()に置換して表示することになります。 そうしなければ、システムとして正常に機能しない、ということは、理解できると思います。 ウィンドウのキャプションは、 表示する文字列自体が何らかの制御に関連付けられている訳ではありませんから、 忠実に文字列としてのファイル名を表示しますが、 内部的には、制御(約物)記号である角括弧[]を括弧()に置換しています。 以上の理由から、ご提示の記述については、 アプリケーションの仕様に合わせる形で、 wName="(GIP)エクセルシート" のように括弧()に置換した上で検索するしかありません。 尚、 [GIP]エクセルシート.xls というブックと (GIP)エクセルシート.xls というブックとをExcel2010は判別しませんし、 同時に開くこともできません。 また、 [GIP]エクセルシート.xls というブックをそのままの名前で上書き保存することは出来ますが、 他のフォルダ等に同じ名前で[名前を付けて保存]しようとしても、 候補として表示されるのは、 (GIP)エクセルシート.xls になります。 私からの説明としては以上です。 納得いかない面もあるかと思いますが、何分にも仕様上のことですので ありのまま理解につとめてくださいませ。⁓

kyolly
質問者

お礼

丁寧な説明ありがとうございます。 該当ブックを保存したのが自分ではないために、エクセルから保存したのか、エクスプローラからファイル名だけを変更したのかわからない(恐らくは後者)のですが、エクセルの仕様であるということがはっきりしただけでOKです。 何らか判定、取得方法が間違ってるかと思ったので質問させて頂きました。 []を()で読み替えるようにしたいと思います。

その他の回答 (1)

回答No.2

こんばんは。 >[GIP]エクセルシート・・・.xlsと >表示されてるのですが、何故かcaptionの値だけ違っており、見つけることができません。 >何か制約事項があるのでしょうか。 基本的には、ファイル名の規則として、Excelでは、[] 角括弧は使えないはずです。それは、#1さんが書いているとおりですが、ただ、正直なところは、意図的にCaptionを変えているとか、そのあたりは、ご質問者側の事情だろうし、それを質問されても、こちら側では分かりません。 >Excel2010で以下のようにwindowsオブジェクトのcaption判定をしているのですが、 もうひとつは、マクロをみると、ファイル(ブック名)名を検索しないで、Window のCaption名を検索するのはなぜか、今ひとつ理解できません。ありえないコードはあるものの、一般的ではありません。ExcelのWindow は、一つのブックにいくつも存在するものですから、通常、Workbooks で、ループして、その中でNameを取るなどします。キャプションを取るのは、コントロール・オブジェクトがほとんどです。(ただし、私個人は、違う書き方をすることもあります。) 後は、お決まりなのですが、 >For Each wd In Windows ではなく、WorkbookのWindowのCaption を探すのではないかと思います。 元のマクロとおなじようでいて、違います。 For Each wb In Workbooks で、wb.Windows(1).Captionを取るなり、Book名を取るなり、どちらかだと思います。(wd は、Word と見間違うので変えました) >wName="[GIP]エクセルシート" 調べるのでしたら、最初に、ローカルウィンドウやマクロでキャプションやブック名で、名前の確認を取ってからでもよいのではないでしょうか? 別に、こちらの書いた内容を無視しても構いませんが、もし、その事情が正しいなら、別なマクロが最初に動いているかもしれません。 少なくとも、今のところ、「、”[]”が”()”に変わってました」という再現性が得られませんでした。

kyolly
質問者

お礼

ご回答ありがとうございます。 >ファイル(ブック名)名を検索しないで、Window のCaption名を検索するのはなぜか、今ひとつ理解できません。ありえないコードはあるものの、一般的ではありません。 開いているファイルを検索するのにWindowsを使いましたが、これは一般的ではないのですね。 勉強不足ですね。ご指摘ありがとうございます。

関連するQ&A

  • セルの値をワークシート名にする(エクセル2013)

    インストラクターのネタ帳さんより http://www.relief.jp/itnote/archives/003382.php 下記「セルの値をワークシート名にする?Worksheet_Change」 を拝借し利用させていただこうと思いましたが ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "H1" Then ActiveSheet.Name = Range("H1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のH1セルの値はシート名にできません。" End Sub ---------------------- はそのまま出来るのですが、 H1セルにデータの入力規則:リストを指定しますと エラーとなりシート名が変わりません sheet1のリストA1:A50をsheet2のH1セルにリスト表示させ その表示名をそのままシート名に出来ませんでしょうか? ---------------------- Sub copy Range("H1").Copy Range("P1") End Sub ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "P1" Then ActiveSheet.Name = Range("P1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のP41セルの値はシート名にできません。" End Sub ---------------------- としてH1のセルをP1にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

  • エクセルVBA 呼出し

    エクセルVBA 呼出し FormをひらいてTextBox31に数字(ID番号)が入り それをSheet”計”のF4に入れます! そのF4を他のブックの WSName = "DATA.xls"にて IDを検索して、名前や色々なものをSheet”計”に写します。 それを再度、FromのそれぞれのTextBoxに入れます。 しかし、SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 が上手くできません!!エラー表示などはないのですが… DATA.xlsにはID番号があるのですが、それを入力しても値が入りません どこの部分が間違っているのか? すいません、教えてください WSName = "DATA.xls"を呼出す記述は省略!! 'DATA.xlsとSheet1をセットする。 Set WS = Workbooks(WSName) Set SH1 = WS.Worksheets("Sheet1") 'ブックが存在していないのであればメッセージを出し処理を抜ける。 Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If flag = False For lng = 1 To lngYcnt_K '計のF4と同じ値を見つけてテキストボックスの値を入力。 If CStr(Worksheets("計").Range("F4").Value) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 With Worksheets("計") ’計のSheetの値を開いているFromのTextBox4に再度値を入れる TextBox4.Value = .Range("B2").Value '計のSheetからTextBox1の値の名前’ End With MsgBox " 記録を呼び戻しました" Else TextBox31.Value = "確認必要" End If

  • 【Excel VBA】ワークシートの表示(続き)

    すみません。 追記が出来なかったため、コードの続きをこちらに記載します。 For i = 1 To 12 If actsht = tmp(i) Then Flag = 1 Anser = MsgBox("翌月分シートを作成しますか?", vbYesNo + vbDefaultButton1, "確認") If Anser = vbYes Then ActiveSheet.Copy After:=ActiveSheet ActiveSheet.Name = tmp(i + 1) Sheets(actsht).Tab.ColorIndex = 2 Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value ActiveSheet.Range("A2").Select Exit For ElseIf Anser = vbNo Then Exit For End If End If Next If Flag = O Then MsgBox ("新しいワークシートを作成出来ません。") End If If actsht = tmp(i) Then If Sheets(元データ).Visible = False Then Sheets(元データ).Visible = True End If End If End Sub

  • 二つの行のうち、どちらかが、セルの値がゼロのとき、その列を非表示にする

    二つの行のうち、どちらかが、セルの値がゼロのとき、その列を非表示にする windows7 excelでマクロ作成中の初心者です。 以下のコードで27行目のセルの値が0のとき列を非表示にします。 Private Sub 列非表示_Click() Dim 列番号 As Long 'シートが保護されていたら保護を解除 Worksheets("最新明細").Activate If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If For 列番号 = 4 To 33 If Cells(27, 列番号).Value = 0 Then Cells(27, 列番号).EntireColumn.Hidden = True End If Next 列番号 ActiveSheet.Protect End Sub ------------------------------------------------- Private Sub 列表示_Click() Dim 列番号 As Long 'シートが保護されていたら保護を解除 Worksheets("最新明細").Activate If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If For 列番号 = 4 To 33 If Cells(27, 列番号).Value = 0 Then Cells(27, 列番号).EntireColumn.Hidden = False End If Next 列番号 ActiveSheet.Protect End Sub この27行と、もう一行の28行、どちらかの行が、0のときに列を非表示・表示したいのですが、出来ません。 試行錯誤してもできないのです。どうかよろしくおねがいします。 For 列番号 = 4 To 33 If Cells(27, 列番号).Value = 0 or Cells(28, 列番号).Value = 0 Then or( Cells(27, 列番号).EntireColumn.Hidden = True, Cells(27, 列番号).EntireColumn.Hidden = True) End If

  • VBSでファイル名にシート内のセルの値を付け足す

    現在下記のコードが書いてあるvbsにエクセルファイルをドラック&ドロップをしてパスを外したり、つけたりしています。 その際に、投げ込んだエクセルファイルのファイル名の頭に 投げ込んだエクセルファイルのシート1のセルA1の値を付けたいと考えています。 例 パスのかかっている 間隔.xls というファイルをVBSに投げ込むと パスが外れ ファイル名が あいう間隔.xls という名前に代わって保存される。コピーではなく投げ込んだシートの名前が変わって問題ありません。 あいう はシートのA1セルに入っていた文字です。 ブック内にシートは必ず1つしかありません。 Option Explicit 'Excel 2013 Later Japenese Version Available 'REF: 'REF: '''///---定数の設定Set Enumuragion---///''' Const PWD="paspas" Const msoLanguageIDInstall = 1 '''///---変数の宣言---///''' Dim objArgs, I , strFile Dim objFile, objFolder,objPath,strScr Dim xlApp,Wb Dim objWShell : Set objWShell = Createobject("WScript.Shell") Dim FSO : Set FSO = Createobject("Scripting.FileSystemObject") '''///---ファイル処理開始 Start Document File Conversion---///''' Set objArgs = Wscript.Arguments For I = 0 to objArgs.Count-1 set objFile = FSO.GetFile(cstr(objArgs(I))) If Lcase(Left(FSO.GetExtensionName(objFile.Path) ,3) )="xls" Then Set xlApp =CreateObject("Excel.Application") If xlApp.Version < 14 Then xlApp.Quit: Set xlApp = Nothing:wscript.Quit xlApp.DisplayAlerts=False xlApp.Visible = False set wb=xlapp.WorkBooks.Open(objFile.Path,0,false,,PWd,,True,,false,false,,true,true) if wb.HasPassword=true then wb.Saveas objFile.Path,,"","",False else wb.Saveas objFile.Path,,Pwd,"",False End if wb.close set wb=nothing End If Next xlApp.DisplayAlerts=True xlApp.Quit set xlApp = Nothing このコードをどのように変更すればできますでしょうか?

  • VBSでExcelのオープン確認

    VBSCRIPTでエクセルに書き込むものを作っているのですが・・・ エクセルが開きっぱなしの場合、同じシートが開いて書き込めなかったりなど有りその対策を考えています。 もし開いていたらMsgBoxを出して終了させてしまおうかと思うのですがエクセルが開いているかどうか確認できません・・・ どのようにしたらよいでしょうか? wbCount = objExcel.Workbooks.Count msgbox wbCount myFlag = False for i = 1 to wbCount if objExcel.Workbooks(i).Name = strFilename then myFlag = True Exit for end if next if myFlag = True then msgBox "Open" else msgBox "not Open" end if

  • VBAでWebに値を入力

    VBAでWebに値を入力する操作を考えています。 エクセルシートのA1に入っている値をWeb上に入力する操作なのですが、 以下のコードを実行すると「AllLog.keyword.Value = t」の部分でエラーになります。 googleではkeywordのところを「q」、yahooではkeywordのところを「p」にすれば問題ないのですが、 神奈川中央交通のページではエラーになってしまいます。 なぜですか?? Sub google() Dim objIE As InternetExplorer '参照設定:Microsoft Shell Controls and Automation Dim objShell As Shell Dim WinFlg As Boolean Dim objWin As Object Dim AllLog As Object On Error GoTo EndProcess Set objShell = New Shell For Each objWin In objShell.Windows If TypeName(objWin) = "IWebBrowser2" Then WinFlg = True Set objIE = objWin Exit For End If Next Set objShell = Nothing If WinFlg = False Then MsgBox "IEオブジェクトが取得できません", vbCritical Exit Sub End If EndProcess: If Err() > 0 Then MsgBox Err.Description End If With objIE Set AllLog = .Document.all t = Cells(1, 1) AllLog.keyword.Value = t End With Set objIE = Nothing End Sub

  • 【Excel VBA】シート表示&ボタン操作

    何度もすみません。 シート表示のコードの続きです。 また、別記事で質問していた件(件名の後者)も合わせて コードに組み込んでいます。 Sheets(actsht).Tab.ColorIndex = 2 '当月分のワークシート見出しの色を白に設定する Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value 'ワークシート(Sheet2)のA1セルの値を当月分のワークシートのB3セルに代入 Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value 'ワークシート(Sheet2)のA2セルの値を当月分のワークシートのB4セルに代入 ActiveSheet.Range("A2").Select '翌月分のワークシートのA2セルを選択する Sheets("元データ").Visible = True 'ワークシート(元データ)を表示する Call clear_Click 'フォームボタン(clear)をクリックする Sheets("元データ").Visible = False 'ワークシート(元データ)を非表示にする Exit For 'For文を抜ける ElseIf Anser = vbNo Then 'MsgBoxで"vbNo"を選択した場合 Exit For 'For文を抜ける End If 'If文を終了する End If 'If文を終了する Next 'iの値を1増分する If Flag = O Then 'Flagが0であった場合 MsgBox ("新しいワークシートを作成出来ません。") 'MsgBoxを表示する End If 'If文を終了する End Sub

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

  • エクセル VBAラベル 表示?

    宜しくお願いいたします。 エクセル2000にて Private Sub UserForm_Initialize() Dim TYU As Integer Dim TYUB As Integer For TYU = 3 To 100 If Worksheets("発注履歴").Cells(TYU, 1) = "" Then TYUB = Right(Worksheets("発注履歴").Cells(TYU - 1, 1).Value, 3) Label1.Caption = Format(Date, "yy") & TYUB + 1 Exit For End If Next TYU End sub 上記のようにコードを書き込みました。 ワークシート発注履歴("A3")には注文番号090001が 入力されております。 次回発注時、入力フォームを開いたときに ラベル1に090002を表示しようとしたのですが 092と表示されてしまい 2 のまえの00を表示できません。 どの様に修正すれば宜しいでしょうか?

専門家に質問してみよう