Excel VBA 質問スレ P ..
652:デフォルトの名無しさん
10/06/22 14:36:04
>そこですが、fso.GetAbsolutePathName で取得したものを
>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね
653:デフォルトの名無しさん
10/06/22 14:46:04
AbsolutePathNameじゃないからだろ
654:デフォルトの名無しさん
10/06/22 17:02:02
>>652
どっかいけ、アホ
655:デフォルトの名無しさん
10/06/22 22:46:43
Stringで渡すとだめで、VariantならOKのようです。
656:デフォルトの名無しさん
10/06/22 23:17:45
Set folder = m_shell.Namespace((FileName))
657:デフォルトの名無しさん
10/06/22 23:35:53
それは意味ない
658:デフォルトの名無しさん
10/06/23 19:22:11
意味あったけど
659:デフォルトの名無しさん
10/06/24 19:49:57
初心者なんですが、皆さんの力を貸してください。
下記で困ってます。orz
【実現したいこと】
ワークシートにグラフを追加し
グラフのX軸の目盛位置(wkChart.Axes(xlCategory).Left)ピッタリに四角シェイプを配置したい。
配置先は、グラフ内ではなくワークシート上。
【多分必要だと思うこと】
グラフ内の座標から、ワークシートの座標に変換する必要がある?
【試したこと】
グラフ内の座標==ワークシート上の座標でシェイプを追加したにもかかわらず
見た目上ズレている。
【コード】
'チャート内に四角シェイプを追加して選択
wkChart.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
'ワークシート上に四角シェイプを追加して選択
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
660:デフォルトの名無しさん
10/06/25 18:42:58
APIで座標を調べるのがあったな。
661:デフォルトの名無しさん
10/06/25 22:56:29
>>659
グラフ内の座標ってChart自体の (0, 0) から始まるわけじゃなかったような気がするけど、ひょっとしてそのこと?
wkChart.Shapes.AddShape(msoShapeRectangle, 30-wkChart.ChartArea.Left, 100-wkChart.ChartAreaTop, 20, 30).Select
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
662:デフォルトの名無しさん
10/06/26 23:30:08
>>659
A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww
@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する
663:662
10/06/26 23:33:24
すまん。グラフの位置決めのことで、チャート内ではない。
まじすまそ
664:デフォルトの名無しさん
10/06/27 01:30:22
正規表現で置換するだけの処理なんですが上手くいきません
ご教授願います
Sub sample01()
Dim re As Object, n As Object
Dim Match As Object, Matches As Object
Dim Val As Variant '配列
Dim i As Integer 'カウンタ
Val = Worksheets("Sheet1").Range("A1:A5").Value
Set re = CreateObject("VBScript.RegExp")
For i = 1 To 5 Step 1
MsgBox "対象セルの文字列は" & "【" & Val(i, 1) & "】"
re.Pattern = "\d{1}" '検索する正規表現パターン
re.Global = True '検索範囲はグローバル
re.IgnoreCase = True '大文字・小文字を区別する
Set Matches = re.Execute(Val(i, 1))
'■HITしたらああああに置換↓ここが上手く動いてくれない■
Val(i, 1) = re.Replace(Val(i, 1), "ああああ" & i)
'Set re = Nothing
Next i
MsgBox i - 1 & "件マッチ!"
End Sub
665:デフォルトの名無しさん
10/06/27 02:03:45
>>664
動いてますよ?
もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと
666:664
10/06/27 02:07:06
>>664だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です
上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います
667:デフォルトの名無しさん
10/06/27 02:24:08
>>665
おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました
ありがとうございました!
668:デフォルトの名無しさん
10/06/27 09:36:01
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?
669:デフォルトの名無しさん
10/06/27 10:12:08
あ、コメントアウトされてたのね。
老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。
670:デフォルトの名無しさん
10/06/27 14:23:54
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
なんで? 不要だろ
671:デフォルトの名無しさん
10/06/27 14:25:52
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな
672:664
10/06/27 15:51:40
Set re = Nothingを入れる事でメモリ解放するって事ですかね?
個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが
673:デフォルトの名無しさん
10/06/27 15:55:12
>>669
完全に不要。
あと、解放、な。
674:デフォルトの名無しさん
10/06/27 15:56:56
>>672
何がどうオーバーフローするんだ?
675:デフォルトの名無しさん
10/06/27 16:06:12
Nothing入れないと自動変数の領域がキャッシュされてるため
いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある
676:デフォルトの名無しさん
10/06/27 16:12:26
.NETからExcelを操作した時のアウトプロセス解放関連の話と
勘違いしている予感。
677:デフォルトの名無しさん
10/06/27 16:23:59
COMのGCって参照カウンタでしょ。
それに反しなければわざわざリリースなんて要らん。
678:672
10/06/27 16:26:01
>>674
ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です
Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね
679:デフォルトの名無しさん
10/06/27 16:41:37
>>675
キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ
680:デフォルトの名無しさん
10/06/27 17:51:36
「行儀が悪い」
これならどうだ
681:デフォルトの名無しさん
10/06/27 18:46:33
煽りとかでは無くて純粋に教えてほしいんだけど、
setした物はnothingにして終わらせる、って教わったんだ。
当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?
マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。
682:デフォルトの名無しさん
10/06/27 19:41:25
>メモリを占有し続けるから
これは嘘ではない
683:デフォルトの名無しさん
10/06/27 19:49:31
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない
nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ
684:デフォルトの名無しさん
10/06/27 19:57:09
テンプレに書いてくれ
無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど
685:デフォルトの名無しさん
10/06/27 20:09:26
>>682-683
ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。
>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。
本当にありがとう。
686:デフォルトの名無しさん
10/06/27 20:53:29
SQLServerのJOBにActiveXスクリプト書くときは
Nothingしないと警告でるよ
687:デフォルトの名無しさん
10/06/27 21:21:13
そういや、fjのmalloc/free論争はどう決着したんだっけなあ
688:デフォルトの名無しさん
10/06/27 21:38:02
>>685
俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある
689:デフォルトの名無しさん
10/06/27 23:43:38
俺も無駄なNothing代入はいらない派だが
>>688
メモリリークといっても、エクセルの使用メモリが増えていくだけで
エクセルを終了させれば開放される
>Nothingで終わらせておけば問題は発生しないし思考停止できる
ちなみに変数をNothingにしてもメモリリークは防げないこともある
Sub test()
Set x = CreateObject("Scripting.Dictionary")
Set y = CreateObject("Scripting.Dictionary")
Call x.Add("y", y)
Call y.Add("x", x)
Set x = Nothing
Set y = Nothing
End Sub
このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ
690:デフォルトの名無しさん
10/06/28 00:31:57
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい
いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての
ここまでテンプレ
691:デフォルトの名無しさん
10/06/28 01:10:01
質問スレだから
質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど
692:デフォルトの名無しさん
10/06/28 09:06:38
全角英数字を半角英数字にする関数ってありますか?
Case文で全文字毎に置換するしかないですかね?
693:デフォルトの名無しさん
10/06/28 09:34:12
>>692
つ素寅昆布
694:デフォルトの名無しさん
10/06/28 09:34:31
はいいえ
695:デフォルトの名無しさん
10/06/28 11:02:28
>>693
まんこの中見る器具!
696:デフォルトの名無しさん
10/06/28 11:40:42
>>692
記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない
697:デフォルトの名無しさん
10/06/28 15:54:16
相互参照になった場合は?
698:デフォルトの名無しさん
10/06/28 17:29:18
>>696
つ性器豹源
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4945日前に更新/189 KB
担当:undef