Excel VBA 質問スレ P ..
367:デフォルトの名無しさん
10/05/19 12:34:42
そもそもTypeNameってVariant自体は表示しないでしょ
368:デフォルトの名無しさん
10/05/19 12:41:11
>>364
なんかネット上に書いてありそうだけど、この本見てね。
Welcome to PowerVB
URLリンク(www.powervb.com)
369:デフォルトの名無しさん
10/05/19 13:11:03
midとmid$の差なんて、100万回実行して0.1〜0.2秒位の差しかないよ。
その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで
やるのがどうかという話もある。
まぁ一般プログラマは気にしなくて良いレベル。
370:デフォルトの名無しさん
10/05/19 13:20:40
Mid$()って、MS BASICあたり位からの互換性のためが主な目的な気がする。
そんな細かいことより、文字列の連結方法を教えといた方がいいよね。
371:デフォルトの名無しさん
10/05/19 13:21:29
連結方法ってカッコ付ける奴かな。
372:デフォルトの名無しさん
10/05/19 13:34:17
>>368
何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ
373:デフォルトの名無しさん
10/05/19 13:38:34
>>371
多分このこと。
URLリンク(support.microsoft.com)
374:デフォルトの名無しさん
10/05/19 13:44:53
別にvbCrLfとvbNewLineが混在してても気にならない。
けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ
としての素質を疑うよな。
プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、
統一されてなくてもかまわんよ。
例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。
0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。
375:デフォルトの名無しさん
10/05/19 14:01:05
上で出てた参照渡しについて
引数として用意した変数に格納してから渡したほうがいい?
call 処理(変数)
↓
引数 = 変数
Call 処理(引数)
変数 = 引数
376:デフォルトの名無しさん
10/05/19 14:14:00
>>375
こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。
377:デフォルトの名無しさん
10/05/19 15:17:35
なに一人で戦ってるんだ?
手を貸してやろうか?
378:デフォルトの名無しさん
10/05/19 16:07:10
いつもながら、誰がどの発言なのか良くわからずぐだぐだ
379:デフォルトの名無しさん
10/05/19 16:25:10
俺も>>314を支持する派に転向するわw
380:デフォルトの名無しさん
10/05/19 16:54:16
constさえあれば良かった。
381:デフォルトの名無しさん
10/05/19 17:15:06
じゃあ俺も314で
382:デフォルトの名無しさん
10/05/19 17:31:06
>>375エスパーすると
Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって>>375ですか?
A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね
383:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/19 18:50:33
>>383
>Goto/Gosub禁止
On Error は除いてくれ
Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい
385:デフォルトの名無しさん
10/05/19 19:16:01
>「=""」「<>""」の代わりにLenBを使え
俺普段=””使ってるわ。。。
386:デフォルトの名無しさん
10/05/19 19:59:17
Integerを使わずLongを使え、というのを足しても良いかもな。
387:デフォルトの名無しさん
10/05/19 21:25:40
足してもいい。Integerが32bitだと思ってる厨房が多い。
388:デフォルトの名無しさん
10/05/20 13:53:14
VBAでオセロでも作ってみようと思うんだけど、まったく分かりません
要点としては
@ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所
A一度置いたところにもう置けない判定
B駒を挟んでひっくり返す判定
どうかご教授ください
389:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/20 21:16:48
セルの数字を文字列に変換するマクロを考えていますが、この場合は元の数字に「’」をつける
形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか?
391:デフォルトの名無しさん
10/05/20 22:00:31
>>385
> >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。
おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?
392:デフォルトの名無しさん
10/05/20 22:01:28
>>390
セルの書式を文字列にすれば?
393:デフォルトの名無しさん
10/05/20 23:07:16
>>391
Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。
394:デフォルトの名無しさん
10/05/20 23:20:39
>>390
Cells(2, 2).Value = Cells(2, 2).Value + ""
395:デフォルトの名無しさん
10/05/20 23:42:12
>>394
Cells(2, 2).Text & ""
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でごちゃごちゃやるよりシンプルだと思うのは俺だけか。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4945日前に更新/189 KB
担当:undef