Excel VBA 質問スレ P ..
[2ch|▼Menu]
396:391
10/05/21 00:02:51
>>393
なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。

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

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

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

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

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

401:デフォルトの名無しさん
10/05/21 10:49:32
>>383
DoUntill...Loopもだめ?

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

403:デフォルトの名無しさん
10/05/22 11:52:57
文字連結で何故死ぬの?

404:デフォルトの名無しさん
10/05/22 12:05:08
>>402
これ書いたのだれ?もしかしておれ?

405:デフォルトの名無しさん
10/05/22 13:04:22
多分このこと。
URLリンク(support.microsoft.com)

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

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

407:デフォルトの名無しさん
10/05/22 17:17:17
何もしない
ただの書式設定のプロパティ値

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

408:デフォルトの名無しさん
10/05/22 21:00:46
Listviewのリストは、縦には出せないのでしょうか?

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

410:デフォルトの名無しさん
10/05/22 22:22:26
変数の規約について
例えば出勤日リストの行を定義する変数名

Shukkin_row_count_
ってするより、

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

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

411:デフォルトの名無しさん
10/05/22 22:45:34
そんな意味ならコメントは日本語でよくね?


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



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


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

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

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

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

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

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

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

418:デフォルトの名無しさん
10/05/23 00:30:35
母音省略でいいよ。
sknRowCnt


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

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

結論。好きにしろ

421:sage
10/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:デフォルトの名無しさん
10/05/23 23:40:15
>>421
SQLの問題というなら

SQL質疑応答スレ 9問目
スレリンク(db板)l50

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

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

424:421
10/05/23 23:53:16
>>422
問題はSQL何ですかね?だとすると手がつけられません。

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


425:デフォルトの名無しさん
10/05/23 23:54:57
むり

426:デフォルトの名無しさん
10/05/24 00:00:03
あれ?できなかったっけ?

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

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



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

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

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

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


432:421
10/05/24 00:30:22
興奮してレスを間違えました。
429のレスは427ではなく>>429さんへのレスでした。

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

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

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

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

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

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

438:デフォルトの名無しさん
10/05/24 09:25:46
2ch もう終わってるね

439:デフォルトの名無しさん
10/05/24 09:30:59
そんなことを言う人は破門です

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


441:デフォルトの名無しさん
10/05/24 09:53:23
>>435
VBみたくAPI使えばいいんでね


442:デフォルトの名無しさん
10/05/24 10:05:25
436
ぐっとしてきゅって右下にばっする

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



444:436
10/05/24 10:26:51
>>442
d
でけたぜ!
右下にってのがコツなんだな。


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

446:デフォルトの名無しさん
10/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
10/05/24 16:53:58
>>447
文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。

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

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

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

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


452:デフォルトの名無しさん
10/05/24 22:38:03
>WorksheetFunctionを使う技

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

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

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

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

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

457:デフォルトの名無しさん
10/05/25 08:09:07
>>453の素晴らしい回答にご期待ください。

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

458:デフォルトの名無しさん
10/05/25 08:54:57
適当に

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

そこそこ早いかな?

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

460:デフォルトの名無しさん
10/05/25 09:15:49
連結してねえw

461:デフォルトの名無しさん
10/05/25 10:02:35
A60000だった
列Aでもいいな

462:デフォルトの名無しさん
10/05/25 10:46:29
お前と連結したいよ

463:デフォルトの名無しさん
10/05/25 11:47:36
ウホッ

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

465:デフォルトの名無しさん
10/05/25 12:48:58
もう連結ネタ飽きたのでそろそろ別のネタ始めてクレクレ

466:デフォルトの名無しさん
10/05/25 13:07:40
ネタも何も質問スレなんだから質問ありきだろ

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

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

469:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/25 13:34:18
上は連結文字列の作成だけで書き出しは入ってないからね。

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

472:デフォルトの名無しさん
10/05/25 21:32:17
で、結局どんな答えを想定してたんだ?

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

474:デフォルトの名無しさん
10/05/25 22:51:12
まだまだCPUやメモリは速くないなと思ってしまった。

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

476:デフォルトの名無しさん
10/05/26 00:40:46
>>458はvbLfじゃなくvbCrLfだな。

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

488:デフォルトの名無しさん
10/05/30 10:02:24
URLリンク(www.youtube.com)

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

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

491:デフォルトの名無しさん
10/05/31 05:10:33
うんこ

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

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

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


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

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

494:デフォルトの名無しさん
10/06/01 07:19:17
EXCEL2003、XPsp2です。

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

よろしくお願いします。

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

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

496:487
10/06/01 12:52:30
ありがとうございました

497:デフォルトの名無しさん
10/06/01 17:06:19
Docmd.RunSQLってマルチプルINSERT対応していますか?
DBはMySQLです。

498:497
10/06/01 17:19:55
あ、ここAccessじゃなくてExcelでした。
すみません。


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

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


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


502:デフォルトの名無しさん
10/06/01 22:51:58
DoEventsじゃなくて?

503:デフォルトの名無しさん
10/06/02 07:37:52
真偽返すのはどっか引数が抜けてるんじゃね

504:デフォルトの名無しさん
10/06/02 11:32:10
>501

んなこたぁない。

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

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

507:499
10/06/02 21:57:24
解決した。

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

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

509:デフォルトの名無しさん
10/06/03 11:30:03
ない
2003と2007はまったく別のソフトだと思った方がいい

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

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

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

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

513:デフォルトの名無しさん
10/06/04 08:14:47
version

514:デフォルトの名無しさん
10/06/04 11:34:28
おおっと

515:デフォルトの名無しさん
10/06/04 12:06:55
Versionはプロパティ

516:デフォルトの名無しさん
10/06/04 23:56:59
WorksheetFunction

517:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/05 03:54:52
ipadでExcelVBA動くようにならんかね

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

520:デフォルトの名無しさん
10/06/05 07:11:07
>>518
つ Citrix Receiver for iPad

521:デフォルトの名無しさん
10/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
10/06/06 14:03:42
>>517です。
分かりにくい説明ですみません。

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

【縮尺100%】
1
2
3


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


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

523:517
10/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:デフォルトの名無しさん
10/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
10/06/06 17:26:45
>>524さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。

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

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

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

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



527:デフォルトの名無しさん
10/06/06 20:35:57
更新後処理

528:デフォルトの名無しさん
10/06/06 21:23:42
アドインを2つ作りました。

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

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

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

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

529:デフォルトの名無しさん
10/06/06 21:58:41
空が青いなぁ。

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

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


532:デフォルトの名無しさん
10/06/07 21:46:32
Hairetu = range( , )

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

sheets( ).rante(,) = HairetuB

533:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/07 22:14:31
Hairetu = range("A1:Z99")

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

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

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

538:デフォルトの名無しさん
10/06/08 18:05:08
別の配列に入れ替えればいいだろに

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

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

よろしくお願いします。



540:デフォルトの名無しさん
10/06/08 23:59:25
Excel2007

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

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



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

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

547:デフォルトの名無しさん
10/06/09 17:02:14
インターフェースのサブルーチン だぜ

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

549:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/09 20:25:57
>>546
SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。

以上。

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

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

552:デフォルトの名無しさん
10/06/10 07:26:00
>>551
URLリンク(oshiete.goo.ne.jp)

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

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

554:デフォルトの名無しさん
10/06/10 15:14:06
>>553
実際に操作してマクロの記録しろよ

555:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/10 20:11:03
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?

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

558:553
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
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


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

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