個人事業主の方必見!確定申告のお悩み解決

PHPで作成したプログラムからCSV形式でデータを出力し
MSエクセル2000のVBAで取り込んでいます。

データに「,」があるとデータが分割されてしますため
「""」で囲んだところ上記の問題は解決しました。

しかし、今度は「"」部分でデータが分割される現象が起こっています
エスケープ方法、または他の解決方法はありますでしょうか?


 (1)「あいう,えお」→「あいう」「えお」に分割される
 (2)「"あいう,えお"」→「あいうえお」で問題ない
 (3)「"あい"う,えお"」→「あい」「う,えお」に分割される
 (4)「"あい'う,えお"」→「あい」「う,えお」に分割される
 (5)「あいう"えお」→「あいう"えお」で問題ない

「,」が解決すると「'」「"」問題が生じ、逆も又同じで困っています

以上、ご教授よろしくお願いします

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

A 回答 (3件)

こんばんわ。



ExcelでCSVデータを取り込むと、ご質問の例のようにはなりませんが、「"」(ダブルクォーテーション)、「,」(カンマ)を組み合せたデータでは、意図しない区切りになる事は確かです。

「あいう,えお」→「あいう」「えお」
「"あいう,えお"」→「あいう,えお」
「"あい"う,えお"」→「あいう」「えお"」
「"あい'う,えお"」→「あい'う,えお」
「あいう"えお」→「あいう"えお」

上のようになります。

ご存知と思いますが、CSVデータは、データとデータの区切りに「,」を使っています。
また、Excelでは、データの先頭に「"」があると、「"」を取り込まずに、「"」と「"」の間を文字データとして取り込みます。
そのため、上の左のデータを取り込めば、上の右のようになると思います。
私のパソコン環境(WinXP Pro,Excel2000)では、そうなります。

それを前提に、対策を取るとすれば、データ内の「,」を別の文字に変えておいて、Excelに取り込んだ後に「,」に戻すのはどうでしょう。

例えば、下の右のように「,」を「゜」に変えて置き、Excelに取り込み後、「゜」を「,」に戻す、です。

「あいう,えお」→「あいう゜えお」
「"あいう,えお"」→「"あいう゜えお"」
「"あい"う,えお"」→「"あい"う゜えお"」
「"あい'う,えお"」→「"あい'う゜えお"」

Excelに取り込み後、「,」に戻すコードは、以下の通りです。

Cells.Replace What:="゜", Replacement:=","

もし、「'」が問題になるようでしたら、「'」を「^」に変えて、

「"あい'う,えお"」→「"あい^う゜えお"」

Excelに取り込み後、下のコードで、戻せばよいでしょう。

Cells.Replace What:="゜", Replacement:=","
Cells.Replace What:="^", Replacement:="'"
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます
別の文字に置き換えるで対応しました。

お礼日時:2005/12/20 10:44

(3)「"あい"う,えお"」


"あい""う,えお"
で問題ないと思います。
(4)「"あい'う,えお"」
分割されませんでした。
    • good
    • 0

よくわかりませんが,


「,」ではなく「Tab(\t)」でセル分け(列分け)をすれば良いのではないでしょうか?

どちらもCSVファイルとしてExcelに認識されますよ。

(PHPもVBAもほとんどわかっていない者です。)
    • good
    • 0

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

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

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

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

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

Qシングルクォーテーションを含む文字列の更新

題名のとおりなのですが、データベースに更新するデータに
シングルクォーテーションを含む文字があって、更新時にエラーとなってしまいます。
更新する文字列内にシングルクォーテーションの数が奇数あれば、さらに文字列にシングルクォーテーションを追加して、更新しようとしたんですが、ダメでした。

何か参考になるサイト、解決策をご存知の方、宜しくお願いします。

環境:
OS:WinXPSP2
言語:VB6SP6
DB:SQLServer2000

Aベストアンサー

シングルクオテーションはエスケープしないとダメですよ。
「'」は「''」と2つ続けます。

QエクセルVBAでセル内のシングルクォーテーションを変数に入れる方法

例えば、エクセルでセル内に「007」という文字を入力したい場合、そのまま入力すると「3」のみが表示されることになるので、「'007」というふうに、シングルクォーテーションを先頭に入れると思います。

そういう先頭にシングルクォーテーションが入っているセルをVBAで変数に格納するとシングルクォーテーションがとれた状態の文字列が変数に入ってしまうのですが、シングルクォーテーション込みで変数化する方法を教えて下さい。もしくは、セルの属性?みたいなものがあり、それを変数として取り出せるなら、そういう方法でもOKです。
ちなみに、NumberFormatLocalではシングルクォーテーションは取り出せませんでした。

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


---
エクセル2003
win7

Aベストアンサー

こんばんは。

こんな感じでどうでしょ。対象はCells(1,1)で。

Sub サンプル()
Dim Tmp As String
Dim i As Long
Tmp = sq付与(Cells(1, 1))
i = MsgBox(Tmp)
End Sub

Function sq付与(Arg As Variant) As Variant
If Arg.PrefixCharacter = "'" Then
sq付与 = "'" & Arg.Text
Else
sq付与 = Arg
End If
End Function

いやー久々に回答しましたー。

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

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

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

Aベストアンサー

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

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

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QVBAでfor文の中で、continueしたい

お世話になります。
VBAのfor文の中で、ある条件に合致したら、for の先頭に戻りたいのですが、
方法が分かりません。

VB.net 等の「 Continue For」に当たるものは、VBAに
ないのでしょうか?

何卒宜しくお願いします。

Aベストアンサー

Continue For は昔の VB6 までに物には実装されていませんね VB6 使いの私は知らなかった

for の先頭に戻りたいのではなく、 Next の直前に飛びたいのですよね?
幸いにも VBA には Goto ステートメントがありますので

Sub Sample1()
For i = 1 To 10
If 意除外条件 Then GoTo Next_no_mae

通常の総理

Next_no_mae:

Next i

End Sub

じゃダメですか?
これなら For の直後に飛ぶ事も可能ですが

もしくはこれぐらいしか対処方法はないのでは?
Sub Sample2()

For i = 1 To 10
If 除外条件 Then
Else
通常の総理
End If
Next i

End Sub

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


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

人気Q&Aランキング