[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 08/01 06:58 / Filesize : 189 KB / Number-of Response : 699
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part15



1 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 01:07:19 ]
過去スレ
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/ ←New!

関連スレ
Excel総合相談所 91
pc11.2ch.net/test/read.cgi/bsoft/1270542226/
Word総合相談所
pc11.2ch.net/test/read.cgi/bsoft/1263719084/
【質問不可】Excel総合相談所スレの雑談・議論スレ2
pc11.2ch.net/test/read.cgi/bsoft/1151651536/

335 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 05:45:44 ]
>>332
Option Explicitとか宣言の強制使え

>>333
システムで宣言済みの名前を使うな

336 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 07:56:22 ]
予約後を変数で使おうとする気持ちがよくわからない。

337 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:04:48 ]
特定の型の名前を予約語とは言わない。

338 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:26:09 ]
特定の型の名前を(ry

339 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:41:53 ]
Javaの場合なんだが、Eclipseとかの代表的なIDEは、変数の名前補完のデフォルトが
クラスの小文字名だよ

340 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 12:23:32 ]
その人の行動は「プライバシー問題に関して無頓着」で一貫しているように
見えるので理解してもらうのは難しいと思う。新しい概念を習得してもらうには
少々歳を取りすぎている。掲示板にもらった手紙の全文を掲載した時点で
気が付くべきだったのかも。
「プライバシー問題に関して無頓着」な人は親しくない相手にも平気で年齢や
職業を尋ねる傾向があるようなので注意したほうがいいです。

341 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 12:24:23 ]
>>335
デバッグするまでスペルミスのリスク抱えてろってのか?
タイプミスじゃなくて思い違いだったりすると、毎回変数名間違うことになる
一ヵ所ならまだしもデバッグ時に複数箇所とか煩わしすぎ

頻度の少ないコードとか気付かなかったり、確実にデバッグ出来るってわけでもないし……

342 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 13:47:54 ]
日本語最強。

Dim 氏名 As String

343 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 15:21:21 ]
2バイト表記はエラー起こす処理がMS公式であったはず
なんだか忘れたが、2バイト名関数を呼び出した時いらない参照呼び出して不具合引き起こしてたような
対応する気ない見たいだから、でっかいシステム組むのにはエラーでる覚悟はしとくべき



344 名前:315 mailto:sage [2010/05/18(火) 16:38:12 ]
・関数の引数をByValにするのかByRefにするのかは、関数の仕様による。どちらかに決めうち
 するような性質のものではない。
・空文字列とvbNullは同じものではない。VarType()してみればわかる。
・いちいち$バージョンの関数があるかどうか調べるのはめんどくさいので使わない。
 そもそもmid()とmid$()とかは別物なのか?とかいうのも調べるのがめんどい。
・改行文字の種類も揃えたほうがいいかも <= 意味不明。vbCrLfを使いましょうってことだとしても、
 別にそろえる必要性を感じない。
・システムハンガリアンは使わない。

345 名前:315 mailto:sage [2010/05/18(火) 16:40:05 ]
ちなみに、俺が昔作ったVBA用コーディング規約で、

「変数の定義はできるだけ遅くやる(使用する行/ブロックの直前でやる」

と決めたら、誰一人共感してくれなくて、驚くほどの反発があったことを思い出したよw

346 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:49:53 ]
コーディング規約というかコーディングガイド的なものとして、こんなの提示したことあった。
・アーリーバインドをなるべく使う
・イベントプロシージャの中に処理を直接書かない
・変数は一行一個で宣言しろ
・Publicな関数はPascalCaseで
・Const使え

こんな感じだったか。

347 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:51:59 ]
あ、そうそう、俺はシステムハンガリアンも使って良い派で、使うならfrmとかを決めてた気がする。

348 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 19:47:42 ]
文字列をByValで渡した時って、先頭のポインタが値渡しされるの?
それとも、文字列全体がまるまるコピーされるの?

349 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 20:40:23 ]
参照渡し プロシジャに値を渡す時、値そのものではなく、値が格納されている
変数のアドレスを渡す
呼び出し先のプロシジャで引数として宣言している変数の値を変更する
と、その引数に指定している呼び出し元の変数の値も変更される

値渡し プロシジャに値を渡す時、値そのものをコピーして渡す。
呼び出し先のプロシジャは、渡された値のコピーを受け取るだけなので
呼び出し先のプロシジャで引数として宣言している変数の値を変更して
も、呼び出し元の変数は一切影響を受けない。

だったかと

350 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:15:22 ]
>>349
で、ポインタの値渡しなの?中身の値渡しなの?

351 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:18:55 ]
>>350
コピーされる。
ちなみにVBの文字列の型はBSTR。
先頭に文字列長、末尾にヌル文字のUTF16文字列だったかな。

352 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:27:09 ]
手元の本によると
プロシージャの引数の文字列がコピーされるのは以下のタイミング。

・ByRefだと文字列定数を渡した時
・ByValだと常時

もちろんポインタのコピーじゃなくて文字列をフルコピー。
VBの文字列はImmutableじゃない。

353 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:52:10 ]
>>351-352
ありがとうございます。
VBAについてそこまで深く書いてある本もあるんですね



354 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:27:49 ]
>>344
・引数にByRef|ByValを指定しなければByRefになる。
 アホが引数を書き換えるとわかりづらいバグに発展する。
 普通の関数であれば値渡しでいいはず。参照渡しを積極的に使う場面は少ない。
・ごめん。vbNullじゃなくてvbNullString。
・$・非$関数は別物。$じゃなければVariantが帰ってきている。
 普通はVariantには用がないはず。作者も$の方使えって言ってる。
・それならばvbCrLfとvbNewLineどちらを使うのか。
・システムハンガリアンはどうでもいいや。


355 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:35:57 ]
作者って誰だよ
VBの作者か?

356 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:44:19 ]
厳密にいうとVBにIntelliSenceつけたチームの中の人だな。

357 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 23:13:14 ]
VBEの自動構文チェックって邪魔にしか思えないんだが、あれが便利で使ってるって人いる?
なんであんなものがあるのか不思議でしょうがない

358 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 23:21:43 ]
どっかのペインにちょこっとアクティブに表示してくれるだけなら
便利な機能だけどダイアログで出るのが最高にウザいよなw

359 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 11:30:50 ]
>>354
普通の関数であれば参照渡しでいいはず。
値渡しが必要な場合にのみByValを使え。

360 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 11:35:47 ]
midとmid$のパフォーマンス気にする奴が、常にByVal使えとか笑えるわ

