Excel VBA質問スレ Part7

このエントリーをはてなブックマークに追加
952側近中の側近 ◆0351148456 :2008/08/23(土) 23:01:30
>>943
(っ´▽`)っ
「マクロの記録」で生成されたプログラムだと、
.selectが多くできるけど、これを無くすとかね。
range("A1").select
selection.value = 1

range("A1").value = 1
953側近中の側近 ◆0351148456 :2008/08/23(土) 23:20:09
>>948
(っ´▽`)っ ほ〜れほ〜れ☆
Range(Cells(7, 8), Cells(10, 8)).AutoFill Destination:=Range(Cells(7, 8), Cells(10 + j * 4, 8))
954デフォルトの名無しさん:2008/08/23(土) 23:21:37
>>951
動的には変えませんが、数式はユーザに変えてもらうカスタマイズポイントです
955側近中の側近 ◆0351148456 :2008/08/23(土) 23:30:25
>>954
(っ´▽`)っ
ほうほう。
じゃあ、セルに名前をつけて、それでアクセスするといいかも。
Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1
これだと、C5ってなんだ?ってことになる。ソース上はわからない。
ワークシートのC5を見ればわかるけどね。
たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL1").FormulaR1C1
と書くことができる。
ソース上もわかりやすくなってイイ!>>934の不安も払拭される。

セルの名前は「挿入」→「名前」→「定義」で設定できるよ☆
956側近中の側近 ◆0351148456 :2008/08/23(土) 23:31:13
(っ´▽`)っ
間違えた☆

たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL").FormulaR1C1
と書くことができる。
957948:2008/08/23(土) 23:32:54
>>953
できた!サンキューです♪
胸のつっかえが取れました(o^-')b

Rangeじゃ駄目だったんですね。
これで次の勉強に進められます。

ありがとうございますヾ(o゚∀゚)ノ゛
958デフォルトの名無しさん:2008/08/24(日) 00:23:56
VBAで課長の背骨をヘシ折る事は可能?
あと、栗とか剥ける?VBAで。

ググッても全然HITしない。
959デフォルトの名無しさん:2008/08/24(日) 00:33:29
ああ、できるよ。
960デフォルトの名無しさん:2008/08/24(日) 00:59:57
>>956
ありがとう
一応名前付き範囲は知ってるよ
君はのりのりですごい親切だね
また今度教えてね
961デフォルトの名無しさん:2008/08/24(日) 01:06:38
うぜーよ
962デフォルトの名無しさん:2008/08/24(日) 01:35:44
>>959

うっそマジ?
じゃあ例えば

Sub 課長()

Dim 課長 As Integer
Dim ボディ As Boolean
Dim 吐血 As Integer

課長 = 1
吐血 = 101


Do Until 課長 = 吐血

If Cells(課長, 1) = "" Then
ボディ = True
課長 = 課長 + 1
End If

Loop

MsgBox "課長は吐血しました。もうやめて下さい。"

End Sub

とかで課長吐血する?VBAで吐血する?
963デフォルトの名無しさん:2008/08/24(日) 01:46:31
そのコードじゃ無理だけどな
964デフォルトの名無しさん:2008/08/24(日) 09:10:49
VBAでルーチン組んでから、椅子で殴れば良いじゃん。
965デフォルトの名無しさん:2008/08/24(日) 10:12:58
ハードディスクのデータをクリーンにするプログラムを組んでプレゼントしなさい。
966デフォルトの名無しさん:2008/08/24(日) 10:20:17
VBAでできるけどスレ違い。Excel関係ないから。
967デフォルトの名無しさん:2008/08/24(日) 10:52:44
2003です。
マクロの記録からオートシェイプをやったけど
そのまま実行すると塗りつぶし無しだけがキャンセルされてしまいます。

ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Fill.Solid
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
Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
どうすれば塗りつぶし無しに出来ますか?
968側近中の側近 ◆0351148456 :2008/08/24(日) 11:07:37
>>967
(っ´▽`)っ
Selection.ShapeRange.Fill.Solid
を削除しましょう。
969デフォルトの名無しさん:2008/08/24(日) 11:52:21
>>968
ありがとうございます
970デフォルトの名無しさん:2008/08/24(日) 14:41:12
CSVファイルの数値を分析したいのですが
フォルダ内すべてのCSVファイルにマクロを実行する方法はありますか?

紹介されている本やHPを教えていただけませんでしょうか?

よろしくお願いします。
971デフォルトの名無しさん:2008/08/24(日) 20:17:55
うーむ・・・CSVってカンマ区切りのデータテキストの事だよね?
一度EXCELに読み込んで処理じゃダメなのかな。
972デフォルトの名無しさん:2008/08/24(日) 20:51:32
このスレ的にはそれがいいね。
どうやってやるかは、マクロ記録すればすぐ判ることだし。
973デフォルトの名無しさん:2008/08/24(日) 21:59:24
excelで普通によみこむと、おもってるのと違う動きされることあるんだよなー。
だから、俺は、1行ずつ読み込み、コンマで区切りごとのデータを自前で配列にいれる
多バイト文字つかわれてたりするとこは、1フィールドごとにエンコードチェック、
をずっとEOFまでやってから、自分のおもってる型にかえてから処理しとる。
974y:2008/08/24(日) 22:14:08
「フォルダ内すべての」CSVファイルに対して処理をしたい、
という点でもつまずいているのかも。それについては、
「FSO」を検索すると役立つ情報が見つかると思います。
975デフォルトの名無しさん:2008/08/24(日) 23:17:58
CSVの定義って厳格な物ある?ファイル形式とか。
気になって調べたんだけど、ファイル形式までは規格されてないような。

んで、フォルダの中身全部、って指定がかなり難しいのではないかなと。
たとえば拡張子がtxtだとしても、それがCSVで組まれたデータファイルなのかは、
計算機で判断出来るの?って思ってさ。
976デフォルトの名無しさん:2008/08/24(日) 23:37:56
>>974
先にDir勧めろ。

>>975
RFC4180というものがあるにはある。
977デフォルトの名無しさん:2008/08/24(日) 23:38:05
RFC 4180
978デフォルトの名無しさん:2008/08/24(日) 23:54:22
基本的に、顧客が好むのが、Excelでひらいたときにどうみえるか。
なんで、
"dataA", "dataB", ... , "dataX"
みたいに、""でかこむことになる。
数値解析とかだけのローカル用途なら、囲まんけどな。
979デフォルトの名無しさん:2008/08/25(月) 00:04:47
FSOの.Filesでファイル一覧取得して、Right$で.csvだったら、
FSOの.Readallで読み込んで、VBCRLFでSplitして、
配列に入れて配列をカンマで、Split
980デフォルトの名無しさん:2008/08/25(月) 00:09:35
プロジェクトのこまごま作業で多かったのがFSOによる再帰ファイル検索だ
981デフォルトの名無しさん:2008/08/25(月) 00:14:27
"abc,def","ghi",""""
ってな感じのデータに対応しようと思ったら面倒よ、自前でやるのは
982デフォルトの名無しさん:2008/08/25(月) 02:00:47
FSOでやるなら普通にGetExtensionNameでcsvかどうかを見ればいいんでね?
983y: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デフォルトの名無しさん:2008/08/25(月) 20:21:21
Dir(fPath & "\*.csv", vbNormal)
Ifはいらない
985デフォルトの名無しさん: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")
988967: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デフォルトの名無しさん:2008/08/25(月) 21:04:19
マクロの自動記録でいいんじゃないの
990デフォルトの名無しさん:2008/08/25(月) 21:10:10
CSV仕様きめても精確な実装はなかなかむずかしい。
もうほんと想定外の入力がされてたりする。

特に業務でよくあるのが複数行にわたって改行つきのコメントフィールドとか
SJISとはかぎらんわけで、難しい。

もうこれでいいだろ、とおもうくらい慎重に実装しても、おれの技術じゃ
100万件のフィールドよむと、たいてい2,3件は、バグにかかる。
で、そっから、その特殊なケースをADHOCに直していくという対応。
例外でたからあとから3件追加しますとか、じゃ納得してくれんし、3年後に
でるかもしれないわけで。。。ほんと怖いよ。

一番いいのは、EXCELでCSVをよみこむのはあきらめることじゃ。。。
991967:2008/08/25(月) 21:15:57
>>989
2007ではマクロの記録をしても、オートシェイプの挿入〜線種変更などをなにも記録してくれないのです。
992側近中の側近 ◆0351148456 :2008/08/25(月) 21:16:40
>>991
(っ´▽`)っ
ウォッチウィンドウでそれっぽいプロパティを探せ☆
993デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/08/25(月) 22:45:45
うちはXMLに統一してるんでCSV時代のトラブルは一切無くなったな。
997デフォルトの名無しさん:2008/08/25(月) 22:46:41
>>995
InStr
998y:2008/08/25(月) 22:57:06
>>984
ありがとうございます。大文字・小文字を考えなくて済むのでますます楽です。

>>985
まさかそんな罠があるとは...。自分でも実験してみます。
999デフォルトの名無しさん:2008/08/25(月) 22:59:46
ume
1000デフォルトの名無しさん:2008/08/25(月) 23:01:54
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。