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)
0708デフォルトの名無しさん
2008/10/29(水) 22:22:44ありがとうございます!!
A列全部で検索かけたい場合どうすればいいでしょうか?
0709704 706
2008/10/29(水) 22:27:40EXCEL総合相談所で聞いてきます。
マルチになってしまいますが、ご了承ください。
レベルが上がったらこのスレに来たいと思います。
0710デフォルトの名無しさん
2008/10/30(木) 12:42:392003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
0711デフォルトの名無しさん
2008/10/30(木) 12:45:030712デフォルトの名無しさん
2008/10/30(木) 21:03:32cells はセル全部
columns(1) は1列目
ヒントはここまで。
0713デフォルトの名無しさん
2008/10/31(金) 03:25:08ズリネタとして結構面白かった
0714デフォルトの名無しさん
2008/11/02(日) 18:00:44rg=activecell
処理
この処理後に、元のアクティブセルに戻る文が書けません。
どんなだったか、教えて。
0715デフォルトの名無しさん
2008/11/02(日) 18:07:50処理の中で範囲を指定してコピー、貼付をしている。
application.screenupdating=false を直前に入れても
画面が動くのですが、画面が動かないようにできませんか?
0716y
2008/11/02(日) 18:36:29rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。
>>715
CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
0717デフォルトの名無しさん
2008/11/02(日) 19:37:54久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。
0718デフォルトの名無しさん
2008/11/02(日) 20:51:29その2行目も・・・
0719デフォルトの名無しさん
2008/11/02(日) 20:57:01を開き、データブックのイベントに対する処理をしています。
Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様
です。
Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。
方法をご教授頂けると有難いです。
0720y
2008/11/02(日) 22:45:44うは ご指摘ありがとうございます。
>>719
×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。
0721デフォルトの名無しさん
2008/11/02(日) 23:00:30最近、微妙な空気が読めなくなってきたよ・・・。
0722719
2008/11/02(日) 23:24:17自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。
SnendKeys(Alt+F4)を試したら終了できました。orz
0723719
2008/11/03(月) 00:23:33SendKeys(Alt+F4)でもだめでした。
プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に
変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4
を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
0724デフォルトの名無しさん
2008/11/03(月) 00:25:16application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、
0725722
2008/11/03(月) 00:44:26もう少し具体的に教えて下さいませんか。
2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。
0726デフォルトの名無しさん
2008/11/03(月) 01:21:12あ、ごめん
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html
この辺の問題のことだったの。
2007以外ではいけてるなら関係ないね。失礼した
0727y
2008/11/03(月) 07:57:502007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。
0728デフォルトの名無しさん
2008/11/03(月) 09:09:420729デフォルトの名無しさん
2008/11/03(月) 10:14:59後のことです。
範囲指定を解除する方法は、どこかのセルをactivateやselectするしか
方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を
したくないのですが、何か方法が無いでしょうか?
0730デフォルトの名無しさん
2008/11/03(月) 10:51:57>>725
724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。
>>729
全体的に何がいいたいのかよくわからない気がする。
0731デフォルトの名無しさん
2008/11/03(月) 10:54:12教えていただきたいのですが、
Book1を起動して
Book1のマクロで
Book2を開くことはできたのですが
Book2の内容をコピーして
Book1に貼り付けすることができません
よろしくお願いします。
0732デフォルトの名無しさん
2008/11/03(月) 10:59:28ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに
>>731
Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い
0733725
2008/11/03(月) 11:12:00保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...
0734725
2008/11/03(月) 11:17:49719に記述した通りなんだけど...
0735デフォルトの名無しさん
2008/11/03(月) 11:25:31だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。
全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
0736デフォルトの名無しさん
2008/11/03(月) 11:43:21確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...
0737デフォルトの名無しさん
2008/11/03(月) 14:48:400738デフォルトの名無しさん
2008/11/03(月) 20:06:15組み込みダイアログをそのまま使ってるのかな?>>733
組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも
0739デフォルトの名無しさん
2008/11/05(水) 00:23:48たとえば、セル(4, 3)に '=A1+A2が記入してあり
その式をセル(5, 1)に書き込む場合
Cells(5, 1) = Mid$(Cells(4, 3), 1)
でどうでしょう?
0740デフォルトの名無しさん
2008/11/05(水) 01:33:080741デフォルトの名無しさん
2008/11/05(水) 10:16:29これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。
これって、仕様ですか?
0742デフォルトの名無しさん
2008/11/05(水) 11:06:19イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない
0743742
2008/11/05(水) 11:11:330744741
2008/11/05(水) 15:12:16? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
だと、保護されたシートの時エラーになってしまう。
他にUndoを生かしたまま最終行を求める方法あります?
0745デフォルトの名無しさん
2008/11/05(水) 16:17:36?WorksheetFunction.Max(ActiveSheet.Cells(65536, 1).End(xlUp).Row,ActiveSheet.Cells(65536, 2).End(xlUp).Row,ActiveSheet.Cells(65536, 3).End(xlUp).Row)
もしくは
Dim lg(2) As Long
lg(0) = ActiveSheet.Cells(65536, 1).End(xlUp).Row
lg(1) = ActiveSheet.Cells(65536, 2).End(xlUp).Row
lg(2) = ActiveSheet.Cells(65536, 3).End(xlUp).Row
Debug.Print WorksheetFunction.Max(lg())
でどう?
0746デフォルトの名無しさん
2008/11/05(水) 16:42:43有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。
自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。
0747デフォルトの名無しさん
2008/11/06(木) 01:26:47B2を起点とするデータ
B21を起点とするデータ
この二つのデータのグラフを作成しようと以下のマクロを作ったのですが、
Set muSouce2 = Range("B21").CurrentRegion
のところでエラーがでてしまいました。
この場合どうすればエラーが取れるのでしょうか?
Sub Graph1()
Dim mySouce As Range
Set mySouce = Range("B2").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine
Dim mySouce2 As Range
Set mySouce2 = Range("B21").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce2, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine
End Sub
0748デフォルトの名無しさん
2008/11/06(木) 02:13:25set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ
0749デフォルトの名無しさん
2008/11/06(木) 02:51:43なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。
対処だけでなく原因が分かりためになりました!
0750デフォルトの名無しさん
2008/11/06(木) 10:11:14そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
0751デフォルトの名無しさん
2008/11/06(木) 18:01:30Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。
0752デフォルトの名無しさん
2008/11/06(木) 18:14:58Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw
0753デフォルトの名無しさん
2008/11/06(木) 18:35:33[G/標準]とかでエラーになる為、セル代入を考えたのですが...
0754デフォルトの名無しさん
2008/11/06(木) 18:50:58? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?
0755デフォルトの名無しさん
2008/11/06(木) 19:12:31worksheetfunction.text(x, activecell.numberformat)
これでどうかな?
0756デフォルトの名無しさん
2008/11/06(木) 19:20:37書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど
0757デフォルトの名無しさん
2008/11/06(木) 19:35:05セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz
0758デフォルトの名無しさん
2008/11/06(木) 19:44:51ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない
>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
0759デフォルトの名無しさん
2008/11/06(木) 19:50:15以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明
>>758
お前頭悪そうだな
0760デフォルトの名無しさん
2008/11/06(木) 19:56:56質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
0761デフォルトの名無しさん
2008/11/06(木) 20:01:110762デフォルトの名無しさん
2008/11/06(木) 20:10:08そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
0763デフォルトの名無しさん
2008/11/06(木) 20:46:09目障り
0764デフォルトの名無しさん
2008/11/06(木) 21:18:480765デフォルトの名無しさん
2008/11/06(木) 21:53:02おまえは引っ込んでろ!
このカス。
0766デフォルトの名無しさん
2008/11/07(金) 04:10:27つか、前に質問したなら名前欄にレス番とか入れてくれ
0767569
2008/11/07(金) 06:17:38フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・)
Aフォルダ
Bフォルダ
○○.xls
というパターンもあれば
Aフォルダ/Cフォルダ/○○.xls
Bフォルダ/○○.xls
というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。
このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を
取り出す機能を持ったVBAを作ろうとしています。
フォルダのパスはFOを使って配列に入れてそれを
全てのフォルダパターンを使って○○.xlsを探そうとしています。
そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
階層固定のフォルダ抽出、Excelファイルは問題ないのですが
階層実固定のフォルダ抽出で詰まっています。
例えば手抜きですが↓みたいな流れでうまく出来そうですかね?
Private Sub AAA()
今のパスを配列に格納
if フォルダが有る時 then
call AAA
end if
End AAA
0768デフォルトの名無しさん
2008/11/07(金) 06:18:180769デフォルトの名無しさん
2008/11/07(金) 08:44:46>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?
0771751
2008/11/07(金) 09:47:36xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...
0772デフォルトの名無しさん
2008/11/07(金) 10:00:12セル(Range)なのか数値や文字なのか
0773デフォルトの名無しさん
2008/11/07(金) 10:09:03「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
0774771
2008/11/07(金) 10:50:19(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。
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そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
■ このスレッドは過去ログ倉庫に格納されています