361 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 11:59:22 ]
まあそれもそうだね。
ただ、両バージョン混在してるなら$にしろって言うけどね。
参照渡しは本当に理解してないのが多い(特にCとかJavaとかの人)

362 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:00:52 ]
俺はかっこ悪いから$とかつけない
ByValもつけない

363 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:04:27 ]
変数宣言とか関数宣言だと使うよ。
いちいちAsなんて書いてられない。



364 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:11:17 ]
兎に角、統一してあればそれでいいや

365 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:23:27 ]
Typename(Mid("a",1,1))ってやるとStringって言われるんだけど、
実際はVariantだってのはどこ見ればわかるのか知りたい。

366 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:25:02 ]
第一引数を数値にしてみたけどやっぱり戻り値はStringだなあ
?Typename(Mid(123,1))
String

367 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:34:42 ]
そもそもTypeNameってVariant自体は表示しないでしょ

368 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:41:11 ]
>>364
なんかネット上に書いてありそうだけど、この本見てね。

Welcome to PowerVB
www.powervb.com/

369 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:11:03 ]
midとmid$の差なんて、100万回実行して0.1〜0.2秒位の差しかないよ。
その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで
やるのがどうかという話もある。
まぁ一般プログラマは気にしなくて良いレベル。

370 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:20:40 ]
Mid$()って、MS BASICあたり位からの互換性のためが主な目的な気がする。
そんな細かいことより、文字列の連結方法を教えといた方がいいよね。

371 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:21:29 ]
連結方法ってカッコ付ける奴かな。

372 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:34:17 ]
>>368
何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ

373 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:38:34 ]
>>371
多分このこと。
support.microsoft.com/kb/170964/ja



374 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 13:44:53 ]
別にvbCrLfとvbNewLineが混在してても気にならない。
けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ
としての素質を疑うよな。
プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、
統一されてなくてもかまわんよ。

例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。
0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。

375 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 14:01:05 ]
上で出てた参照渡しについて
引数として用意した変数に格納してから渡したほうがいい?

call 処理(変数)



引数 = 変数
Call 処理(引数)
変数 = 引数

376 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 14:14:00 ]
>>375
こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。

377 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 15:17:35 ]
なに一人で戦ってるんだ?
手を貸してやろうか?

378 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:07:10 ]
いつもながら、誰がどの発言なのか良くわからずぐだぐだ

379 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:25:10 ]
俺も>>314を支持する派に転向するわw

380 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:54:16 ]
constさえあれば良かった。

381 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:15:06 ]
じゃあ俺も314で

382 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:31:06 ]
>>375エスパーすると

Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって>>375ですか?

A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね

383 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:52:06 ]
VBAコーディング規約は、こんな項目を含めるといいかも。

・Option Explicit必須
・デフォルトコントロール名(Text1など)の使用禁止
・伝統的なループ変数(i, j, k, ...)以外の一文字の変数名禁止
・ByVal/ByRefの省略禁止
・変数宣言/定義時は、Variantであっても必ず型名を付ける
・一行の「If ... Then」禁止
・Goto/Gosub禁止
・IIf禁止
・Call禁止(書くな)
・While ... Wend禁止(代わりにDo ... Loopを使え)
・$付き関数がある場合はそれを使え
・「=""」「<>""」の代わりにLenBを使え



384 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 18:50:33 ]
>>383
>Goto/Gosub禁止
On Error は除いてくれ

Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい

385 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 19:16:01 ]
>「=""」「<>""」の代わりにLenBを使え

俺普段=””使ってるわ。。。

386 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 19:59:17 ]
Integerを使わずLongを使え、というのを足しても良いかもな。

387 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 21:25:40 ]
足してもいい。Integerが32bitだと思ってる厨房が多い。

388 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 13:53:14 ]
VBAでオセロでも作ってみようと思うんだけど、まったく分かりません
要点としては
@ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所
A一度置いたところにもう置けない判定
B駒を挟んでひっくり返す判定

どうかご教授ください

389 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 14:03:49 ]
>>388
1. Cells(2, 2).Value = "●"
2. If Len(Cells(2, 2).Value) > 0 Then Debug.Print "おけない" End If
3. Cells(2, 2).Value = "○"

つか、VBAじゃなくて他の言語でオセロ書けるのかよ?

390 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 21:16:48 ]
セルの数字を文字列に変換するマクロを考えていますが、この場合は元の数字に「’」をつける
形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか? 

391 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:00:31 ]
>>385
> >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。

おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?

392 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:01:28 ]
>>390
セルの書式を文字列にすれば?

393 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:07:16 ]
>>391
Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。



394 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:20:39 ]
>>390
Cells(2, 2).Value = Cells(2, 2).Value + ""

395 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:42:12 ]
>>394
Cells(2, 2).Text & ""

396 名前:391 mailto:sage [2010/05/21(金) 00:02:51 ]
>>393
なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。

おいらはとりあえず性能関係シビアな用途に使っていないし「= ""」 で良いや。

397 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:26:48 ]
>>396
普段使うVBAなんて最速で書けた方が偉いからね。

398 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:46:22 ]
差が出るほど大規模なプログラムをVBAなんかで書くのか…

399 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:56:18 ]
If文書いてて条件の否定を付けるために
カーソル移動するのがめんどいから
Xor Trueなんて行末に書き足すのは俺だけでいい

400 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:06:42 ]
>>398
プログラムの規模じゃなくてデータの規模が問題なんだよ。

401 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 10:49:32 ]
>>383
DoUntill...Loopもだめ?

402 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 14:42:26 ]
>>398
ループ内で、普通に文字列連結とかしてたら死ぬときがあるよ

403 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 11:52:57 ]
文字連結で何故死ぬの?



404 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 12:05:08 ]
>>402
これ書いたのだれ?もしかしておれ?

405 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 13:04:22 ]
多分このこと。
support.microsoft.com/kb/170964/ja

文字列連結は、需要が多い上に意外と時間がかかる。
何も考えずに作ると処理が死ぬほど遅くなる。

406 名前:デフォルトの名無しさん [2010/05/22(土) 16:35:49 ]
すいません、しょうもないことと承知で質問します。
xlnoneとは何をするのでしょうか?

407 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 17:17:17 ]
何もしない
ただの書式設定のプロパティ値

罫線描画を線無しにする時とかにプロパティをこれに設定する

408 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:00:46 ]
Listviewのリストは、縦には出せないのでしょうか?

