1 名前:デフォルトの名無しさん [2008/06/04(水) 22:56:59 ] すまんが2の人テンプレやって ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1205231499/l50 ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
976 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:37:56 ] >>974 先にDir勧めろ。 >>975 RFC4180というものがあるにはある。
977 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:38:05 ] RFC 4180
978 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:54:22 ] 基本的に、顧客が好むのが、Excelでひらいたときにどうみえるか。 なんで、 "dataA", "dataB", ... , "dataX" みたいに、""でかこむことになる。 数値解析とかだけのローカル用途なら、囲まんけどな。
979 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:04:47 ] FSOの.Filesでファイル一覧取得して、Right$で.csvだったら、 FSOの.Readallで読み込んで、VBCRLFでSplitして、 配列に入れて配列をカンマで、Split
980 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:09:35 ] プロジェクトのこまごま作業で多かったのがFSOによる再帰ファイル検索だ
981 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:14:27 ] "abc,def","ghi","""" ってな感じのデータに対応しようと思ったら面倒よ、自前でやるのは
982 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 02:00:47 ] FSOでやるなら普通にGetExtensionNameでcsvかどうかを見ればいいんでね?
983 名前:y mailto:sage [2008/08/25(月) 19:17:14 ] >>976 あ、そっちの方が簡単かも... オブジェクト作らないで済みますし。 Const fPath = "(フォルダのパス)" Dim fName As String fName = Dir(fPath, vbNormal) Do While fName <> "" If UCase(fName) Like "*.CSV" Then 'Open 〜 '>>979 の後半みたいな処理 'Close 〜 End If fName = Dir Loop こんなやり方でいいのかな。 CSVデータは、シングルクォーテーション('')で囲まれたタイプのも ざらにあるので意外と厄介ですよね。
984 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:21:21 ] Dir(fPath & "\*.csv", vbNormal) Ifはいらない
985 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:28:40 ] FSOとかつかうと 2008/08/25 20:27:30 みたいなフィールドがtextstream通した時点で 2008/08/25 20:27 とかされるからやめたほうがいいぞ。他にも罠多数。 どうしてもVBAっちゅーんなら、バイナリで読み込んで処理。これしかない。 自作のあるけど、バグあるとはずかしいから公開できん。 結構、考慮するべきパターンあるんで、かなり大きい。
986 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:47:47 ] (っ´▽`)っ もし作るのが業務ソフトウェアなら、許容するCSVの仕様ぐらい決めたら? こういう感じに。ちなみにこれはExcelのCSVの仕様に準じている。 ・カンマ区切り ・ダブルクォーテーション内のカンマは区切りとみなさない。 ・二連続のダブルクォーテーションは、文字としてのダブルクォーテーションと見なす。 (項目にダブルクォーテーションを含めたい場合には、ダブルクォーテーションを2つ打つこと) ・閉じていないダブルクォーテーションはエラー。 入出力は過剰だと思うぐらい明確にしたほうがいい。
987 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:50:39 ] (っ´▽`)っ >>986 に追加。 項目にカンマを含めたければ、ダブルクォーテーションで項目を囲うこと。 (例:"1,000","12,000")
988 名前:967 mailto:sage [2008/08/25(月) 20:52:23 ] ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 1.5 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 これで2003でうまく塗り潰しの無い輪っかが描けたので 会社の2007に組み込んだんだけど、今度は黒塗り潰しに化けてしまいました・・・・ 急遽マクロの記録で輪っかを描いてみたものの、なんと2007では図の挿入あたりの記録はしてくれないようです・・・。 互換性が無いのもむかつくが、マクロ記録も改悪されてるとは実に情けない話と思います。 どなたか、黒丸で中塗り潰しの無い輪っかを2007で実現してくれるコードを教えてください。
989 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:04:19 ] マクロの自動記録でいいんじゃないの
990 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:10:10 ] CSV仕様きめても精確な実装はなかなかむずかしい。 もうほんと想定外の入力がされてたりする。 特に業務でよくあるのが複数行にわたって改行つきのコメントフィールドとか SJISとはかぎらんわけで、難しい。 もうこれでいいだろ、とおもうくらい慎重に実装しても、おれの技術じゃ 100万件のフィールドよむと、たいてい2,3件は、バグにかかる。 で、そっから、その特殊なケースをADHOCに直していくという対応。 例外でたからあとから3件追加しますとか、じゃ納得してくれんし、3年後に でるかもしれないわけで。。。ほんと怖いよ。 一番いいのは、EXCELでCSVをよみこむのはあきらめることじゃ。。。
991 名前:967 mailto:sage [2008/08/25(月) 21:15:57 ] >>989 2007ではマクロの記録をしても、オートシェイプの挿入〜線種変更などをなにも記録してくれないのです。
992 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 21:16:40 ] >>991 (っ´▽`)っ ウォッチウィンドウでそれっぽいプロパティを探せ☆
993 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:54:19 ] >>991 2007で普通に記録できたよ。 ついでに貼っておきますね。 ActiveSheetのオートシェイプを赤にするコード。 Dim sp As Shape For Each sp In ActiveSheet.Shapes With sp sp.Fill.Visible = msoTrue sp.Fill.Solid sp.Fill.ForeColor.SchemeColor = 10 sp.Fill.Transparency = 0# sp.Line.Weight = 0.75 sp.Line.DashStyle = msoLineSolid sp.Line.Style = msoLineSingle sp.Line.Transparency = 0# sp.Line.Visible = msoTrue sp.Line.ForeColor.SchemeColor = 64 sp.Line.BackColor.RGB = RGB(255, 255, 255) End With Next
994 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:03:21 ] これで透明になるよ For Each sp In ActiveSheet.Shapes sp.Fill.Visible = msoFalse Next
995 名前:デフォルトの名無しさん [2008/08/25(月) 22:44:49 ] 999-9999-9999や9999-99-9999の書式で入力された電話番号を (999)-9999-9999や(9999)-99-9999の書式にしたいのですが A=Range("A1").Value B=Find("-",A,1) -の位置 C=Left(A,B-1) -の前だけ抽出 D=Mid(A,B,Len(A)-B+1) -の後ろを抽出 求める文字列="(" & C & ")" & D 関数だとこんな感じだけど、VBAではどうやりますか?
996 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:45:45 ] うちはXMLに統一してるんでCSV時代のトラブルは一切無くなったな。
997 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:46:41 ] >>995 InStr
998 名前:y mailto:sage [2008/08/25(月) 22:57:06 ] >>984 ありがとうございます。大文字・小文字を考えなくて済むのでますます楽です。 >>985 まさかそんな罠があるとは...。自分でも実験してみます。
999 名前:デフォルトの名無しさん [2008/08/25(月) 22:59:46 ] ume
1000 名前:デフォルトの名無しさん [2008/08/25(月) 23:01:54 ] 1000
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。