VBAでわからなくなってしまったので質問します

このQ&Aのポイント
  • 初心者なのですが、EXCEL2007で製品Aと製品B~xまでの表を作成しました。製品名Aの表は名前を付けて保存すると「製品名A2456【0506】」となりますが、製品名B~Xの表はファイル名に製品名が反映されません。VBAのコードを共通して使用していますが、なぜこのような現象が起きるのか分かりません。アドバイスをお願いします。
  • VBAで製品名Aの表を作成しています。名前を付けて保存すると、「製品名A2456【0506】」となるようにしたいです。しかし、同じVBAコードを使用して製品名B~Xの表を作成しても、ファイル名に製品名が反映されません。なぜこのような違いが生じるのか分かりません。初心者ですので、アドバイスをお願いします。
  • EXCEL2007で製品Aと製品B~xまでの表を作成しました。製品名Aの表は名前を付けて保存すると「製品名A2456【0506】」となりますが、製品名B~Xの表はファイル名に製品名が反映されません。同じVBAコードを使用しているため、なぜこのような違いが生じるのか分かりません。初心者ですので、教えていただけると助かります。
回答を見る
  • ベストアンサー

VBAでわからなくなってしまったので質問します。

VBAでわからなくなってしまったので質問します。 初心者なのですが、下記の問題にあたってしまい困っています。 製品Aと製品B~xまでEXCEL2007で表を作ってあります。 A~xまで同じVBA構文を使っていますが、 Aは名前を付けて保存すると 製品名A2456【0506】と製品名+コード番号+年月になります。 しかし、B~xは製品名B~Xのみがファイル名になってしまいます。 構文A~xともRangeの参照以外共通で下記です。 Sub 最終保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Flnm = "C:\Documents and Settings\user\My Documents\受検ファイル\受検済み\" '←保存先フォルダ Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 Flnm = Application.GetSaveAsFilename(InitialFileName:=Flnm, _ filefilter:="Excel ファイル (*.xlsx), *.xlsx", Title:="名前を付けて保存") If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm, FileFormat:=xlOpenXMLWorkbook ExitFlg = True End If Loop End Sub Rangeの「B11」が製品名、「G20」がコード番号、「B6」が2010年5月○日という日付になっています。 なお、最初のRange("B11")を取り除くとコード+日付がファイル名になります。 なぜ、製品Aは出来てB~xが出来ないのか分かりません。 アドバイスお願いします。

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

  • ベストアンサー
  • mimeu
  • ベストアンサー率49% (39/79)
回答No.4

No.2 です 少し確認させてください 質問(1) 『Sub 最終保存()』はブックごとに作られているのですか? 質問(2) もし (1) がYesなら、それぞれのVBAコードの中で "B11","G20","B6" はそれぞれ別のセル指定になっているのですか? 質問(3) > なお、最初のRange("B11")を取り除くとコード+日付がファイル名になります。 とは、製品B~x についての事ですか? 質問(4) > Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" は、-4 ではなく -5 (".xlsx" の文字数)ではありませんか? まぁ、ゴク単純な勘違いかチョンボのような気がいたしますが ・・・ (^-^) 私の場合わからないときは、放り出して一晩寝ることにしています。 翌朝おちついてプログラムを眺めると、すぐ原因に気づくことが多くて ・・・

karacom
質問者

お礼

デバックしてみたら見えてきました。すごく単純なミスでした。 VBAの問題ではなくて、セルへの製品名入力時に製品名の後ろに大量のスペースが有りました。 製品名だけで切れてしまっていたのはそのせいでした。製品B以下のファイルがコピペだったので全部outになったのもそのせいでした。 -4も確かに-5の間違いです。 もともと.xlsだったものを.xlsxに変更したときに直し忘れていたものでした。 質問(3)でおかしなことにはたと気づきました(;^ω^) ホント、ごくごく単純なミスでした。 ありがとうございました。

その他の回答 (3)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