409 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:13:44 ]
わかりづらかったですね。
Listviewは、縦スクロールにならないのでしょうか?

410 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:22:26 ]
変数の規約について
例えば出勤日リストの行を定義する変数名

Shukkin_row_count_
ってするより、

S_r_c_ ' Shukkin_row_count_
としたほうが、タイプミスや誤読が減って設計コスト下がるよね
むしろアンダーラインなくして頭文字を大文字で対応すべきかなあ

コードが長くなると変数の意味が散逸しかねないけど……

411 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:45:34 ]
そんな意味ならコメントは日本語でよくね?


412 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:55:31 ]
>>410
ワケ判らん変数名は付けるな
下手に短い名前なら意味が判る長い変数名の方がよぉ〜っぽど良いわ、ヴォケ



413 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:09:26 ]
問題は長い短いじゃなくて俺の命名センスにあるのかな
300行くらいの短いコード書いてみたが、変数名省略しなくても慣れたらすらすら書けた
コメント部分が200行くらいになったが


>>411
うん、コード書く時は日本語コメントは当然付ける
それに追加で、省略前の変数名明示ってことで



414 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:09:28 ]
他の項目にS_r_o_とかあったら死ねるな。
COBOLに侵され気味な俺だと、
SHUKKINrowCountかSHUKKIN_rowCountって感じかなあ。
ベタローマ字は全て大文字というのが俺的基本法則。

415 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:22:55 ]
俺ならVBAとC#では気にせず変数名や関数名に日本語使う
それで可読性や開発効率が上がるなら別にいいじゃんてスタンス

416 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:30:18 ]
>>413
その省略前の変数名という考え方がわからん
s_r_c_'出金の行数
とかでいいと思ってしまう

417 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 00:26:49 ]
S_r_c_と言う記号で見るのと
Shukkinn_row_count_と言う意味で見るのを比べれば、
保守する時の可読性、認識レベルが異なる

だから逆に、接続を長くして意味を持たせるか、後で読み返した時の読みやすさを高めるために省略するかで迷ってる

日本語変数を使うってのが両方満たして楽なんだが……予期しないエラー引き起こすリスクもある

418 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 00:30:35 ]
母音省略でいいよ。
sknRowCnt


419 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 00:32:35 ]
あれ、回答レスになってないな?
省略前って言うのは、今Shukkinn_row_count_って変数があるけど、これをS_r_c_に省略した場合
ってことで使ったんだが、↑のように保守作業時に変数の意味を理解させるって側面もある

420 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 01:23:02 ]
ソースは他人が見てわかるように書くべし
そして「明日の自分は他人」

結論。好きにしろ

421 名前:sage [2010/05/23(日) 23:37:36 ]
すみませんが、どなたか教えていただきたいことがあるのです。
エクセル2003でADOを用いてアクセス2003のデータを抽出したいのですが、
抽出条件で「・・・を含む」としたいのですが、上手くいきません。具体的には

.Source = "SELECT * FROM テーブル1" & _
" WHERE 日時>=" & 開始日 & " AND 日時<=" & 終了日 & _
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
IIf(Range("B12") <> "", " AND 項目='" & Range("B12").Value & "'", "")

となっておりまして、テーブル1というアクセスのテーブルから、日時と依頼者と項目を完全一致で抽出することはできました。
この中から依頼者と項目に関して、「・・・を含む」条件にしたいのですがLIKE演算子等入れても上手くいきません。
どなたか教えていただけますでしょうか。

422 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:40:15 ]
>>421
SQLの問題というなら

SQL質疑応答スレ 9問目
pc11.2ch.net/test/read.cgi/db/1252492296/l50

若しくは同じデータベース板のAccessスレ(あるのかどうかは知らん)へGo !

423 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:46:23 ]
>>421
上手くいかないとき、Sourceにどんな文字列が入っているのか出力して見てはいかが?



424 名前:421 mailto:sage [2010/05/23(日) 23:53:16 ]
>>422
問題はSQL何ですかね?だとすると手がつけられません。

>>423
デバックしたときに見た文字列は上手くいっていました。
ということは外部データの取り込みではLIKE演算子は無理なのでしょうか・・・


425 名前:デフォルトの名無しさん [2010/05/23(日) 23:54:57 ]
むり

426 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:00:03 ]
あれ?できなかったっけ?

427 名前:421 mailto:sage [2010/05/24(月) 00:05:18 ]
たとえば
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
のところを、
IIf(Range("B10") <> "", " AND 依頼者 Like'%" & Range("B10").Value & "%", "") & _
へ変えてみても上手くいきませんでした。
もしかして書き方が間違ってますか?

428 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:14:13 ]
>>424
デバッグで見ただけでは分かりにくいエラーは有るよ
俺はSQL文をテキストファイルに出力するプロシジャを作って
別途確認する様にしてる w



429 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:18:14 ]
>>427
Value & "%" の%の後ろのシングルクォートは?
あと一応Like演算子と文字列の間にスペースを入れようか。
それとセルの内容エスケープしてないのはわざとだよね?

430 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:25:43 ]
マンドクセだから確認してないけど
先に抜き出す条件を文字列でSQLにぶちこんでみ
それで出来ないなら構文かデータベースチェック

431 名前:421 mailto:sage [2010/05/24(月) 00:28:19 ]
できました!。皆さんありがとうございます。
特に>>427さん
大変ありがとうございます。
恥ずかしながら、後ろ側のシングルクォーテーションが必要とは知りませんでした。
また、Likeの後にスペースを入れていないことも原因のひとつでした。(本当に情けない。。)

>>427さん
後学のため教えていただけますか?
>それとセルの内容エスケープしてないのはわざとだよね?
具体的にはどういったことでしょうか?


432 名前:421 mailto:sage [2010/05/24(月) 00:30:22 ]
興奮してレスを間違えました。
429のレスは427ではなく>>429さんへのレスでした。

433 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:32:44 ]
>>431
エスケープっていうのはたとえば、Range("B10")の内容に
シングルクォートが含まれていたりしたらSQL文として
文法エラーになるよ、っていうだけの話。
Like '%'%' みたいになったらシングルクォートの閉じ位置が
変わるので文法エラーになる。

まあ、自分で使うツールってだけならあんまり気にしなくていいよ。



434 名前:421 mailto:sage [2010/05/24(月) 00:40:20 ]
>>433
なるほど・・・
たしかにそうですね。勉強になります。
今回は時間の都合上、運用面で対処したいと思いますが、
今後はそういったことを含めて構築していきたいと思います。
とにかくありがとうございました。

