Excel VBA 質問スレ P ..
[2ch|▼Menu]
562:デフォルトの名無しさん
10/06/11 09:57:55
Excelで勤怠表を作成する時、必ず問題になるのが、
深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、
これってVBA使わずに完全に解決してる例がみつからない。

ここまできっちりやるならVBAもしくはシステム化が普通なのかな?

タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。

563:デフォルトの名無しさん
10/06/11 11:31:45
>VBA使わずに完全に解決してる例がみつからない。

君の能力の問題じゃね?

564:デフォルトの名無しさん
10/06/11 12:14:02
> 君の能力の問題じゃね?

俺のググる能力が足りなかったのか!!

565:デフォルトの名無しさん
10/06/11 13:07:52
>>562
そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽


566:デフォルトの名無しさん
10/06/11 13:25:52
>>565
読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。

ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。

567:デフォルトの名無しさん
10/06/11 15:24:34
どんな就業規則なのかしらんけど、区切り時間とか計算式が変わる境界値を設定して、
一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを
設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。

568:デフォルトの名無しさん
10/06/11 15:29:44
おまえだけ(´ω`)

569:デフォルトの名無しさん
10/06/11 15:55:02
>>567
まあ、そう思うなら

区切り時間15分、夜間割り増し、深夜割り増し、早朝割り増し、休日割り増し、休憩(外出)時間分減算


こんくらいでいいから、どんだけすっきり書けるか、挑戦してみw
(余力があるなら、さらに休日の夜間深夜早朝とかも入れてね)

入力はタイムカードの時間記録4個ね(出社、退社、時間内出、入)



570:デフォルトの名無しさん
10/06/11 16:15:40
>>567
平日の深夜早朝の手当は就業規則関係ないだろ。

>>569
休日の深夜早朝は法律には無いと思うので、
そういう就業規則があるところは羨ましいな。

やってみるとめんどくさいのがまともな勤怠表。

571:デフォルトの名無しさん
10/06/11 17:40:30
Excelの自動計算機能を使ってもめんどくさいのに、VBAだと簡単にできると主張する不思議

572:デフォルトの名無しさん
10/06/11 17:43:26
「完全に解決してる例」が見つからないのは、その手の奴は会社ごとに異なるから
汎用性のあるものを作るのはむずかしいし、自分の会社用の奴をごりごり作ったとしても
公開しないからじゃないの?

573:デフォルトの名無しさん
10/06/11 17:47:52
>>562
逆にVBAじゃないと完全に解決できないと思う理由は何なの?

574:デフォルトの名無しさん
10/06/11 18:29:45
そりゃVBAはなくてもできるだろうけど使った方がずっと簡単
俺なら迷わずVBAを使う

575:デフォルトの名無しさん
10/06/11 19:56:22
>>571

エクセルの式は基本的に1行にまとめないといけないから複雑なことをするには向いてない
無理にやろうとすると大変な思いをする
大量の計算を1行に詰め込むのはプログラミング的にはクソの代表だしさw


VBAならそんな制約は無いし元々そういうややこしいことをするための物だから楽にできる
使える人にとってはね


使えない人がこれから覚えてでも楽かと問われれば微妙w
使えるようになるまでが大変だから(その人のセンスしだいってとこもあるけど)



576:デフォルトの名無しさん
10/06/11 20:31:13
ワークシート関数では手間のかかることってのが

計算の途中経過を保存したり再利用すること
場合分けすること

だから、これらの処理が必要ならVBAを使った方がいい
計算式が独立してて一つ結果が出たらそれで終わりって場合はワークシート関数でやる

577:デフォルトの名無しさん
10/06/11 20:32:34
ワークシート関数を激しく多重ネストして可読性を下げるくらいなら、
ユーザー定義関数をワークシートに張った方がずっと良いと思う。

マクロ有効にしたくない?知らんがな。

578:デフォルトの名無しさん
10/06/12 01:40:11
>>573
それを俺に聞かれても困るがな。


579:デフォルトの名無しさん
10/06/12 01:44:46
俺は勤務表のカレンダーをExcel関数で作ってきたけど、カレンダー作成マクロでも組んだ方が楽だよな。
Excel関数だと無駄な同じ式を30日分入れとかにゃならんし、休日判定なんかもめんどくさい。

580:デフォルトの名無しさん
10/06/12 02:49:29
VBAでカレンダーを作る一番簡単な方法
ネットにアクセスしてYahooカレンダーからデータを抜き出す
祝日法が改正されてもYahooが潰れない限り全自動で対応できる

581:デフォルトの名無しさん
10/06/12 03:14:36
休日は算出できんものな。
法律が出来ても変わるし、天ちゃんが死んでも変わる。

582:デフォルトの名無しさん
10/06/12 03:51:21
VBAってなんて文書性の高い言語なんだといまさらながら感動
ワークシートコピー() とは
rは変数だよん
r に1を設定
ワークシート("日付データ")のセル(r,9)が""でない限り
ワークシート("原資")をワークシートコレクションの現在の個数番目の
ワークシートの後に複写,
現在のシートの名前をワークシート("日付データ")のセル(r,9)に書かれている
文字列に設定,
rにr+1を設定
以上繰り返し

エクセルの警告表示をオフに
ワークシート("原紙")を削除
pは文字列変数だよん
pにワークシート("日付データ")の範囲("A6:A6")の文字列を設定
nは文字列変数だよん
nにワークシート("日付データ")の範囲("A7:A7")の文字列を設定
現在のブックをp&"¥"&n&".xls"という名前で保存
エクセルを終了
わかった?

583:デフォルトの名無しさん
10/06/12 06:20:35
エスパーに質問。
ほとんどのPCで1分程度で終わるマクロが、あるPCだけエラーは吐かないものの数時間待ってても返ってきません。
デバッグモードに入りどこで止まっているかを見ても無限ループに入っているわけではなさそうです。
PCのスペックは同等、エクセルとVBのバージョンも一緒です。
考えられる原因はなんでしょうか?



584:デフォルトの名無しさん
10/06/12 08:14:52
>>580
WebAPIは基本ですよね。

585:デフォルトの名無しさん
10/06/12 08:19:08
>>583
on error resume next でエラーループさせてるとか。
レジストリ書き換えが上手く行って無いとか。
iniの読み込みがいつまでもtrueにならないとか。

エラー吐かない、と書いてるならば on error resume next は入れて無いよね?
デバッグで止まっているなら、そこが問題なんじゃないか?
do loop 使ってる?

いかんせん情報が少なすぎる。

586:デフォルトの名無しさん
10/06/12 09:15:00
Debug.Printまみれにしてやれ。

587:デフォルトの名無しさん
10/06/12 09:51:46
当然ウイルス対策ソフト切って試してるんだろうな

588:デフォルトの名無しさん
10/06/12 10:09:55
yahooのカレンダー取得せんでもアクセスカレンダーって使えなかったっけ
あれは祝日がないのか?

589:デフォルトの名無しさん
10/06/12 13:40:59
>>584
Windowsのバージョンが変わった場合とか、そもそもMacが共通だとか、
環境によってはライブラリが無いとか、そういう制限て無いの?

590:デフォルトの名無しさん
10/06/12 13:42:58
>>588
もう祝日は数年分の祝日リストをワークシートに書いといてそれを見るようにすればいいんじゃね?
配布が簡単なところがExcel開発の良いところだし。

591:デフォルトの名無しさん
10/06/12 15:39:04
>>585
もうすこし詳細調べてみます
>>586
おk

592:デフォルトの名無しさん
10/06/12 17:32:51
祝日法はアルゴリズムそのものだからなあ
多分フリーで最新の祝日反映されたカレンダー一覧がごろごろ堕ちてるだろ

593:デフォルトの名無しさん
10/06/12 18:17:50
>>589
ほとんどがXML(or SGML)ファイルなので大丈夫と思うよ。
欠点はスキーマが統一化されてない事かな。

594:デフォルトの名無しさん
10/06/13 11:10:35
事務職レベルなのですごく初歩的な質問します。

EXCELでもACCESSでもいいんですがVBAを書くとき、
ネットとか既存のシステム?からVBAを借用してきて、自分用に編集することってあります?
それとも、全部一から書きますか?

595:デフォルトの名無しさん
10/06/13 11:59:23
>>594
ネットにあるサンプルを利用するのは凄く勉強になるけど、
必ず自分で手打ちする事が大切かな。

面倒かもしれないけど、コードを印刷して自分で手打ちするのと、
ただコピペして終わりにするのでは、大きな差があると思う。

自分の物にしたいなら、コード手打ちが良いよ。
もちろん1から組めるに越した事はないけどね。


596:デフォルトの名無しさん
10/06/13 12:02:29
ライブラリならともかくコピーして編集って怖くね?
なんかものすごいバグが紛れ込みそうで不安

597:デフォルトの名無しさん
10/06/13 12:06:22
>>596
VBAのライブラリ結局生ソースだろw


598:デフォルトの名無しさん
10/06/13 12:09:38
メソッドの用法を調べて、後は自分で組めるレベルまで頑張るしかない。


599:デフォルトの名無しさん
10/06/13 12:11:40
>>597
ライブラリとしてまとまってるクラスや関数を使うのと
実装をいじるのでは全然違うでしょ

600:デフォルトの名無しさん
10/06/13 12:20:17
自分で作ったものだったら何をやってるか判ってるからそのまま流用っつーのはよくある。

ネットで拾った物は自分で、その部分のみをテストして納得したら
編集し直して使うのはある。
(変数名を自分がわかり易い名前にするとか


601:デフォルトの名無しさん
10/06/13 12:24:10
プログラム書く癖ってあるじゃん。
定数化のルールとか、インデントの入れ方とか。
range("A1") で書く人もいれば、cells(1,1) で書く人もいる訳で。

そう考えると、やっぱり自分で書きなおした方が良いな。

602:デフォルトの名無しさん
10/06/13 12:37:19
>>599
たいしてかわらん
そのまま使えるものをコピペしてくるなら
ライブラリだろうが、実装だろうが変わりないじゃん

アレンジがひつようなら、やっぱりかわらんじゃん

603:デフォルトの名無しさん
10/06/13 12:41:12
レスありがとうございます。
今まで、会社で既存のものを流用したり、ネットから一部コピーや
本に書いてるのを打ち込んだりしてました。
知識不足のため、全部自分で考えてやると時間がかかり過ぎて・・・

でも、ちゃんと覚えていくしかないですね。

604:デフォルトの名無しさん
10/06/13 12:42:46
あ、
>>603は594です。

605:デフォルトの名無しさん
10/06/13 12:45:25
>>602
そのまま使えて、副作用もないコードならコピペでもいいかもね
でもまずは副作用がないことを確認して、アレンジするなら新しい副作用が出ないように書かないといけない
規模が小さければどうって事ないが、普通これは結構な手間になり、見逃せばバグにもなる
ライブラリはそういうことも実装する側が考えている(というか考えるべき)からその手間もリスクも少ない

606:デフォルトの名無しさん
10/06/13 21:43:36
特殊なアドインを自動操作する方法を検討してます。
手動でやるときは、メニューバーから選択して、一連のキー入力をするだけなんですが、
vbaでこのような処理を自動化するにはどうすればよいでしょうか?

もちろん、本来はアドインのインタフェースを調べてそれを呼ぶべきなんでしょうが、
仕様がまったく不明なので、手動処理をなぞれないかと思っています。

607:デフォルトの名無しさん
10/06/13 22:10:43
addinで定義されてるルーチンなり関数なりを呼び出せば良いだけでは?

608:デフォルトの名無しさん
10/06/14 13:35:56
>>606
VBAじゃなくて、なんかの自動化ソフトを使ったら?

609:デフォルトの名無しさん
10/06/14 14:31:38
なんで「調べてます」って書かないで「検討してます」とか書くんだろう

610:デフォルトの名無しさん
10/06/14 14:47:14
>>606
決まった順番でキーを押すだけならSendKeysという命令があるけど
副作用も多いので使えるかどうかはよく検討する必要がある。

611:デフォルトの名無しさん
10/06/14 16:20:40
アドイン自体を操作するのに使える?

612:デフォルトの名無しさん
10/06/14 16:46:00
参照はAddFromFile
アドインもなんかなかったっけ

613:デフォルトの名無しさん
10/06/14 16:53:05
あ、いやそういう意味じゃなくって、メニュー操作してアドインに制御がわたった後でも、
そのアドイン自体の操作をSendKeysでできるのかなってこと

614:デフォルトの名無しさん
10/06/14 17:03:08
そのアドインが階層メニュー使ったり、ダイアログ表示したりする奴だったら、多分SnedKeysじゃ信頼性なくて
駄目だと思う。

615:デフォルトの名無しさん
10/06/15 18:09:29
今このVBAをそのまま流用して改造してるんですが、
URLリンク(www.asahi-net.or.jp)

選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したいのですが、うまくいきません。

いじったのは以下のところだけですが、ファイルがある場所のみしか抽出されないのと、フルパスをうまく吐いてくれません。
(ファイルのあったディレクトリィだけ出る)

どこがまずいでしょうか。

' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算

FilePaths = "URLリンク(wwww.test.com)" & FilePaths & "/" & objPATH.Name & "/"
' ■先ずサブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' ■本フォルダの各ファイルをシート上に表示するループ処理
COL = COL + 1 ' カラムを加算
For Each objFILE In objPATH.Files
g_cntFILE = g_cntFILE + 1 ' 参照ファイル数
GYO = GYO + 1 ' 行を加算
With objFILE
' ファイル名+(最終更新日時+ファイルサイズ)
Cells(GYO, COL).Font.ColorIndex = 1
Cells(GYO, COL).Value = FilePaths & .Name
If 25000 <= .Size Then
Cells(GYO, COL).Font.ColorIndex = 3
End If

616:デフォルトの名無しさん
10/06/16 10:05:49
壊滅的に説明が下手なので、コード読む気にすらならない

617:デフォルトの名無しさん
10/06/16 11:18:58
説明は普通に読めるぞ
ほるだのなかに
インデックス.html
ページ1.HTML
とかを見つけたら、
URLリンク(www.)ほにゃらら/インデックス.HTML
って合成したいんだろう

コードは見てない

618:デフォルトの名無しさん
10/06/16 12:22:10
>>615
本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない

619:デフォルトの名無しさん
10/06/16 14:50:43
> 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したい
「抽出」の意味が不明。(コード見ればわかるかもしれんが)

> ファイルがある場所のみしか抽出されない
「ファイルがある場所」以外は、一体どこの何を抽出したいのか?
「選んだ階層以下すべてのファイル」が対象ではないのか。

620:デフォルトの名無しさん
10/06/16 14:57:39
>>618
宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。

>>619
そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。

621:デフォルトの名無しさん
10/06/16 16:04:38
>>620
byval と byref を間違えてるに一票


622:デフォルトの名無しさん
10/06/16 16:06:27
>>615
リンク踏んだけど、そもそもそのページが読む気失せる作りだわ

623:デフォルトの名無しさん
10/06/16 17:23:07
>>615
暇だったのでやてみた

FilePaths をグローバルに宣言して

全体処理のほうにこれを書いて
FilePaths = "URLリンク(wwww.test.com)"

再帰のほうのこれを修正
FilePaths = "URLリンク(wwww.test.com)" & FilePaths & "/" & objPATH.Name & "/"

FilePaths = FilePaths & objPATH.Name & "/"

で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ

624:デフォルトの名無しさん
10/06/16 17:26:37
>>622
ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。

625:デフォルトの名無しさん
10/06/16 17:29:22
参照を受け取るときにC++でいうconstみたいな指定子ってある?

626:デフォルトの名無しさん
10/06/16 17:35:14
>>623
>>623
おっと、バグッテた

再帰のプロシージャの中で
dim tmp しといて

FilePaths = FilePaths & objPATH.Name & "/"
 ↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"

出口で
FilePaths=tmp

これでいけるわ

627:デフォルトの名無しさん
10/06/16 17:36:08
>>624
悪口しかいえないやつより100万倍まし

628:デフォルトの名無しさん
10/06/16 17:45:15
>>625
c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ


629:デフォルトの名無しさん
10/06/16 17:53:47
>>628
例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです

630:デフォルトの名無しさん
10/06/16 17:58:39
>>626
あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね



631:デフォルトの名無しさん
10/06/16 17:59:00
>>629
VBAにはそういう機能はない

632:デフォルトの名無しさん
10/06/16 18:02:08
>>631
しょぼん・・・どうもでした

633:デフォルトの名無しさん
10/06/17 15:48:05
>>626
ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。

634:デフォルトの名無しさん
10/06/18 00:58:58
初心者で申し訳ありません

今A1からD10まで数字が埋まった表があります
このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします
このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、
としたいのですが、どのように書けばよろしいのでしょうか?
表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・


635:デフォルトの名無しさん
10/06/18 01:31:16
>>634
「表上の左から2列目、一番上から一番下までの範囲を選択」
だと

途中に空白セルがないなら
Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select
とかする

個人的には好きではないけど
途中に空白セルがあった場合なんかは
Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select
の方がいいかも

636:デフォルトの名無しさん
10/06/18 01:45:50
>>634
B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy

637:デフォルトの名無しさん
10/06/18 02:55:16
もっと単純に、
Columns("B:B").Select とか
Columns(2).Select とかで良いんじゃ?

んで
Selection.Copy でコピーして
Columns("F:F").Select でF列選択
ActiveSheet.Paste ではりつけ

つかまずはマクロの記録

638:デフォルトの名無しさん
10/06/18 15:23:29
>>636
こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局>>635のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。


639:デフォルトの名無しさん
10/06/18 16:22:57
B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。
途中に空白が入ってデータが飛び飛びになることはあるのか。

このあたりが条件として欲しいところだな。
それによって手間や方法が変わってくる。

640:634
10/06/18 20:50:20
みなさんさまざまなアイディア、ありがとうございました

以下のように組むことで、一応目的達成することができました
ActiveCell.CurrentRegion.Select
Selection.Offset(0, 0).Columns(2).Copy
ActiveCell.Offset(0, 5).Select
ActiveSheet.Paste

641:デフォルトの名無しさん
10/06/18 21:11:18
>>640
それでいいんなら1行にまとまるよ

ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)

642:デフォルトの名無しさん
10/06/18 21:12:41
>>634
セレクトしてる意味がない

これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial


643:デフォルトの名無しさん
10/06/19 23:28:29
zip 内のファイル一覧を取得したいのですが、
サンプルが見つからなくて何とか以下のようなものはできました。
どこか問題はないでしょうか?とくに item.GetFolder が正規のメソッドとして
存在するのかが気になっています。
また、Folder3、FolderItem2のリファレンスはありますでしょうか?

Option Explicit
Dim m_fso
Dim m_shell
Sub main()
  Set m_fso = CreateObject("Scripting.FileSystemObject")
  Set m_shell = CreateObject("Shell.Application")
  ZipList "c:\test.zip"
End Sub
Function ZipList(FileName As String)
  Dim folder
  Set folder = m_shell.Namespace("c:\test.zip")
  ZipListSub folder
End Function
Function ZipListSub(folder As Variant, Optional path As String = "")
  Dim item
  For Each item In folder.Items
    If item.IsFolder Then
      ZipListSub item.GetFolder, item.path & "/"
    Else
      Debug.Print path & item
    End If
  Next
End Function


644:デフォルトの名無しさん
10/06/20 00:37:34
>>643
とりあえず、Shell.Application絡みのドキュメントはここ。
URLリンク(msdn.microsoft.com)(v=VS.85).aspx
FolderItem2はShellFolderItemとしてエイリアスされている。
Folder3のヘルプは見つからないな。
更に詳細が知りたければ、参照設定で「Microsoft Shell Controls And Automation」を足すと、
大本のタイプライブラリの内容が確認できる。Folder3は一応ここに出てくる。
WindowsSDK等に付属している「OLE/COM Object Viewer」で
「Type Libraries」-「Microsoft Shell Controls And Automation (Ver 1.0)」を表示させれば、
FolderItem2のエイリアスとかまで確認できるな。

645:デフォルトの名無しさん
10/06/20 13:06:43
>>643
それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?

つかエクセル関係ないからスレ違い
テンプレなくなってるんだな

646:デフォルトの名無しさん
10/06/21 16:48:15
zipがshellで処理されないOSって何?

647:デフォルトの名無しさん
10/06/21 16:57:59
2000とか98,98SEとか

648:デフォルトの名無しさん
10/06/21 18:29:27
>> 647
Windows 3.1+Excel 5.0の考慮も必要だね!

649:デフォルトの名無しさん
10/06/21 20:57:02
Windows8とか

650:デフォルトの名無しさん
10/06/21 21:38:02
>>643
× Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)

651:643
10/06/21 23:37:34
>644

ありがとうございます。
残念ながら英語版しかないようですね。

>645
zipfldr.dllが解除されている場合とかでしょうか?

>650
テストしたのをそのままあげてしまいました。
そこですが、fso.GetAbsolutePathName で取得したものを
渡さないと時々取得できないことがあるようです。
原因はさっぱりわかりません。



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

4946日前に更新/189 KB
担当:undef