まずはどこでコードと日付が消えたのかを調べたらどうですか。 ブレークポイントを設定して、 Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 と Flnm = Application.GetSaveAsFilename(InitialFileName:=Flnm, _ filefilter:="Excel ファイル (*.xlsx), *.xlsx", Title:="名前を付けて保存") の各ステップの実行後のFlnmの内容を見れば原因が分かるのではないですか。 デバッグの仕方を覚えることもプログラムを作る上で重要なことですよ。 ところで、 Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" は、 Flnm = Left(wFlnm, Len(wFlnm) - 5) & wStr & ".xlsx" の間違いでは?

karacom
質問者

お礼

デバックしてみたら見えてきました。すごく単純なミスでした。 VBAの問題ではなくて、セルへの製品名入力時に製品名の後ろに大量のスペースが有りました。 製品名だけで切れてしまっていたのはそのせいでした。 -4も確かに-5の間違いです。 もともと.xlsだったものを.xlsxに変更したときに直し忘れていたものでした。 ありがとうございました。

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.2

No1.さんと同じことを指摘したいのですが、 > Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 ということは、製品コードはセルG20、月日はセルB6に書いてあるという前提ですよね。 それがファイル名に反映されないというのは、 製品B~xについては、セルG20、B6に製品コードと月日が 書いてないからではないでしょうか? この関係を確認すればうまくいきますよ。 余談ですが、変数の宣言はきちんとやった方がいいですよ。 面倒でも Option Explicit を使った方が結局早く目的を実現できます。 wSeq は『Dim wSeq As String』じゃなくて、『Dim wSeq As Integer』 ExitFlg も 『Dim ExitFlg As Boolean』と宣言しましょう。

karacom
質問者

補足

アドバイスありがとうございます。 変数宣言は直しました。 製品コードと日付は入力されています。 また、最初に書きましたが、製品名参照の& Range("B11")を削るとコード+日付で保存ファイル名が出てきます。 製品Aのブックではちゃんと製品名+コード+日付でファイル名が出てくるのに なぜB~xは製品名のみになるのかが分かりません。 Range参照先は各ブックで違いますが、コードと日付は参照しています。 (製品名参照先を削ることでコード+日付が出ることからも分かります)

  • chuchuo
  • ベストアンサー率45% (99/217)
回答No.1

>>構文A~xともRangeの参照以外共通で下記です。 Rangeの参照はそれぞれ違うということですか?

karacom
質問者

補足

早速ありがとうございます。 それぞれ違うブックなので、若干ですが参照セルの位置が違います。 ただ、参照内容は同じです。