435 名前:デフォルトの名無しさん [2010/05/24(月) 08:17:43 ]
D-SUB9ピンのRS-232Cで接続するバーコードリーダーから文字列を入力する方法を教えてください
TELNETで認識するところまでは出来たのですがそこまでしか出来ませんでした

436 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:00:54 ]
だれかイミディエイトウィンドウを画面右側にぴったりフィットさせる方法を教えてくれ。
前はいろいろいじくってたらなんとかできたんだけど、今どうやっても上手くいかない。

437 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:22:38 ]
しばらくここ読んでなくて乗り遅れたが、空文字の代わりにvbNullStringって書いたやつ誰だよ。
どういう場面を想定したか知らんがrange("a1").value=vbnullstringなんてのは間違いだよなぁ。

438 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:25:46 ]
2ch もう終わってるね

439 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:30:59 ]
そんなことを言う人は破門です

440 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:48:26 ]
LenBがLenより速いとか書いたやつもしっかりString型の時と書かなきゃいかん。
Excelでよく使うVariant型では逆になるぜ。


441 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:53:23 ]
>>435
VBみたくAPI使えばいいんでね


442 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 10:05:25 ]
436
ぐっとしてきゅって右下にばっする

443 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 10:18:36 ]
>>440
くどくなるので必ずこうしろと言うわけではないが、Variant型の2次元配列の
各要素の型が何型か判定する場合が多いと思うが、判定して文字列だったら
String型の一時変数に格納して処理した方がベター。
そうすればLenBが確かに速い。
数値などの他の型でも一時変数に移した方がいいのは同じ。





444 名前:436 mailto:sage [2010/05/24(月) 10:26:51 ]
>>442
d
でけたぜ!
右下にってのがコツなんだな。


445 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 11:04:44 ]
正直、=""とかLenBとかにこだわってるのはほとんど無意味だぜ
そんなの、長い文字列を連結したり、RangeのCopyメソッドを使った瞬間に
無意味になる

446 名前:デフォルトの名無しさん [2010/05/24(月) 14:06:07 ]
Public Type A
ID As Integer
Name As String
End Type

Public Type B
ID As Integer
Name As String
ByRef A As String <-ここでエラーが出る
End Type

Sub main()
Dim TableA() As A
Dim TableB() As B
・・・・
End Sub

TableBでTableAのメンバーの一つを参照させたいのですが、上記のような記述だとエラーが出ます。

構造体のメンバーに参照(ポインタ)を使いたいのですが方法はないものでしょうか?


447 名前:436 mailto:sage [2010/05/24(月) 16:53:58 ]
>>447
文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。

448 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:01:08 ]
単純な文字列連結にこだわりすぎるやつも馬鹿だな
文字列連結なんて大抵は短い文字列同士の連結にしか使わず
さらに回数もたいしたことないのが普通なんだから
その辺をわかってて使うなら普通の簡潔な記述の方が優れてる

449 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 20:19:31 ]
>>448
んなこたー当たり前。
回数の多い例が出てたんでね。
こんなのほとんどの言語で共通だと思うが、未だに知らない人もいるみたいなんでね。

450 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 20:34:22 ]
長さ0の文字列かどうかならLenとかLenBの方が""と比較するよりいいかも知らんが、セルが空白かどうかを調べるだけならIsEmptyが一番軽いだろうねぇ。
俺は大体""と比較するけどな。

451 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 22:12:41 ]
そういうチマチマした高速化の技術はどうでもいい
高速化で本当に困るのはそんなところじゃない
上で出てた文字列連結の知識や、valueを配列に一気に出し入れする技、
WorksheetFunctionを使う技などをまず覚えるべき


452 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 22:38:03 ]
>WorksheetFunctionを使う技

意識したことないけど、これどんなん?

453 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:43:02 ]
>>451
そんな低レベルな話してもしょうがねぇなぁ。
お前の文字列連結を手直ししてやるからここで書いてみ?
A1:A60000の値をカンマで連結するコードを書け。
ただし



454 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:44:24 ]
おっと途中で送信したぜ。
ただしJoinはなしな。
これは猿でもできるから。

455 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 02:44:49 ]
高速化言うんならCとかでDLL作って呼び出したらいいんじゃね
VBAですることじゃない

456 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 06:08:39 ]
何で書こうと回数の多い連結を単純に連結しては駄目だわな。
以前VBAを馬鹿にした酔っ払いSQL厨がいたが、アルゴリズムも知らない馬鹿だったぜ。

457 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 08:09:07 ]
>>453の素晴らしい回答にご期待ください。

俺は猿でもできるJoin使うけど。

458 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 08:54:57 ]
適当に

A6000までコピー
クリップボードから変数に抜き出し
Replaceでvblfを,に変換
書き出し

そこそこ早いかな?

459 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 08:59:05 ]
>>456
回数だけではない
どちらかというとむしろ、文字列が長いかどうかが重要だな
回数というのもどちらかというと、「ペース」と置き換えるべきだし

460 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 09:15:49 ]
連結してねえw

461 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 10:02:35 ]
A60000だった
列Aでもいいな

462 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 10:46:29 ]
お前と連結したいよ

463 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 11:47:36 ]
ウホッ



464 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 12:24:32 ]
プログラムとしては面白いが、解答としてはどうなの
実際に文字列連結する場合、配列でもなんでもいいけど書き出してからその処理するのは流石に時間かからないかな
見てないけど

465 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 12:48:58 ]
もう連結ネタ飽きたのでそろそろ別のネタ始めてクレクレ

466 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 13:07:40 ]
ネタも何も質問スレなんだから質問ありきだろ

467 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 13:10:42 ]
素直にJoin使えばいいのに、禁止する意味がわからない
何がしたいの

468 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 13:16:14 ]
任意の型の空の配列を作成する方法ってありますか?
String型ならSplit()で行けるし、Variant型ならArray()でいけますが、
他の型はどうやって作成すればよいでしょうか?

469 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 13:26:26 ]
>>458
DataObject使うのか?
でもReplaceが遅いからなぁ。
試しに
A1
A2
.
.
A599999
A600000
と2文字〜7文字の60万セルでやってみたら2.8秒だったぜ。
DataObjectとSplitとJoinの併用でもほぼ同じ。
一方Midステートメントは0.6秒。
ループ回して一次元配列に移してJoinは微差でMidステートメントに負けるようだが俺ならJoin使うな。
なんたって楽だからな。


470 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 13:34:18 ]
上は連結文字列の作成だけで書き出しは入ってないからね。

