• ベストアンサー
  • 困ってます

結合した文字列をファイル名に使えない

Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数587
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.3
noname#22222

結論を先に述べれば、chr(34) 付加しているのが実行されない原因です。 例えば、 Workbooks.Open Filename:="C:\temp\book1.xls" は実行されますが、 Workbooks.Open Filename:="""C:\temp\book1.xls""" は '"C:\temp\book1.xls"' は見つからないとのエラーが出ます。 つまり、この場合、<">がパスとファイル名の一部として認識されています。 ところで、""" は chr(34) の表記の別形式です。 このことは、イミディエイトウィンドウで確認することができます。 [イミディエイトウィンドウ] strA = Chr(34) ? strA " strA = """ ? strA " |C:\temp\book11.xls| +---------+ |"C:\temp\book11.xls"| +----------+ 変数は、C:\temp\book11.xls のみを格納しています。 けっして、"C:\temp\book11.xls" とダブルクーテーションも格納している訳ではないです。 コンピュータは、値を格納する際に<どこにどのように>が判らないと処理できないのです。 ダブルクーテーションは、単に、値を格納する箱のタイプを指示しているだけです。 一旦、格納した値を取り出す時は、中味だけでよいのでダブルクーテーションは不要です。 多分、この辺りの誤解が原因でしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

大変丁寧にご説明いただき疑問が氷解しました。 ご指摘のとおり Chr(34)は不要のようでした。 文字列はとにかく””と頭から決めてかかっていたのがいけませんでした。 ありがとうございました。

関連するQ&A

  • 文字列を特定文字で分割したい

    はじめまして。宜しくお願いします。 現在Access2002のVBAをつかってタイトルのようなことを実現したいと思っています。 Dim a As String Dim b As String という二つの変数を用意して 「C:\Documents and Settings\デスクトップ\test.csv」という文字列が与えられているとき 変数aには「test.csv」を、変数bには「C:\Documents and Settings\デスクトップ\」を 格納しようとしています。 スマートなやり方がわからず、 文字列の右から一文字ずつ比較して行き、何文字目に「¥」が出てくるかをカウントして、right関数とleft関数で分割を行っています。 このような処理を行う場合、なにか適した関数があると思い探しているのですが、 なかなか見つからず、行き詰っています。(そのような関数があるのかも分からず・・) もしもなにかお気づきの方が居られましたら、ご教授宜しくお願いします。

  • 文字列の動的な結合

    C♯、.net frameworkdは2.0の環境です。 メソッドでSQL用の文字列を作っています。 引数によって、JOINするテーブルを変えたいのですが、StringBuilderではなく、 単なるStringの変数を、ひたすら + で結合している状態なので、悩んでいます。 String sql; sql = " select " + " tbl.column1 " + " from " + … こんな感じです。 StringBuilderで作り直したいのですが、諸事情により難しいので、+での文字列結合をしつつ、 ところどころ、引数を見て文字列を結合したりしなかったり…ということをスムーズにできる 方法はないでしょうか?

  • EXCELで文字列を結合して数式を処理したい

    LOOKUP関数を以下のように複数セルにわけて文字列として配置します。 A1:LOOKUP(AL17,'C:\Documents and Settings\My Documents\ファイルA.xls] A2:シート1 A3:'!$A$3:$A$200,'C:\Documents andSettings\My Documents\.xls] A2:シート1 A4:'!$B$3:$B$200) A1からA4までを文字列結合してA5に表示します。 A5:=A1&A2&A3&A2&A4 その上で、A5の数式をA6にて処理したいのですが、うまくいきません。 A6:indirect(A5) のように書いてもエラーとなります。 どなたか打開策を教えてください! #今回はlookup関数の参照するシート名を動的に表現したかったため、   わけて記述し、文字列結合するという形式にしています。   (ここでいうA2がシート名)

その他の回答 (2)

  • 回答No.2

うん、手元ではChr(34)なしでないと動かなかった。 でも 本当にここであってる? >C:\Documents and Settings\デスクトップ\URIAGE.xls C:\Documents and Settings\ユーザー名\デスクトップ\URIAGE.xls が正しいと思うんだけど

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご指摘のとおり Chr(34)は不要のようでした。 パス名については説明上短くしましたが、確かにユーザー名が入っていました。 ありがとうございました。

  • 回答No.1
  • edomin
  • ベストアンサー率32% (327/1003)