関連するQ&A

  • VBAを使って名前をつけて保存をしたい(2)

    Sub 名前を付けて保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Sheets("データー").Select Range("C3").Select ActiveWorkbook.Save Flnm = "\\Jooo\センタ\AA\CC" & Format(Date, "【mmdd】") & ".xls" If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xls" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm ExitFlg = True End If Loop End Sub 先日回答者の方から上記コードを教えてもらい助かっているんですが、少し不都合でてきまして、上記を実行すると最初にCC【1022】という名前でフォルダに保存され、二回目に実行するとCC【1022】(1)という名前で同じフォルダに保存され、三回目に実行するとCC【1022】(2)というように連番で同じフォルダに保存されるんですが、一番最初に保存されたCC【1022】を削除して(どんどんBookが溜まっていくのを防ぐ為)四回目に実行すると【1022】(3)ではなく最初のCC【1022】の名前で保存されてしまいます。【1022】を削除してもCC【1022】(3)で保存されるようにするには、コードをどの様にかえたらいいでしょうか?

  • VBAを使って名前をつけて保存をしたい(3)

    Sub 名前を付けて保存()   Dim wSeq  As String   Dim wStr  As String   Dim Flnm  As String   Dim wFlnm  As String   Dim sI   As Integer   Dim eI   As Integer   Dim wDir  As String   Dim ER   As Boolean   '   Sheets("データー").Select   Range("C3").Select   ActiveWorkbook.Save      wDir = "\\Jooo\センタ\AA\CC\"   Flnm = wDir & Format(Date, "【mmdd】") & ".xls"   wFlnm = Flnm   If Flnm = "False" Then     Exit Sub   End If   '   wSeq = 0   wSeq = Get_Seq(wDir, ER)   If ER Then     wStr = ""   Else     wStr = "(" & wSeq & ")"   End If   Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xls"   ActiveWorkbook.SaveAs Filename:=Flnm   Call Put_Seq(wDir, wSeq) End Sub '連番取得 Function Get_Seq(wDir As String, ER As Boolean) As Integer   Dim n As Long   Dim Seq As Integer   '   ER = False   Seq = 0   On Error GoTo ExitER   n = FreeFile   Open wDir & "連番.dat" For Input As #n   Input #n, Seq   Close #n   Get_Seq = Seq + 1   Exit Function ExitER:   ER = True   Seq = 1   On Error GoTo 0 End Function '連番保存 Function Put_Seq(wDir As String, wSeq As String)   Dim n As Long   n = FreeFile   Open wDir & "連番.dat" For Output As #n   Print #n, wSeq   Close #n End Function 先日回答者の方から上記を教えてもらったんですが、実行すると指定したフォルダに本日の日付+連番の名称でどんどん保存されるんですが (例:一回目実行→【1028】,二回目実行→【1028】(1),三回目実行→【1028】(2),四回目実行→【1029】(3),五回目実行→【1029】(4),※四回目以降は明日に実行した場合です),日付が変わった場合連番を最初からカウントするようにしたいのですが(例の【1029】(3)を【1029】に,【1029】(4)を【1029】(1)というふうに)どの様に上記を変更したらいいでしょうか?

  • VBAエラー

    下のもので、 rangeクラスのselectメソッドが失敗しました がでてしまいます。 ★★★のところで止まってしまいます。 1つ目のエクセルで、ファイル名を入力、検索して開き、8行目でオートフィルタをするマクロです。 オートフィルタのところで止まります。 どこが悪いのか、ご教授いただけませんでしょうか。 よろしくお願い致します。 Sub ファイルを開く()  Dim str As String   Dim nCnt As Integer  Dim sHozon As String  Dim sFilename As String Dim Grp As String If Range("B2").Value <> "バーコード読み取り" Then '保存場所を指定 sHozon = "※※※" Grp = Right(Range("B2"), Len(Range("B2")) - InStr(Range("B2"), "F")) 'ファイル名を設定 sFilename = "AA" & Left(Range("B2"), 10) & ".xls" 'ファイルが存在しているか確認 str = sHozon & "\" & sFilename str = Dir(str) If (str <> sFilename) Then 'ファイルが存在しない場合、エラー MsgBox ("ファイルが存在しません") Else 'ファイルを開く Range("B2").Select Workbooks.Open sHozon & "\" & sFilename End If End If Workbooks(sFilename).Activate Sheets("B").Select ActiveSheet.Unprotect Workbooks(sFilename).Activate Rows("8:8").Select   ★★★ Selection.AutoFilter ActiveSheet.Range("$A$8:$BL$1008").AutoFilter Field:=58, Criteria1:=Grp

  • VBAのハイパーリンクにつきまして

    以前に質問をさせていただき、こちらでベストアンサーを決定した後に急きょ変更があったところがあり、わからなくなってしまいこちらに戻ってきた次第です。 http://okwave.jp/qa/q8743521.html にて質問をさせていただきました内容について、以下のVBAで解決できております。 しかし、抽出したファイル名にハイパーリンクが欲しいという要望を受けてしまいました。 ハイパーリンクのVBAについていろいろ調べましたが、この記述方法に追加して実行する方法が全く分かりませんでした。 お分かりになる方がいましたら、この内容にハイパーリンクをつける方法をお教えいただけますでしょうか。よろしくお願いいたします。 Sub Macro1() Dim i As Long Dim myPath As String, Flnm As String ReDim Flnmfp(0) As String Dim WS1 As worksheet Set WS1=ThisWorkbook.sheets("sheet1") myPath="望みのフォルダパスを入力" Call fpFileName(myPath, Flnmfp ) 'フォルダ内のファイル名取得 If Ubound(Flnmfp)=0 Then 'フォルダにファイルが無ければ終了 Exit Sub End if For i =1 to Ubound(Flnmfp) Workbooks.open filename := Flnmfp(i) Flnm=Dir(Flnmfp(i)) With Workbooks(Flnm).sheets("sheet1") WS1.Cells(2, i).value=.Range("G5").value WS1.Cells(3, i).value=.Range("G6").value WS1.Cells(4, i).value=.Range("K7").value WS1.Cells(5, i).value=CStr(.Range("G9").value) & CStr(.Range("N9").value) & CStr(.Range("P9").value) '同じ要領で望みのセルを記入する WS1.Cells(8, i).value=Flnm End with Workbooks(Flnm).close Savechanges:=False Next i End Sub Sub fpFileName(ByVal myPath As String, ByRef Flnmfp() As String) 'サブフォルダも含め全部のxlsファイル名をフルパスで取得する   Dim cnt As Long, buf As String, f As Object   buf = Dir(myPath & "\*.xls")   Do While buf <> ""     cnt = Ubound(Flnmfp) + 1 ReDim Preserve Flnmfp(cnt)     Flnmfp(cnt)= myPath & "\" & buf     buf = Dir()   Loop   With CreateObject("Scripting.FileSystemObject")     For Each f In .GetFolder(myPath).SubFolders       Call fpFileName(f.Path, Flnmfp)     Next f   End With End Sub

  • エクセルVBAのエラー

    よろしくお願いします。 VBA初心者のものです。 下記のコードを作成しましたが、 アプリケーション定義?がされていません というエラーが出ます。 わかりやすく教えていただけないでしょうか。 修正方法を教えてください。 0901名簿.xlsという名前の ファイルAのsheet1の 情報(ファイルBのセルBD1に日付4桁が記入されている)を ファイルBのセルA1の情報を元にファイルBのセルB1に抽出したい Sub 関数の挿入() Dim i As Long Dim あ As String Dim い As String Dim う As String あ="=VLOOKUP(A1,[" い=Range("BD1") う="名簿.xls]Sheet1!$F:$I,1,0)" For i = 2 To 50 Range("A" & i )= あ & い & う Next i End Sub

  • VBA のコードについて

    すみません、以前にも同じようなご質問をさせて頂いたのですが、どうしても以下のマクロがうまく機能しません。 新しいブックは作成されるのですが、End If以降の検索結果が反映(コビー)されません。 コードに問題があるかアドバイス頂けますと幸いです。 どうぞ宜しくお願いいたします。 Sub sort() Dim i As Long Dim grp As String Dim newBookName As String Dim newBookPath As String Dim newBook As Workbook For i = 2 To 4 LOB = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) newBookName = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) & ".xlsx" newBookPath = ThisWorkbook.Path & "\" & newBookName '指定したパスにファイルが作成済でないかを確認。 If Dir(newBookPath) = "" Then '新しいファイルを作成 Set newBook = Workbooks.Add '新しいファイルをVBAを実行したファイルと同じフォルダ保存 newBook.SaveAs newBookPath Else '既に同名のファイルが存在する場合はメッセージを表示 MsgBox "既に" & newBookName & "というファイルは存在します。" End If With Workbooks("test").Worksheets("マスタ0701").AutoFilterMode = False With .Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).copy Workbooks(grp).Worksheets("Sheet1").Range("A1") '.AutoFilter End With End With Next i End Sub

  • vbaの繰り返し処理について

    vbaです。 Sub Test1() Dim Str As String Dim Pnt1 As Long Dim Pnt2 As Long Str = Range("A1") Pnt1 = InStr(Str, "重 http://") If Pnt1 <= 0 Then Exit Sub Pnt2 = InStr(Pnt1, Str, "要") If Pnt2 <= 0 Then Range("B1") = Mid(Str, Pnt1 + 2) Else Range("B1") = Mid(Str, Pnt1 + 2, Pnt2 - (Pnt1 + 2)) End If End Sub という式でA1からA2.A3と下にURLが入っており空欄になるまで同じ処理をしたいのですがどのように変更すれば作動しますでしょうか?

  • VBAでExcelのセルの一覧からファイル名の変更が

    こんにちは。会社で大量のファイル名を変更していますが、Excelで一覧からを変更できれば能率的なので作っていますが、困っています。下記のものです。 Sub リネーム() Dim i As Long  Dim NEWファイル As String  Dim OLDファイル As String  Dim パス As String For i = 1 To Range("B65536").End(xlUp).Row パス = Cells(2, 1).Value OLDファイル = パス & Cells(i, 2).Value NEWファイル = パス & Cells(i, 3).Value If Dir(OLDファイル) <> "" Then Name OLDファイル As NEWファイル End If Next i End Sub ※A2にはC:\Documents and Settings\M.Co,\デスクトップ\リネームと入っています。B1には変更前の001.jpg、C1には変更するa-1.jpgとファイル名が入っています。実行してもファイル名は変更されません。エラーもでません。よろしくお願いします。

  • エクセル 保存是非のダイアログを出さずに保存VBA

    エクセル 保存是非のダイアログを出さずに保存VBA エクセルファイルの ひとつのブック L.xlsxの特定のセルを 別のブックR.xlsxのセルにコピーするを VBAコードで コピーまでは出来たのですが R.xlsxのブックを保存するかどうかの ダイアログが出てしまいます これが出ないで保存できるように ActiveWorkBook.Save これを入れてもやはり保存是非の確認が 出てしまいます コードは -------------------- Sub ID移動() Dim x As Workbook Dim y As Workbook Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\L.xlsx" Set x = Workbooks("L.xlsx") Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\R.xlsx" Set y = Workbooks("R.xlsx") y.Sheets("sheet1").Range("A2") = x.Sheets("output").Range("B2") x.Close y.Close ActiveWorkBook.Save End Sub ------------------ 保存是非のダイアログがでないで 保存できるための方法を 御教示いただけますか win10 office365 すみませんが 宜しくお願い致します

  • EXCEL-VBAで質問です

    いつもお世話になります。EXCEL-VBAで質問です。 メーカー別・品番別に部品図を管理しており、それをEXCELでデータベース化しています。 ユーザーフォームを作成し、検索&新規入力が出来るようになっておりますが、今回は更にTextBox1に入った品番の該当ファイルを選択した状態で、フォルダを開くようにしたいでのです。 フォルダ構成は、「¥A社¥品番の頭文字¥品種¥ファイル名」が基本となっており、品種フォルダはない場合もあります。 A社¥A¥AAA¥AAA1x3     〃   ¥AAA1x5     ¥AAAB¥AAAB1x10… B社¥1¥1A1B20_250 〃 ¥B¥BC¥BC10x300… このような感じです。品番は英数半角です。 ユーザーフォームのTextBox1には品番が、TextBox3にメーカー名が入るようになっています。 一応、自分で努力はしてみたのですが、品番の頭文字のフォルダを開くことはできましたが、それ以降は動いてくれませんでした。 Private Sub CommandButton3_Click() Dim openpath As String Dim opn As String Dim openmaker As String Dim openfolder As String Dim opensubfolder As String Dim openfile As String Dim i As Long openpath = ThisWorkbook.Path openmaker = TextBox3 openfolder = Left(TextBox1, 1) openfile = TextBox1 & "*" ←拡張子が多数あるので、ワイルドカードにしたいです For i = 1 To 8 ※8というのは適当です。本当は左からアルファベットの文字を数えてループさせようとしたのですが、できませんでした。頭文字が数字の場合はどうすればいいのかも不明… If Mid(TextBox5, i, 1) Like "[A-Za-z]" Then opensubfolder = Left(TextBox1, i) ※品種フォルダがない場合はどうすればいいのでしょうか… End If Next opn = openpath & "\" & "メーカー別" & "\" & openmaker & "\" & openfolder & "\" & opensubfolder   Shell "Explorer /select, & opn & openfile", 1 End Sub お手数ですが、宜しくご教示お願い致します。

専門家に質問してみよう