471 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 21:15:37 ]
60万行じゃなく6万行でやってみたら>>458のDataObjectが一番速いな。
Dictionaryと似たような特性だな。
数万データならそこそこ速いが数十万になるとウンコってやつ。

472 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 21:32:17 ]
で、結局どんな答えを想定してたんだ?

473 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 21:38:05 ]
クリップボード経由で数百万語を一変数に押し込む処理ってCPUとメモリに依存しそうだが



474 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 22:51:12 ]
まだまだCPUやメモリは速くないなと思ってしまった。

475 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 23:27:54 ]
思いつきで書いただけだが、「エクセルVBAテクニック」としてなら有りな感じ?
限定条件下になりそうだけど

476 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 00:40:46 ]
>>458はvbLfじゃなくvbCrLfだな。

477 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 17:00:12 ]
Mid$とclsConcatenate使って、
vbCrLfは10と13だから、SelectCaseでそれぞれ処理し、
2文字ずつカウントする

……と、多分こういう解答を求めてたんだろうか

478 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 20:43:51 ]
Mid$以外使う必要がないでしょ
clsConcatenateってなんだろうと思って検索したら
独自に作ったStringBuilderもどきがひっかかった
もし、そういうのを使うならclsConcatenateだけでいいし
vbCrLfでSelect Case云々言ってるのは、なんでそんなことをしてるのか
ちょっとわからない

479 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:03:22 ]
初歩的なことなのだが教えて欲しい。
Public変数は、プロシージャの処理終えると値消えてしまうのか?

480 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:12:04 ]
基本的に残るけど、一定のタイミングや、
Endステートメントを実行すると初期化されなかったっけ。

481 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 22:26:59 ]
>>479
VBAの処理が終わったあとで変数の内容を見るには、イミディエイトウィンドウで?
たとえば変数aの値を確認したければ?a[Enter]と入力すればいい
ttp://f12.aaa.livedoor.jp/~itatisa/phpup/cgi/src/up9840.png

変数がクリアされる条件は、Endを実行した時(End SubやEnd Functionではなく単独のEnd文)
エディタやマクロの記録などでVBAを書き換えたとき

482 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 23:35:58 ]
VBAの本でいい本ってある?
なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど

例えば、>>481に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない

483 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 23:41:14 ]
フェイタンと師団長だったら、別に師団長が強烈な発を持っていなくても
勝負はわからんよなw



484 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:11:27 ]
最近かってためになったのは
ExcelVBAスキルアップテクニック
Excelプロフェッショナルエンジニアテクニック
かな

485 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:26:31 ]
>>482
VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。

486 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 05:20:36 ]
>>480-481
なるほど。Endで消えてしまうとは、知らなかった。
ありがとう。


487 名前:デフォルトの名無しさん mailto:sage [2010/05/29(土) 20:28:43 ]
これ出来ないのかな、と前から何度も思ってた事なのですが、

テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、
片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。

これを、
セルとテキストボックスでやることは出来ないのでしょうか?

つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。
そして、どっちを動かしても、矢印で繋がったままにしたいのです。

488 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 10:02:24 ]
ttp://www.youtube.com/watch?v=ZYuIQIComPo

489 名前:デフォルトの名無しさん [2010/05/30(日) 12:41:07 ]
質問です。。
ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。
どうすればよろしいでしょうか?

490 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 22:55:02 ]
VBAでマウスカーソルをピクセルで指定してクリックさせるにはどうするのが良いのですか?
今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので
もっとスマートなやり方があれば教えて下さい。

491 名前:デフォルトの名無しさん [2010/05/31(月) 05:10:33 ]
うんこ

492 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 08:39:22 ]
>>488
VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に

3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較

4.1と2を元に矢印の位置設定


>>499
ラベルのプロパティ→項目別→表示
で好きなの選ぶ

493 名前:デフォルトの名無しさん [2010/06/01(火) 01:02:31 ]
>>489の質問は492で解決になっているのか??
表示の中に半透明の設定なくない?



494 名前:デフォルトの名無しさん [2010/06/01(火) 07:19:17 ]
EXCEL2003、XPsp2です。

EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする
プログラムは作れるのでしょうか?
難易度は問いません。

よろしくお願いします。

495 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 08:21:24 ]
ぐぐったらフォームの半透明化が見つかった
窓側のコントロールのカスタム描画を使うAPIだな

半透明ってのがイメージ湧かないが

496 名前:487 mailto:sage [2010/06/01(火) 12:52:30 ]
ありがとうございました

497 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 17:06:19 ]
Docmd.RunSQLってマルチプルINSERT対応していますか?
DBはMySQLです。

498 名前:497 mailto:sage [2010/06/01(火) 17:19:55 ]
あ、ここAccessじゃなくてExcelでした。
すみません。


499 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:20:26 ]
Formulaで数式埋め込もうとすると短い式なら問題ないんだが、
複雑な(長い)式になるとTRUEを返される。
何だこれ?

500 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:24:10 ]
もっと色んなパターン試せばどうだろう
別の長い式作って


501 名前:デフォルトの名無しさん [2010/06/01(火) 22:46:14 ]
EasyCommっていうフリーウェアをインポートして
装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、
プログラム動作中はストップキーも聞かず、入力を受け付けてくれない
ようです。これってそういう仕様とあきらめるしかないのでしょうか。


502 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:51:58 ]
DoEventsじゃなくて?

503 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 07:37:52 ]
真偽返すのはどっか引数が抜けてるんじゃね



504 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 11:32:10 ]
>501

んなこたぁない。

505 名前:デフォルトの名無しさん [2010/06/02(水) 20:39:09 ]
エクセル2000では動く、エクセル2007では
動かないマクロがあるんだけど。
考えられる原因ってどんなのがあるの?

506 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 21:40:52 ]
大抵は、変更とか削除された機能を使っていたとかじゃないか?
2007で旧時代の機能は大分整理されたみたいだからな。

507 名前:499 mailto:sage [2010/06/02(水) 21:57:24 ]
解決した。

結局TRUEが返される理由はわからんが、
思い通りの結果が出たのでまぁ良しとする。

508 名前:デフォルトの名無しさん [2010/06/02(水) 22:08:20 ]
>>506
そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?

509 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:30:03 ]
ない
2003と2007はまったく別のソフトだと思った方がいい

何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず

510 名前:デフォルトの名無しさん [2010/06/03(木) 19:45:17 ]
両方で動くようにはできないってこと?