外しているかもしれませんが、 文字列を表すために「"」を使用しているだけなので、変数を使用した場合は、「"」(chr(34))はいらないのではないでしょうか? 「"」でくくった文字列を代入しても変数の中には「"」は含まれませんよね。

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご指摘のとおり、「"」(chr(34))は不要のようでした。ありがとうございました。

関連するQ&A

  • VBA 他のPCでも使いたい

    エクセルVBA初心者です。 Workbooks.Open Filename: についてですが 「C:\Documents and Settings\たぬき\デスクトップ\どんぐり.xls」 を開くプログラムは 「C:\Documents and Settings\きつね\デスクトップ\どんぐり.xls」 を開きません。 例えば どんぐりエクセルのセルA1にPC名を代入して、それを利用して ファイルを開く方法とか ファイルの場所をファイル名から返して開く方法があれば教えて下さい。 仕事柄必要となっております。 分かり易くよろしくお願い致します。

  • ☆文字列を抜き取る★

    テキストファイルに GetPoint = ErrMsg("おはよう",target) の行があるとします。 ダブルクオートでくくられた文字列だけを出力させたい場合 下記コードでどこが間違っているでしょうか?? 今のままだと全てのコードが出力になるんですよ。。。 アドバイスをいただけると幸いです。 Sub Main() Dim iFileNumber As Integer iFileNumber = FileSystem.FreeFile() Open "C:temp\sample.txt" For Input As #iFileNumber Dim stResult As String Dim stSerch As String Dim point As Long Do While (Not FileSystem.EOF(iFileNumber)) Dim stBuffer As String Line Input #iFileNumber, stBuffer stResult = stResult & stBuffer & vbNewLine If Instr(stResult,Chr(34)) > 0 Then If Instr(stResult,Chr(34)) > 0 Then v = stResult End If End If Loop Close #iFileNumber End Sub

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

  • VBAでCSVを文字列として取り込む方法

    VBAでCSVを文字列として取り込む方法を教えてください。 下記のようにCSVファイルを取り込んでいます。 Array関数を使用していますが、どうしても文字列として認識してくれません。 Sub CSV取り込み() Dim xlAPP As Application ' Applicationオブジェクト Dim strFILENAME As String ' OPENするファイル名(フルパス) 'Applicationオブジェクト取得 Set xlAPP = Application '「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) 'キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), _ Array(4, 2), Array(6, 2)) Workbooks.Open Filename:=strFILENAME ActiveWorkbook.Sheets(1).Cells.Copy _ Destination:=ThisWorkbook.Worksheets("sheet1").Range("A1") End Sub この書式ではCSVを文字列として取り込めないのでしょうか? どなた様かご教示ください。 よろしくお願いいたします。

  • VBA

    VBAでstrFILENAMEにaaa.xlsを代入したいのですがどうしたらいいのでしょうか? このままだと定義エラーになっていまします。 Dim wbk As Workbook Set wbk = Workbooks.Open(Filename:="C:\Documents and Settings\Administrator\デスクトップ\strFILENAME", ReadOnly:=True)

  • Excelマクロでyyyymmddの変数

    Excelのマクロで他のファイルを呼び出す際、当日や前日(ファイル名:yyyymmdd.xls)のファイルを指定したいのですが、変数を指定する方法を教えてください。 Workbooks.Open Filename:="C:\WINDOWS\デスクトップ\20040215.xls"←これを変数にしたい

  • エクセルVBAでブックを開きたいのですが、

    エクセルVBAでブックを開きたいのですが、 アクティブシートを別のブックに移動させたいのですが、 まず、目的のブックを開く → 移動させたいシート名を右クリック → 移動またはコピー を選択 → 移動先ブック を選択  というふうにしようと思っていますが、 Workbooks.Open Filename:= _ "C:\Documents and Settings\YUMIKO\My Documents\YYYY.xls" のようにファイル名を入れると開くことができました。 が、   Workbooks.Open Filename:= _ "C:\Documents and Settings\YUUKORON\My Documents\Range("F1").Value.xls" のように、アクティブシートの セルF1にファイル名を入れて、開きたいのですが、どうしても開くことができません。いろいろ調べて試しましたが、無理でした。 基本的にマクロで記録で作っている初心者です。 回答よろしくお願いします。

  • VBAでワークブックの名前を変数にして開かせる?

    最近VBAを勉強し始めたばかりです。 面白いですね…。 さて、恐らく基礎なんでしょうけれど、行き詰まっているので是非アドバイスをお願いします。 とりあえず、テキスト見ながら作ったマクロですがダメでした。 目的は対話型?で入力した名前のワークブックの名前を開かせるというものです。 Sub Macro1() Dim mywbname As String Dim mymsg As String, mytitle As String myMgs = "開いて欲しいファイル名を入力してください" mytitle = "ファイルを選択" mywbname = Application.InputBox(Prompt:=myMgs, Title:=mytitle) If mywbname <> "False" Then Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" End If End Sub なんてなものを作ったのですが、mywbnameを変数として受け取ってくれません。なのでそんなファイルはない…なんてことになっています。 構文自体の見直しも含めてアドバイスお願いします。 蛇足かもしれませんが、○○○のところは個人名が入ります。 C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" の箇所のmywbnameを既存のファイル名にしてみるとMgsBoXに適当な文字さえ入れれば、そのファイルは開いたので問題なのはmywbnameを入力した名前に置き換えてくれない部分だと思うのですが、よろしくおねがいします。

  • C:\Documents and Settings\ユーザー名2\適当なフォルダ名へ保存したいのですが・・・。

    C:\Documents and Settings内の個人毎のフォルダにファイルを保存したいのですがどうしてもうまくいきません。 どなたかわかる方、お力を貸していただけないでしょうか? Dim ユーザー名1 As String Dim ユーザー名2 As String ユーザー名1 = Application.UserLibraryPath  ’ユーザー名格納 ユーザー名2 = Mid(ユーザー名1, 27, 8)    ’ユーザー名切出 ChDir "C:\Documents and Settings\ユーザー名2\適当なフォルダ名" ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\ユーザー名2\適当なフォルダ名r\適当なファイル名.xls", FileFormat:= _ xlNormal (変数:ユーザー名2)にうまく代入されない状態です。 変数の宣言がまずいのでしょうか??? 初心者丸出しの書き方で恐縮ですが、どうかお願いいたします。

  • ファイル名の取得ができません

    今VBAでユーザフォームにコンボボックス一個を作りました。本来なら コンボボックスの値を選択し、ボタンを押して対応するファイルを読み込んで必要の値を取得したいですが・・・  今問題になったのは読み込みファイルの名前は固定ではないですが、 うまくファイルの読み込みが出来ません。ファイル名は "作業実績入力表_2009年07月_【山田 太郎】.xls" ,"作業実績入力表_2009年08月_【坂本 太郎】.xls ", "作業実績入力表_2009年09月_【柳 太郎】.xls"いう風になっているけど 月の番号は変わるものですので 普通の方法で指定したら(BaseFileName As String = "作業実績入力表_2009年07月_【山田 太郎】")来月からソースまた変更しないといけない・・ 来月:"作業実績入力表_2009年08月_【山田 太郎】.xls" コンボボックス選択用値は山田 太郎、坂本 太郎、柳 太郎です。 山田 太郎を選択したら”作業実績入力表_2009年07月_【山田 太郎】.xls”のファイルを読み込みたい 名前をどう指定したらいいでしょうか?ご教授のほどよろしくお願いします。 Dim OrgPath As String, Fname As Variant Const BaseFileName As String = "作業実績入力表_2009年07月_【" Const BaseFileName1 As String = "】" Const myPath As String = "C:\Documents and Settings\rin-binyan.HALINC\My Documents\test\" OrgPath = ThisWorkbook.Path If Dir(myPath & BaseFileName & ComboBox2.Value & BaseFileName1 & ".xls") <> "" Then Workbooks.Open myPath & BaseFileName & ComboBox2.Value & BaseFileName1 & ".xls" Else Application.Dialogs(xlDialogOpen).Show (BaseFileName & "*.xls") End If LineEnd: ChDir OrgPath 固定のファイルしか指定できないですが・・・