Excel VBA質問スレ Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0775デフォルトの名無しさん
2008/11/07(金) 12:54:09ちょっと試せない状態だったのでとりあえず聞きました。
>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。
0776デフォルトの名無しさん
2008/11/07(金) 13:14:43intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?
0777デフォルトの名無しさん
2008/11/07(金) 13:47:26アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
0778デフォルトの名無しさん
2008/11/07(金) 15:38:15Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし
0779デフォルトの名無しさん
2008/11/07(金) 18:04:360780デフォルトの名無しさん
2008/11/07(金) 18:10:46x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
0781デフォルトの名無しさん
2008/11/07(金) 18:27:190782デフォルトの名無しさん
2008/11/07(金) 19:31:54もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが
殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから
ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
0783デフォルトの名無しさん
2008/11/07(金) 19:45:31よく分からない論理だな。
0784デフォルトの名無しさん
2008/11/07(金) 21:12:21甘え放題も困るが委縮させ過ぎるのもよくない
意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
0785デフォルトの名無しさん
2008/11/08(土) 07:17:57>>757=>>729だね。たぶん>>715も同じ人っぽい
screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと
範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない
でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
0786デフォルトの名無しさん
2008/11/08(土) 17:49:36ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。
0787デフォルトの名無しさん
2008/11/09(日) 08:43:300788デフォルトの名無しさん
2008/11/09(日) 11:32:30・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
0789デフォルトの名無しさん
2008/11/09(日) 11:34:070790788
2008/11/09(日) 11:36:43・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、
xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
0791デフォルトの名無しさん
2008/11/09(日) 11:53:23スレ違い
それはVBAではなくVB言語の質問だ
>>790
あるけど、それはWindowsの設定の問題だ
0792デフォルトの名無しさん
2008/11/09(日) 12:30:57ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。
VisualStudioからEXCELのコントロールわからんしな;;
0793デフォルトの名無しさん
2008/11/09(日) 14:49:50無理にやると普通に開けなくなるだろ
バッチファイルかWSHにドロップして
引数を環境変数に設定して
xlsファイルを開き
環境変数を見る
0794デフォルトの名無しさん
2008/11/09(日) 15:43:560795デフォルトの名無しさん
2008/11/09(日) 19:34:55普通にアドインを作れば解決するケースに思えるけど。
0796デフォルトの名無しさん
2008/11/09(日) 21:03:050797デフォルトの名無しさん
2008/11/09(日) 21:16:11教えてくれ
0798デフォルトの名無しさん
2008/11/09(日) 21:31:57それを読んだ方がいいよ。
VBAのコードが普通に書ける人ならすぐに理解できると思う。
0800655
2008/11/10(月) 00:15:33If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
0801デフォルトの名無しさん
2008/11/10(月) 10:07:40書いて良かった。誰?とか言ってゴメンなw
>>790
処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、
0802デフォルトの名無しさん
2008/11/10(月) 11:51:04販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。
それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
0803デフォルトの名無しさん
2008/11/10(月) 12:55:12>販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?
0804デフォルトの名無しさん
2008/11/10(月) 12:58:20なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
0805デフォルトの名無しさん
2008/11/10(月) 13:33:500806デフォルトの名無しさん
2008/11/10(月) 14:03:48保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
0807デフォルトの名無しさん
2008/11/10(月) 14:05:19それがアドインかと思ってたorz orz
0808デフォルトの名無しさん
2008/11/10(月) 19:24:04そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
0809デフォルトの名無しさん
2008/11/10(月) 19:26:46ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
0810デフォルトの名無しさん
2008/11/10(月) 19:30:270811デフォルトの名無しさん
2008/11/10(月) 19:40:33そのマクロをツールバーに登録するんだよ
ネットワーク越しでも大丈夫だし
0812デフォルトの名無しさん
2008/11/10(月) 23:38:11application on timeを使って、
開始したら、
a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を
やって、終わる。
というものです。
どうにも、最近、頭が回らなくなって困ってます (~.~)
0813デフォルトの名無しさん
2008/11/10(月) 23:48:190814デフォルトの名無しさん
2008/11/11(火) 00:02:20処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と
いうことでお願いします。
0815デフォルトの名無しさん
2008/11/11(火) 01:31:29Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが)
abc ="08/11/11";
sscanf(abc,"%d/%d/%d",&a,&,b,&c);
printf("20%02d%02d%02d",a,b,c);
VBAで書くにはどんな関数使えばいいのでしょう。
0817815
2008/11/11(火) 02:02:40tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2))
tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2))
tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2))
tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d
スマートじゃねえよなーorz
0818デフォルトの名無しさん
2008/11/11(火) 02:09:50いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね
0819デフォルトの名無しさん
2008/11/11(火) 19:44:30エクセルのマクロで
module1内にコード書くのと
sheet1内にコード書くのとでは
動作にどんな違いがありますか?
sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
0820デフォルトの名無しさん
2008/11/11(火) 19:50:390821デフォルトの名無しさん
2008/11/11(火) 20:51:010822デフォルトの名無しさん
2008/11/11(火) 21:15:30複数のセルの値を一度に比較することってできますか?
Sheet1のA1:B5とSheet2のA1:B5のValueが
同じであるかどうか、が分かるだけでokなのですが。
0823デフォルトの名無しさん
2008/11/12(水) 00:20:520824デフォルトの名無しさん
2008/11/12(水) 01:57:12配列数式でできるよ
0825デフォルトの名無しさん
2008/11/12(水) 05:52:03羅線の太さを調節する方法ってありますか?
できるだけ細くしたいのです。
0826デフォルトの名無しさん
2008/11/12(水) 06:21:13マクロの記録使って保存すればおk
単純に細くするだけの質問ならスレチ
0827デフォルトの名無しさん
2008/11/12(水) 12:48:05セルA1とA2を結合したシートに対して
下記のコードの実行時間は
1回目:13秒
2回目以降:54秒 (Pasteに変更すると29秒)
1回目と2回目以降の違いの理由は何なのでしょうか?
rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
selection.mergecells = false
selection.delete shift:=xlUp
range("A1").Select
どうやったら速度アップできるか知りたいのですが...
0828デフォルトの名無しさん
2008/11/12(水) 12:52:09らせん?
0829デフォルトの名無しさん
2008/11/12(水) 13:26:01罫線
新羅
確かに間違える人は居るかも
0830827
2008/11/12(水) 14:59:51シート・アクティブ時にコピー挿入し編集
シート・ディアクティブ時に挿入データを削除(元の状態に戻す)
なのです。
0831デフォルトの名無しさん
2008/11/12(水) 15:02:57> 2回目以降:54秒 (Pasteに変更すると29秒)
単位、「秒」じゃなくて「_秒」の間違いだよね?
0832デフォルトの名無しさん
2008/11/12(水) 15:15:350833デフォルトの名無しさん
2008/11/12(水) 15:17:380834デフォルトの名無しさん
2008/11/12(水) 15:20:330835デフォルトの名無しさん
2008/11/12(水) 15:34:39データは何かあるのか?
とりあえず高速化のために
Application.ScreenUpdating=False
はやってるよな?
0836デフォルトの名無しさん
2008/11/12(水) 15:54:59ScreenUpdating, EnableEvent, Calculation等もやってみています。
マシン・スペック(5年前)の問題でしょうか?
0837デフォルトの名無しさん
2008/11/12(水) 16:15:36計測方法の問題じゃないか?
0838デフォルトの名無しさん
2008/11/12(水) 16:54:320839デフォルトの名無しさん
2008/11/12(水) 17:23:09Mobile云々は置いといてこっちは1.2GHzなんだよw
OSが2kだからってここまで差は出ないよな?
体感でも1秒以上かかってるのか?
0840デフォルトの名無しさん
2008/11/12(水) 17:38:52でセルA1とB1を結合して走らせてみたら
1回目:9秒
2回目:40秒
体感で1秒未満は、セル結合無しの場合だけ
0841デフォルトの名無しさん
2008/11/12(水) 17:53:33それなら確かに遅くなるな
0843デフォルトの名無しさん
2008/11/12(水) 18:03:34遅過ぎワロタw
0844デフォルトの名無しさん
2008/11/12(水) 22:23:38どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?
0845デフォルトの名無しさん
2008/11/13(木) 09:30:46rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
'コピー挿入した行に名前を付ける(後で削除の為)
*)コピー挿入したデータへの編集
*)シートディアクティブ時の処理(アクティブ時点の状態に戻す)
'実際にはSelectionでは無く名前で削除
selection.mergecells = false '<- これ無しだと遅くなる為
selection.delete shift:=xlUp
range("A1").Select
0846デフォルトの名無しさん
2008/11/13(木) 09:40:020847デフォルトの名無しさん
2008/11/13(木) 12:31:54了解
多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね
オレなりに試してみた限りでは、
挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
( .mergecells = false もいらない)
ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
0848845
2008/11/13(木) 13:26:06有難うございます
挿入処理は、
insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです
削除処理は、
ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます
0849デフォルトの名無しさん
2008/11/13(木) 17:21:48名前か。それは厄介だ
挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし
insert だけでも 2回目は遅くなるし
後は、編集時にシートコピーしたシートを使っといて、deactivate されたら
シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、
0850デフォルトの名無しさん
2008/11/13(木) 17:26:260851デフォルトの名無しさん
2008/11/13(木) 18:16:20データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで>>827の条件で試しただけだし
0852デフォルトの名無しさん
2008/11/13(木) 21:52:40range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
0853851
2008/11/14(金) 00:13:24やっぱ>>847のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも
0854デフォルトの名無しさん
2008/11/14(金) 21:41:28今日はじめて本屋にて VBA の存在を知りました。
初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか?
詳しいかた教えてください。
0855デフォルトの名無しさん
2008/11/14(金) 22:05:58例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか
インベーダーゲーム作ってる人もいるよ
とにかくExcelをVBAプログラムで自在に操れるって事
0856デフォルトの名無しさん
2008/11/15(土) 19:22:40業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。
excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
0857無職カス
2008/11/16(日) 02:50:07>>855
>>856 さん 返答ありがとうございます。かなり使える機能ですね。
最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。
多々質問すると思いますが、みなさんよろしくおねがいします。
0858デフォルトの名無しさん
2008/11/16(日) 03:45:10そこから各部門のトップ5を上の小さい表に抽出したいんだけど、
ランクとは違う気がするし行き詰っています。
どなたかご教授願えますでしょうか?
0859デフォルトの名無しさん
2008/11/16(日) 05:08:38セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、
セルBの書式が自身の値によって変わるようにマクロを組もうとしています。
(書式は4種類以上なので条件付き書式は使えません)
worksheet_changeで書式変更を自動実行するようにしたのですが、
マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります)
その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、
マクロ自体には問題はないようです。
おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために
マクロによる変化が見られない状況であると思っています。
(違っているなら根本から考え直さないといけないかもしれませんが)
このような構成の場合、関数による値の変更が反映された後で
書式変更などのマクロが実行されるようにすることはできないのでしょうか?
ご教示お願い申し上げます。
0860デフォルトの名無しさん
2008/11/16(日) 10:11:550861デフォルトの名無しさん
2008/11/16(日) 10:51:08ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。
初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
0862デフォルトの名無しさん
2008/11/16(日) 19:13:30基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。
んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば>>855でゲームの話が出てたけど、確かに作る事は出来る。
けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。
ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。
何か目標持った方が良いよ。
0863デフォルトの名無しさん
2008/11/16(日) 19:15:00calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
0864独り言(ちら裏)
2008/11/17(月) 01:24:05問題ありかと...
それがExcelのポリシーというのであれば、そういうアプリめいたものを
Excelで作ることが間違いだったということになるか...
0865デフォルトの名無しさん
2008/11/17(月) 10:16:53> 問題ありかと...
という意見が多いので、2007で設定数が 3 から 無制限 に、
優先順位も設定を書き直さずに変更できるようになった。
0866デフォルトの名無しさん
2008/11/17(月) 14:02:590867デフォルトの名無しさん
2008/11/17(月) 15:07:26というのが無難かと
0868デフォルトの名無しさん
2008/11/18(火) 00:50:10selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?
0869デフォルトの名無しさん
2008/11/18(火) 17:07:45ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?
0870デフォルトの名無しさん
2008/11/18(火) 20:26:27Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
Loop
cells(a,3)から(a,15)まで同じ処理をしたい場合はどう記述すればいいですか
0871デフォルトの名無しさん
2008/11/18(火) 21:16:34ADODB.Stream
0872デフォルトの名無しさん
2008/11/18(火) 21:23:24Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
If a = 16 Then
Exit Do
End If
Loop
0873デフォルトの名無しさん
2008/11/18(火) 21:45:15byte型宣言はいくらなんでも無いんじゃないかな・・・。
aの使用目的が行数って分かってるんだし、そこはlongに宣言すべきだと思うんだけど。
Dim i As Long
For i = 5 To Cells(5, 5).End(xlDown).Row
Range(Cells(i, 3), Cells(i, 15)).Interior.ColorIndex = 10
Next
短い構文でも同じ処理は出来るんでないかな。
0874デフォルトの名無しさん
2008/11/18(火) 22:07:13■ このスレッドは過去ログ倉庫に格納されています