511 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:22:43 ]
それは内容による
速度やExcelそのものの制限に関係なく、
両方で結果が同じになる関数ばかり使ってればいい

512 名前:デフォルトの名無しさん [2010/06/04(金) 06:30:29 ]
両方で結果が違う関数なんてあるんだぁ
たとえばどんな関数?

513 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 08:14:47 ]
version



514 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 11:34:28 ]
おおっと

515 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 12:06:55 ]
Versionはプロパティ

516 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 23:56:59 ]
WorksheetFunction

517 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 00:07:43 ]
エクセルver2002を使っています。
印刷設定について教えていただきたいのですが、

一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する
マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、

表作成後に表全体を選択して印刷範囲設定しているのですが

With ActiveSheet
.PageSetup.PrintArea = Range(."表全体").Address
End With
※縮尺73%、A3、品質300dpi
プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。

【質問】
1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか?
2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか?

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

518 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 03:54:52 ]
ipadでExcelVBA動くようにならんかね

519 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 04:01:07 ]
>>517
77行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか

520 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 07:11:07 ]
>>518
つ Citrix Receiver for iPad

521 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 20:49:36 ]
>>517
印刷境界線ってのは何をさしてるんだ?

印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"

78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

とりあえずマクロの記録でこうなった


522 名前:517 mailto:sage [2010/06/06(日) 14:03:42 ]
>>517です。
分かりにくい説明ですみません。

縦に1〜77と数字を入れたとして、次ページでまた1〜77といれる。

【縮尺100%】
1
2
3


76
77
--------改ページのライン
1
2
3


76
77
-------改ページのライン

523 名前:517 mailto:sage [2010/06/06(日) 14:05:33 ]
【縮尺90%】
1
2
3


76
77
1
2
--------改ページのライン
3


76
77
1
2
3
4
--------改ページのライン

縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます)
また印刷の余白を変更したり、解像度を変更したりしてもずれます。
複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、

上記のようなとき、手動で改ページラインを77と1の間にもっていけば
自動的に100%になり綺麗に印刷することができます。
この時手動であれば90%のままで77行ごとにもできます。
これをマクロで印刷範囲を77行ごとにしたいのです。
※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)



524 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 14:52:35 ]
だから、77行目ごとに改ページ入れたいんだろ
>>521の後半でわからない?まったくの初心者か?
その77行ごとにデータ入れるマクロで、改ページも入れるようにすればいいだけなんだが

わからんようなら、A列から1を探してその手前に改ページ入れるマクロ書いといてやる
    Dim row
    ActiveSheet.ResetAllPageBreaks
    row = 1
    Do
        row = row + 1
        If Cells(row, 1).Value = 1 Then
            ActiveWindow.SelectedSheets.HPageBreaks.Add (Cells(row, 1))
        End If
    Loop Until Cells(row, 1).Value = ""

2007で作ってるけど、たぶん2002でも動くと思う

暗黙の型変換気持ち悪いとかいう突っ込み禁止

525 名前:517 [2010/06/06(日) 17:26:45 ]
>>524さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。

そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。

ありがとうございました。

526 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 20:12:11 ]
下記のデータが仮にあったとします。
ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を
配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、
コンボボックスとテキストボックスをどのように紐つければよいのでしょうか?

A B C 
1 犬 雄 
2 猫 雄 
3 鳥 雌   



527 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 20:35:57 ]
更新後処理

528 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 21:23:42 ]
アドインを2つ作りました。

中のプログラムはモジュール名から何まで全く同じで、
途中で参照するファイル(テキスト)だけが異なります。

別の業務をしている人向けに、それぞれに作ったのですが、
兼業する人が両方のアドインを追加すると、うまく動きません。

具体的には、最初に動かした方のテキストをずっと読んでしまうようです。

どこを変えれば動くようになるでしょうか。

529 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 21:58:41 ]
空が青いなぁ。

530 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 22:01:43 ]
全部同じなら中の人も見分けつかないだろうな
処理なり使ってるシステムから切り替え出来ないの?

531 名前:デフォルトの名無しさん [2010/06/07(月) 21:22:06 ]
既にシート中にある、表の中身(文字列)を二次元配列として変数に代入して
他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?


532 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 21:46:32 ]
Hairetu = range( , )

ループ処理
Hairetu(i,n)の条件分岐でHairetuBにでも格納

sheets( ).rante(,) = HairetuB

533 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:08:28 ]
>>532さん、ありがとうございます。
最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言してx(i,n)でstring型で宣言したのですが、
データ数が多いのでfor文で回して代入したいのです。、
range("A1")を代入するとしたら、for文はどうなるのですかね??

For i = 1 To 18000
For j = 1 To 18
x(i,j) = Range(i, j)
Next j
Next i
こうじゃないですよね。。



534 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:14:31 ]
Hairetu = range("A1:Z99")

535 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:47:54 ]
ありがとうございます。
すみません、最後の別シートの格納の仕方についてなのですが…
例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納
する際に、for文で回して入れる方法はあるのでしょうか?

536 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 23:12:48 ]
>>533
ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor〜Nextを使うような遅い方法しか使えなくなる。

537 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 23:14:50 ]
>>535
そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。

538 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 18:05:08 ]
別の配列に入れ替えればいいだろに

539 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 23:49:19 ]
質問なのですが、
セル範囲を一括で配列に格納した場合の添え字を
0からスタートさせることは出来ますか?

普通に格納するとx(1,1)から数値が入ってしまうところを
x(0,0)から数値が入るようにしたいのです。
今は別の配列に入れ替えてるのですが、ちょっと不便で・・・

よろしくお願いします。



540 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 23:59:25 ]
Excel2007

テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、
ホイールマウスの真ん中のホイール部分を回転させても有効になりません。

有効にする方法ってありますか?



541 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 02:26:41 ]
>>539
無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。

542 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 04:03:16 ]
まだ勉強しだして一週間なんですが教えてください

AとBにそれぞれ1〜50の数字を代入し
AとBを掛け合わせた数を縦方向にペペペと貼り付けを繰り返したいんですが
1×2と2×1は答え同じなんで重複を無くすために
代入する数値を【A>B】と定義するのってどうしたらいいんですか
↓こんな感じでやってます
Dim A
Dim B
for A 1 to 50
for B 1 to 50
(右クリックコピーでペペペと貼り付けるマクロ省略)
Next B
Nezt A


543 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 04:56:01 ]
やりたいこと(出来上がりイメージ)がよくわからん上に
大事なとこが省略されてる気がする

とりあえずA>Bのときだけなんかの処理をしたいのなら

Dim A
Dim B
for A=1 to 50
for B=1 to 50
If A>B Then
(右クリックコピーでペペペと貼り付けるマクロ省略)
End If
Next B
Next A

こんな回答しかできません
出来上がりのイメージとかあればもうちょいマシな回答できるかも



544 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 05:03:23 ]
>>542
とりあえず質問そのままの解答だと
If A > B Then ぺぺぺ
だけど、条件がA>Bだけだと6*1と3*2が同じ答えで重複するし
50*50は1回しか出てこないのに条件から外れちゃうよ?

いちいち調べなくても必ずA>Bになってるプログラム
For B = 1 To 49
For A = B + 1 To 50
ぺぺぺ
Next A
Next B

それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。

545 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 09:39:29 ]
Dim A&, B&, rowCnt&, colCnt&
rowCnt = WorksheetFunction.Max(A,B)
colCnt = WorksheetFunction.Min(A,B)

もしくは
If A < B Then
 Dim swap&
 swap = A
 A = B
 B = A
End If

ってやりたいだけか?

546 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 16:12:47 ]
Sub Hoge(inRange as Range, outRange as Range)
上記のようなインターフェースのサブルーチンがあるとします
inRangeのデータに何らかの演算をしてoutRangeにコピーします
このサブルーチンをワークシートの上のほうにある関数入力部分に
=Hoge(A1:B2, C1:D2)
のように入力したのですがうまく動いてくれません
引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?

547 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 17:02:14 ]
インターフェースのサブルーチン だぜ

548 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 18:59:39 ]
シート1からシート7までのb242:u242のセルをコピーして
シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 19:00:27 ]
シート上に CommandButton を 2 つ配置し、
それぞれ CommandButton1, CommandButton2 とします。

CommandButton1 をダブルクリックして、次のコードを書きました。

 Private Sub CommandButton1_Click()

  CommandButton1.Enabled = False
  CommandButton2.Enabled = False

  MsgBox "now processing..."

  CommandButton1.Enabled = True
  CommandButton2.Enabled = True
 
 End Sub

ここで CommandButton1 をクリックしてダイアログボックスが出ているとき、
CommandButton2 の文字が黒のままで False になっていないように見える
のは、なぜですか?

MsgBox の行にブレークポイントを仕掛けて CommandButton1 をクリック
したときは、きちんと CommandButton2 の文字も灰色になります。

(WinXPSP3/Excel 2003)

550 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 20:25:57 ]
>>546
SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。

以上。

551 名前:デフォルトの名無しさん [2010/06/10(木) 07:04:06 ]
RS485を入出力したいのですが、RS232Cとかでよく使われるMScommを利用しようと思っています。
ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。
RS232Cの入出力でも同様に出てしまいました。
VB6.0ランタイムはインストール済です。参照設定もしています。

どうしてでしょうか?解決策は?

552 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 07:26:00 ]
>>551
oshiete.goo.ne.jp/qa/5065179.html

553 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 14:36:54 ]
ワークブックXには、2つのワークシート(以下WS)があります。
・ワークシートA(以下WSA)は日次報告の原紙が作成済み
・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み

上記の2つのシートを使い、
1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、
2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更
するというマクロはどのように組めばよいのでしょうか?



554 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 15:14:06 ]
>>553
実際に操作してマクロの記録しろよ

555 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:21:40 ]
>>553
    Dim r
    r = 1
    Do Until Sheets(2).Cells(r, 3) = ""
        Sheets(1).Copy After:=Sheets(2)
        Sheets(3).Name = Sheets(2).Cells(r, 3).Text
        r = r + 1
    Loop

シートの1枚目が原紙、2枚目が日付の入ったシートって前提な

556 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:11:03 ]
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?

557 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:54:18 ]
IDispatch::Invokeとか直接呼ぶ羽目になりそうな気もするけど、
一応可能じゃないかと。

558 名前:553 mailto:sage [2010/06/10(木) 23:26:31 ]
>>552
すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています



>>555
ありがとうございます!
少し参照するシートや列を変更してみたら、自分の環境でも動くようになりました
ちなみに、こんな感じです↓

Sub ワークシートコピー()
Dim r
r = 1
Do Until Worksheets("日付データ").Cells(r, 9) = ""
Worksheets("原紙").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Worksheets("日付データ").Cells(r, 9).Text
r = r + 1
Loop
Application.DisplayAlerts = False
Worksheets("原紙").Delete
Dim p As String
p = Worksheets("日付データ").Range("A6").Text
Dim n As String
n = Worksheets("日付データ").Range("A7").Text
ActiveWorkbook.SaveAs Filename:=p & "\" & n & ".xls"
Application.Quit
End Sub

559 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 01:40:47 ]
>>542
書いてみた

Sub main()

Dim C As Range
Dim strC(2500, 0) As String

For Each C In Range("A1:AX50")
strC(C.Row * C.Column, 0) = C.Row * C.Column
Next C

With Range("A1:A2501")
.Value = strC
.RemoveDuplicates Columns:=1
End With

Rows(1).Delete

End Sub


560 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 07:44:47 ]
書き直した

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").RemoveDuplicates Columns:=1
End Sub


561 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 07:57:31 ]
バグがあった・・・Orz

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub


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

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

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

563 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 11:31:45 ]
>VBA使わずに完全に解決してる例がみつからない。

君の能力の問題じゃね?



564 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 12:14:02 ]
> 君の能力の問題じゃね?

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

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


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

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

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

568 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 15:29:44 ]
おまえだけ(´ω`)

569 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 15:55:02 ]
>>567
まあ、そう思うなら

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


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

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



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

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

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

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

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

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



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

575 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 19:56:22 ]
>>571

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


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


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



576 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:31:13 ]
ワークシート関数では手間のかかることってのが

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

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

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

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

578 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 01:40:11 ]
>>573
それを俺に聞かれても困るがな。


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

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

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

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





584 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 08:14:52 ]
>>580
WebAPIは基本ですよね。

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

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

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

586 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 09:15:00 ]
Debug.Printまみれにしてやれ。

587 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 09:51:46 ]
当然ウイルス対策ソフト切って試してるんだろうな

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

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

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

591 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 15:39:04 ]
>>585
もうすこし詳細調べてみます
>>586
おk

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

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



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

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

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

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

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


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

597 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:06:22 ]
>>596
VBAのライブラリ結局生ソースだろw


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


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

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

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


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

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

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

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

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

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



604 名前:デフォルトの名無しさん [2010/06/13(日) 12:42:46 ]
あ、
>>603は594です。

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

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

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

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

608 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 13:35:56 ]
>>606
VBAじゃなくて、なんかの自動化ソフトを使ったら?

609 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 14:31:38 ]
なんで「調べてます」って書かないで「検討してます」とか書くんだろう

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

611 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 16:20:40 ]
アドイン自体を操作するのに使える?

612 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 16:46:00 ]
参照はAddFromFile
アドインもなんかなかったっけ

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



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

615 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 18:09:29 ]
今このVBAをそのまま流用して改造してるんですが、
www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html

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

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

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

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

FilePaths = "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 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 10:05:49 ]
壊滅的に説明が下手なので、コード読む気にすらならない

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

コードは見てない

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

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

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

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

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

621 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 16:04:38 ]
>>620
byval と byref を間違えてるに一票


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

623 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:23:07 ]
>>615
暇だったのでやてみた

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

全体処理のほうにこれを書いて
FilePaths = "wwww.test.com/"

再帰のほうのこれを修正
FilePaths = "wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"

FilePaths = FilePaths & objPATH.Name & "/"

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



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

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

626 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:35:14 ]
>>623
>>623
おっと、バグッテた

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

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

出口で
FilePaths=tmp

これでいけるわ

627 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:36:08 ]
>>624
悪口しかいえないやつより100万倍まし

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


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

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



631 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:59:00 ]
>>629
VBAにはそういう機能はない

632 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 18:02:08 ]
>>631
しょぼん・・・どうもでした

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



634 名前:デフォルトの名無しさん [2010/06/18(金) 00:58:58 ]
初心者で申し訳ありません

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


635 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:45:50 ]
>>634
B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy

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

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

つかまずはマクロの記録

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


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

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

640 名前:634 [2010/06/18(金) 20:50:20 ]
みなさんさまざまなアイディア、ありがとうございました

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

641 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:11:18 ]
>>640
それでいいんなら1行にまとまるよ

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

642 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:12:41 ]
>>634
セレクトしてる意味がない

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


643 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 00:37:34 ]
>>643
とりあえず、Shell.Application絡みのドキュメントはここ。
msdn.microsoft.com/en-us/library/bb773938(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 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 13:06:43 ]
>>643
それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?

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

646 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:48:15 ]
zipがshellで処理されないOSって何?

647 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:57:59 ]
2000とか98,98SEとか

648 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 18:29:27 ]
>> 647
Windows 3.1+Excel 5.0の考慮も必要だね!

649 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 20:57:02 ]
Windows8とか

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

651 名前:643 mailto:sage [2010/06/21(月) 23:37:34 ]
>644

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

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

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



652 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:36:04 ]
>そこですが、fso.GetAbsolutePathName で取得したものを
>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね

653 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:46:04 ]
AbsolutePathNameじゃないからだろ



654 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 17:02:02 ]
>>652
どっかいけ、アホ

655 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 22:46:43 ]
Stringで渡すとだめで、VariantならOKのようです。


656 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:17:45 ]
Set folder = m_shell.Namespace((FileName))

657 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:35:53 ]
それは意味ない

658 名前:デフォルトの名無しさん mailto:sage [2010/06/23(水) 19:22:11 ]
意味あったけど

659 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 18:42:58 ]
APIで座標を調べるのがあったな。

661 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 23:30:08 ]
>>659
A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww

@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する

663 名前:662 mailto:sage [2010/06/26(土) 23:33:24 ]
すまん。グラフの位置決めのことで、チャート内ではない。
まじすまそ



664 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 02:03:45 ]
>>664
動いてますよ?

もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと

666 名前:664 [2010/06/27(日) 02:07:06 ]
>>664だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です

上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います

667 名前:デフォルトの名無しさん [2010/06/27(日) 02:24:08 ]
>>665
おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました

ありがとうございました!

668 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 09:36:01 ]
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?

669 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 10:12:08 ]
あ、コメントアウトされてたのね。

老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。

670 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:23:54 ]
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
なんで? 不要だろ

671 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:25:52 ]
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな



672 名前:664 [2010/06/27(日) 15:51:40 ]
Set re = Nothingを入れる事でメモリ解放するって事ですかね?

個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが

673 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:55:12 ]
>>669
完全に不要。
あと、解放、な。



674 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:56:56 ]
>>672
何がどうオーバーフローするんだ?

675 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:06:12 ]
Nothing入れないと自動変数の領域がキャッシュされてるため
いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある

676 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:12:26 ]
.NETからExcelを操作した時のアウトプロセス解放関連の話と
勘違いしている予感。

677 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:23:59 ]
COMのGCって参照カウンタでしょ。
それに反しなければわざわざリリースなんて要らん。

678 名前:672 [2010/06/27(日) 16:26:01 ]
>>674
ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です

Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね

679 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:41:37 ]
>>675
キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ

680 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 17:51:36 ]
「行儀が悪い」

これならどうだ

681 名前:デフォルトの名無しさん [2010/06/27(日) 18:46:33 ]
煽りとかでは無くて純粋に教えてほしいんだけど、
setした物はnothingにして終わらせる、って教わったんだ。

当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?

マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。

682 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:41:25 ]
>メモリを占有し続けるから

これは嘘ではない

683 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:49:31 ]
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない
nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される

原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ



684 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:57:09 ]
テンプレに書いてくれ
無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど


685 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:09:26 ]
>>682-683
ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。

>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。

本当にありがとう。


686 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:53:29 ]
SQLServerのJOBにActiveXスクリプト書くときは
Nothingしないと警告でるよ

687 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:21:13 ]
そういや、fjのmalloc/free論争はどう決着したんだっけなあ

688 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:38:02 ]
>>685
俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある

689 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 00:31:57 ]
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい
いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての



ここまでテンプレ

691 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 01:10:01 ]
質問スレだから
質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど

692 名前:デフォルトの名無しさん [2010/06/28(月) 09:06:38 ]
全角英数字を半角英数字にする関数ってありますか?
Case文で全文字毎に置換するしかないですかね?

693 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:12 ]
>>692
つ素寅昆布



694 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:31 ]
はいいえ

695 名前:デフォルトの名無しさん [2010/06/28(月) 11:02:28 ]
>>693
まんこの中見る器具!

696 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 11:40:42 ]
>>692
記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない

697 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 15:54:16 ]
相互参照になった場合は?

698 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 17:29:18 ]
>>696
つ性器豹源







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<189KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef