1 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:16:33 ] ExcelのVBAに関する質問スレです 前スレ 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)
427 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:53 ] よろしくお願いします。 OS:XP、Excel2003 Module5で、Public Sub AAA() という関数を作成して Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。 Module1に関数を作成して、Module5使うことは出来ています。 これは、モジュール名の順番みたいなものが関係しているのでしょうか?
428 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:30:01 ] 質問です。(WinXP,Excel2003) マルチスレッドで処理をしたいのですがうまくいきません。 以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、 エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。 どこが問題なのでしょうか?ご教示お願いします。 '----モジュール------ Public Const STILL_ACTIVE As Long = 259 Public Function testThread(ByVal n As Long) As Long Dim i For i = 1 To 10 Sheet1.Cells(1, n) = i DoEvents Next i testThread = 0 End Function '----シート------ Private Sub test_Click() Dim hThd, idThd, dwExCode As Long hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd) Do DoEvents If (GetExitCodeThread(hThd, dwExCode)) Then If (dwExCode <> STILL_ACTIVE) Then Exit Do End If Loop While True CloseHandle hThd End Sub
429 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:11:43 ] >>425 は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか…… あまりな初級な質問ですみません
430 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:36:03 ] 作ってくださいとちゃんと言えよ、アホ
431 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:37:46 ] >>428 ド素人がVBAでマルチスレッドを使おうとするのが問題
432 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:21:52 ] は、はぁ、、例えばコードを書いてもらう事を作るといいますか? 作ってください!お願いします(^人^) でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)…… 何か自分の知らない簡単な方法があるような気がしてならなかったり?
433 名前:デフォルトの名無しさん [2008/10/05(日) 22:32:39 ] コード書いてもらう事は、作る事に他ならないが・・・。 作るって、何を作る事だと思う? と言うか、作成依頼はスレ違い。 自分でやって、分からない事を聞くようにしておくれ。
434 名前:425 mailto:sage [2008/10/05(日) 22:39:17 ] >432 このスレのbPの ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 は見てなかったようですね。 自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。 マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ あります。 あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。 www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html
435 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:39:41 ] 皮肉もわからないとかw
436 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:44:42 ] dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。
437 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:46:49 ] >>425 でわかんないなら、もうこのスレ向きの話題じゃなくなった。
438 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:47:20 ] マァマー(´・ω・`)
439 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:08:07 ] >>434 エクセルの学校の添付を有難うございました 私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz 手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!! ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います 会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!
440 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:30:16 ] 昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。 以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。
441 名前:デフォルトの名無しさん [2008/10/05(日) 23:32:35 ] >>426 は自己解決しました。(というかバグが別の場所にあることが分かった) で、もう一つ質問させてください。 自作関数の演算結果を複数のセルに表示したいのですが、 Function func() func = 1 ActiveCell.Offset(1).Value = 2 End Function こうやるとこけてしまいます。 funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。 どうにか解決する方法はないのでしょうか?
442 名前:427 [2008/10/05(日) 23:38:12 ] >>427 お願いします。
443 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:54:28 ] >>427 ,>>442 Module5に作成してModule1で呼ぶのも Module1に作成してModule5で呼ぶのも 問題なく出来ている つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ まずは新規ブックを作成して、標準モジュールを5個挿入し Module5にPublic Sub AAA() Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい これで問題なく実行できるなら、自分のミスに気付いてないだけだ
444 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:10:32 ] >>440 プロの人でさえ1年で!? なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・ はぁー、、楽したい。。
445 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:44:55 ] >>441 ttp://support.microsoft.com/kb/170787/ja
446 名前:441 mailto:sage [2008/10/06(月) 02:03:42 ] >>445 こんな・・・制限が・・・あった・・・なん・・・て・・・orz VBAなんか大っ嫌いだうわあぁぁん ありがとうございました。本当に助かりました。
447 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:41:53 ] 厨ばっか湧いて来やがるのはなぜだ
448 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 05:32:26 ] なんかゴネてる人さあ、、、 まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら? ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で 入力してるよりよっぽど楽になると思う。 そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの? あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、 なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?
449 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 09:12:10 ] >>444 月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ
450 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:17:30 ] 皆様お疲れ様です >>448 それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ……… 後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく 後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました 件数も15件くらいでしたし 他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです もうフラフラです 皆様も季節柄お体気をつけて!
451 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:30:13 ] えーと、このスレはVBAでプログラミングする人の為のスレだから、 Excelの使い方はよそで聞いて&愚痴ってくれ。
452 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:24:01 ] 記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……
453 名前:434 mailto:sage [2008/10/06(月) 20:52:44 ] >408,〜,452 作ってみました。長いので2件に分けます。 ' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに 処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、 丸々1行消しても動くと思うけど、こちらでは試してません。 例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、 マクロを記録しているブックに設定できるようにするとメンテがラクですね。 詳しい方には添削してもらえるとありがたいです。 Option Explicit Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook Dim SEARCH_PATH As String, FILE_NAME As String Sub prog_408() Set BK_M = ActiveWorkbook ' DEBUG ' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。 Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls" Set BK_I = Workbooks("PRODUCT.xls") TATE = 3 ' DEBUG ' 変更対象となる10〜40個のブックが記録されているフォルダです。 ' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。 SEARCH_PATH = "D:\TEST_FOLDER\" FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop BK_I.Close Set BK_I = Nothing Set BK_M = Nothing ' DEBUG End Sub
454 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:53:51 ] 続きです。 Private Sub PROC_1() Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String Dim c As Excel.Range WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) With BK_M.Worksheets(1) ' DEBUG .Cells(TATE, 1).Value = WK_PATH ' DEBUG A列に処理対象ブックのフルパスを書き込む BANGO_12 = BK_O.Worksheets(1).Range("A4").Value .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む End With ' DEBUG ' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。 Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) If c Is Nothing Then BANGO_9 = "" Else BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました End If BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む BK_O.Close Set BK_O = Nothing TATE = TATE + 1 ' DEBUG FILE_NAME = Dir() End Sub
455 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 21:37:47 ] y様に頼めば全て解決 はい次の方
456 名前:448 mailto:sage [2008/10/06(月) 21:40:19 ] 今までさんざんシートは1枚だと言ってたのは嘘か。 もうあきれて物も言えん、、、
457 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 10:54:20 ] マンマー(´・ω・`)
458 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:39:19 ] 408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?
459 名前:デフォルトの名無しさん [2008/10/07(火) 22:54:35 ] 初心者でおじゃまします。 := ←これはどういう時に使うものですか? 本見てもよくわかりませんでした('A`)
460 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 23:59:42 ] >459 詳しい人がいないようなので、未熟ながら小生がヒントを。 上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。 Workbooks.Open Filename:=WK_PATH →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は 記載してないので規定値ということ) Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) →Findメソッドで値検索を指定 VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。 省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は 改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。 こういう説明でわかりますか?
461 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 00:02:45 ] 一般に名前付き引数と呼ばれている。
462 名前:460 mailto:sage [2008/10/08(水) 00:12:19 ] 一部訂正 →Openメソッドでフォルダのパスを指定 じゃなくて、 →Openメソッドでファイルのフルパスを指定 だった。
463 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:17:17 ] >>453-454 さん お時間を割いて頂きたいへん有難うございました ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い) 段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています 本当にありがとうございました また、余りの忙しさにお礼が遅れすみませんでした あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました 目視と比べとても楽ちんでした ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです その後9桁の数字が入力されたブックをマクロに通す作業がありましたので
464 名前:sage [2008/10/08(水) 21:22:35 ] 今度マクロを使って集計表を作ることになったのですが その中でVBAという物を使うということで質問をしに来ました。 内容は集計ボタンを押すと 同フォルダ内に配置されてるエクセルのファイル名を読み取って 事前に用意されている集計表の中に概要をコピーするというものです。 集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき 数ヶ月に一度集計ボタンを実行します。 VBA、というかプログラムは全くのド素人ですが、 どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。 皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。
465 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:36:56 ] 1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました 間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり 挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、 手順のマクロを実行すると……………デバッグ 解放がいけなかったのでしょうか 記録マクロがいけなかったのでしょうか 黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)
466 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:41:57 ] >>464 >>1 ★5 ここは右も左も解らない奴が来るところじゃない どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを 具体的に質問できるレベルになってから出直すか 急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ 車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように 金使って解決しろ
467 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:48:54 ] 指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、 453、454の中に書かれていますよ。 あと、434で紹介されたurlも参考になると思います。 文法云々ということであれば、エクセルVBAの入門書を入手するか、 ウェブの初心者向けサイトを調べてみてください。 それから、このスレのbPをよく読んでください。
468 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:54:43 ] 例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね? いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか 自分のだけ解放しても他のマクロに影響があるのでしょうか それだけではないのです 今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです! こんな目に遭う人がいますでしょうか 仕事もテンパリは続き少々のアルコールでは何にもなりません 皆様もこの寒暖の激しさにはお気をつけ下さい
469 名前:453,454 mailto:sage [2008/10/08(水) 22:11:56 ] >465 まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。 上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、 以下の説明ではマクロブックと呼びます) あなたが仕事で扱うブックには絶対に書かないでください。 エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。 マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。 そのうえでprog_408を実行してみてください。 なお、私はWindowsXp、Excel2003で試しています。 ここまで書いたところで、468を見たので追加 465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか? ひとつのモジュールには複数のマクロが記録されるんですよ。 壊れてしまったものは、現場で対応してもらうしかないと思います。
470 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 22:56:33 ] なんなの、最近の流れ
471 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:34:46 ] スレbP−★5を読まない初心者ばっかり。
472 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:01:02 ] 469さん、ご丁寧にありがとうございました モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような…… なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います これがいけなかったのかもしれません あぁ楽をするのも大変ですね…… お先にお休みさせて頂きます。ありがとうございました。。
473 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 07:42:16 ] 過去スレですね? 現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!
474 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 08:47:46 ] >>473 >>1 の★5のことだ・・・ マジでテンプラ読めないやつ増えてるのか?
475 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 09:51:50 ] そりゃ犬もションベンかけるわ
476 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 10:17:49 ] >>465 どのブックにもVBAモジュールがある…だと? あんた、「1ブックにはそれぞれ1シートしかないから、全シートを 一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。 それでどういうことになるのかわかってるのか? あんたみたいなのは下手なことに手を出すな。 気づかない内に絶対まわりに迷惑かけてるから。 後始末する側の身にもなれ。
477 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:00:15 ] 2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・ 他にVBAとか入ってるなら下手したら変数名とかかぶるし
478 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:17:51 ] VBAを勉強する前に、「仕事のやり方」から勉強するべき
479 名前:デフォルトの名無しさん [2008/10/09(木) 18:06:20 ] Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが この値をVBAで取得する方法があれば教えて下さい。orz
480 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 21:21:37 ] 2chねらならVBEオブジェクトくらい使ったことあるよな
481 名前:デフォルトの名無しさん [2008/10/11(土) 03:49:58 ] フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then MsgBox Err.Description End If End Sub
482 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:15:22 ] いったんエラー処理はずしてどの行でエラーか書いてくれよ まあfooかbazに入れてる値がまずいんだろう
483 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:46:33 ] 472です。その節はお世話になりました 犬に聖水をかけられた鞄は無事洗濯いたしました ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが なんと手順を間違えていたらしい事が昨日判明しました そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後 例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです 恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう? しかもそこで黄色になる訳ではないのですね?? もっと丁寧なデバッグ説明表示ならいいのに……
484 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:59:35 ] なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません ほんとに単純なシートなので高度なコード?ではないようです デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました けれど実行できればそれはそれでたいへん楽です! なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…
485 名前:469 mailto:sage [2008/10/11(土) 10:09:56 ] >483,484 「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。 まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか? [42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック] FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop と WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) 〜 BK_O.Close FILE_NAME = Dir() でファイル一覧からひとつずつ開いて転記してクローズしている。 ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。 その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。
486 名前:481 [2008/10/11(土) 12:15:07 ] フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then ● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。 End If End Sub
487 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 12:45:27 ] ByRef渡しでもVBAの方でうまくやってくれたっけ?
488 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 14:52:03 ] >>486 だからOn Error外せって
489 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:23:17 ] >>485 >>483-484 は、まだおまいの作ったコードは実行してないと思う ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、 来年ぐらいじゃないかな
490 名前:479 [2008/10/11(土) 17:48:11 ] キーワードを変えてググってみても見つけられなかった。 VBAからソートプロパティを取得する方法は無いのでしょうか?
491 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 18:52:51 ] >>486 テキストボックスの値を関数に渡す前にVal()で数値に 変換したら。
492 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:03:24 ] >>490 > キーワードを変えてググってみても見つけられなかった。 > VBAからソートプロパティを取得する方法は無いのでしょうか? > ソートの設定のこと? これならマクロの記録でできるけど。 Range.Sort Key1:= ・・・・ Order1:= ・・・・
493 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:10:50 ] >492 これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。 なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
494 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 20:58:41 ] >>479 単純にセルの値取得すればいいだけじゃないの??
495 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 23:01:15 ] OS: WindowsXP Excel: 2007 チャートの目盛線のスタイルを「破線」にしたいと思っていますが、 以下のようなコードを実行しても、「長破線」になってしまいます。 ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を すべて試しましたが、やはり破線にはなりませんでした。 今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。 VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
496 名前:デフォルトの名無しさん [2008/10/12(日) 00:38:29 ] エクセル2002 ウインドウズxp で質問! @列を選択 AダイアログBoxに文字を入れ検索 B検索にヒットしたセルの左のセルに*を入力 具体例 @’D列・F列を選択 A’ダイアログBOXに検索したい文字 イロハ を入力 B’ イロハニホ が入力されてるセルD1の左C1と アイロノカニ が入力されてるセルF3の左E3に*を入力 この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。 詳しい方、コードを教えて下さい m( )m この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
497 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 05:46:19 ] 置換でいいじゃんd
498 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 07:07:43 ] >>496 先に総合相談所にも謝って来いよ
499 名前:479 [2008/10/12(日) 13:44:23 ] >>493 おっしゃる通り、ソートの設定状態を参照したいのです。 Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに ソート状態を保持している筈なのです。 これを取得する方法が分かりません。
500 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:54:02 ] >499 で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
501 名前:デフォルトの名無しさん [2008/10/12(日) 17:29:28 ] >>500 シートAにデータがあり、 シートBがアクティブ時にはシートAの選択データからシートBを編集します シートCがアクティブ時にはシートAの選択データからシートCを編集します シートBやシートCを編集する時のシートAのソート条件が異なるので 編集できるかどうかを判断するためにソート状態を知りたいのです。 実際には、プログラム用ブックと上記のデータ用ブックに分かれていて プログラム用ブック側でデータブックのイベントを拾って汎用的に処理 しています。
502 名前:500 mailto:sage [2008/10/12(日) 19:23:34 ] >501 シートAは手動でソートするんですか? シートAのソートをマクロで実行して、 その際のパラメータをデータブックに記録しておけばどうですか? シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように したらいいのでは?
503 名前:デフォルトの名無しさん [2008/10/12(日) 22:26:40 ] シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて ソートされる事も想定が必要です。 プログラムブックからデータブックを開いて、データブックに定義されている 内容によりデータブックのアクティブシートを編集しています。 データブック側にはVBAコード等の記述は不要であり、プログラムブック側に VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を 行っています。 データブックは任意のxlsファイルが指定できます。
504 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:42:02 ] 誰か早く無理だって言ってやれよ
505 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:01:29 ] 無理です
506 名前:503 [2008/10/13(月) 00:02:44 ] 自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示 (Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第 です。 Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。 諦めかな...
507 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:27:16 ] 無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。
508 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:35:54 ] 二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?
509 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:46:52 ] 無理です
510 名前:デフォルトの名無しさん [2008/10/13(月) 01:40:17 ] ExcelVBAの関数のコールグラフを作成してくれるツールってある? ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
511 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:23 ] フォルダにある複数の報告書のファイル名を変更したいのですが 方法を知っている方おられませんか? 報告書(Aさん)→済_報告書(Aさん) 報告書(Bさん)→済_報告書(Bさん) 報告書(Cさん)→済_報告書(Cさん) 上記のように ()内の名前が変わってもファイル名を 報告書()→済_報告書() と変更できる方法を探しています。 何か良い方法を知っている方がいれば教えて頂けないでしょうか? お願いします。
512 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 15:12:43 ] ファイル名を fileName As String とすると、 まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、 fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")" って感じ?
513 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 16:40:36 ] >>511 スレ違い ファイル名変更ぐらいならRENコマンドでできる。
514 名前:512 mailto:sage [2008/10/13(月) 17:50:21 ] この条件だと、wsh使わないと一寸厳しいとは思う。 というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。 違うの? >>511
515 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:51:55 ] >>1
516 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:58:06 ] >>511 Name ステートメント
517 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:15:55 ] >>514 さん 返信遅くなってすみません レス有難うございます。 >>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。 はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。 最初は>>516 さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が ネックになって上手くいきませんでした。 >>513 、>>515 さん スレ違いでしたか、すみませんでした。
518 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:08:55 ] >>506 xlsファイルフォーマットが公開されているので(英語)、 解析してソート部分の設定を読み出すコード書いたら。
519 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:24:53 ] 何がわからないのかわからなかった
520 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:42:57 ] なんでわかってもらえないのかがわからない
521 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:54:48 ] なんでわかってもらえると思えるのかがわからない
522 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 10:15:24 ] >>506 ヘルプには「シートごとに保存される」 とは書いてあるがどうやって取り出すか書いてないな・・・ ところでそもそも「ソートの設定」で見ようとするのは危なくないか? コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
523 名前:500,502 mailto:sage [2008/10/14(火) 13:13:28 ] >506 522に1票 >シートBやシートCを編集する時のシートAのソート条件が異なるので >編集できるかどうかを判断するためにソート状態を知りたいのです。 とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか? ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
524 名前:506 [2008/10/14(火) 13:22:48 ] 基本的には保存しない前提で考えていたので、コピペは考えていませんでした。 出直します。orz
525 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 16:26:52 ] なんで強制的にソートしちゃいけないのかな Aが一定の条件でソートされてないとBやCの編集ができないのに、 ソートは人まかせってのが不思議 永遠にソートしてくれなかったらどうするんだろう ソートされてるかどうかを何かのフラグとして扱うつもりなら、 それこそそんなの信用できないんじゃないの 気まぐれでソートして見てみただけかも知れないし
526 名前:デフォルトの名無しさん [2008/10/14(火) 16:57:54 ] 私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。 文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの があるようです。具体的な例をあげると、 "ad-02-mb.html" "ad-02.html" の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと なります。マッチング処理ができなくて困っています。解決方法を お教えください。
527 名前:506 mailto:sage [2008/10/14(火) 17:42:10 ] >>525 説明不足でした BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が 多めに要するという事です。 強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に 戻す必要があります。 別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
528 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 18:03:14 ] >>526 バージョン差あるかもだけど、option compare は? >>527 ソートされなくても永遠に作業が滞るわけではないのね。ならよかった いつの日か希望どおりにソートしてもらえるといいね
529 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:03:09 ] >>526 その「ソート」って何の事よ
530 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:35:11 ] >>527 だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。 そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
531 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:36:19 ] そぅっとしてやってくれ。
532 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:16:22 ] 早野乙
533 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:58:59 ] >526 自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。 ヘルプから引用 一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、 ハイフンを含む文字列が後に配置されます。 引用終わり つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。 先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も 比較に利用されるので、bd-02-mb.htmlが先になる。 文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
534 名前:526 mailto:sage [2008/10/15(水) 22:38:35 ] >533 おーっ、感動の回答!ありがとうございます。 自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。 で、どーすりゃいいのか考えないと。。。 とにかく、ありがとうございました。
535 名前:533 mailto:sage [2008/10/15(水) 22:54:32 ] >534 レスがあるとうれしいですね。 引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。 解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか? 処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら 一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
536 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:00:23 ] binary
537 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:03:15 ] ハイフンは、行末で英単語を分割する際に使われるからだな。
538 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:04:22 ] どのような時に、なぜマッチング処理ができないのかを明記せよ
539 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:08:50 ] >536 バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか? エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は あるけど、バイナリのことは書いてありません。(Excel2003)
540 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:27:30 ] マッチング処理ってどういう処理をしてるの?
541 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:35:57 ] 比較にstrcompを使った独自ソート関数書けよ
542 名前:デフォルトの名無しさん [2008/10/15(水) 23:48:53 ] >>539 Option Compare ステートメント
543 名前:542 mailto:sage [2008/10/15(水) 23:52:53 ] こっちの勘違いにつき、忘れてcくれ(^^;
544 名前:539 mailto:sage [2008/10/15(水) 23:57:27 ] >542 エクセルVBAのヘルプを見てみました。 引用はじめ Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法 である Binary モードが使われます。 引用終わり ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、 ハイフン"-"を無視しないようにするのは無理なのでは?
545 名前:539 mailto:sage [2008/10/16(木) 00:03:27 ] >543 リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
546 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:57:46 ] で今夜は徹夜ですっと
547 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 03:44:56 ] 購入日 保証年数 2006/10/05 2 2004/08/12 5 2005/04/22 3 という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、 ・・・するという場合、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then 'もし列がA(1)なら ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then '今日との日付差がマイナスなら Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする Else Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする End If End If End Sub 保証切れの場合、色をつけたいのですが、 ★をどのようにすればいいでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 05:05:36 ] ある日付から、 n年後 n日後などを求めたい時は dateadd 詳しくはヘルプ読んで あとそのコードだと保証期間内の時に青になるよ datediffのヘルプ読んで
549 名前:526 mailto:sage [2008/10/16(木) 22:42:05 ] なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、 Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。 Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、 ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、 アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース してマッチングする処理にしました。 ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、 =のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの 並び順が異なるために、おかしくなっていました。 みなさんのおかげで、なんとか完成しました。ありがとうございました。
550 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 22:51:10 ] 説明する気ないのか
551 名前:526 mailto:sage [2008/10/16(木) 22:52:41 ] 間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは Do While マスターキー >= トランザクションキーでした。
552 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:07:51 ] もう来なくていいよ
553 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:09:30 ] そもそもマッチングを勘違いしてると思われる。
554 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 01:13:46 ] マイッチングまちこ てか、正規表現でも使うの?マッチングって事は。
555 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 02:37:01 ] ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。 COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
556 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 10:56:37 ] ものすごくアフォな質問で申し訳ないんですが教えてください For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、 For I = 1 To 1000 「基本作業」 a = Right(I, 2) If a = 1 Then 「選択作業1」 ElseIf p = 2 Then 「選択作業2」 ↓ 以下、0まで選択作業計10個 ↓ Else End If Next I こんな感じでいいんでしょうか? 今実行環境が無いのでどなたかアドバイスお願いしますorz
557 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:39:21 ] >>556 あくまで自分ならだが For I = 1 To 1000 '「基本作業」 a = I Mod 10 Select Case a Case 1 '「選択作業1」 Case 2, 3 '「選択作業2」 End Select Next I といった感じにする
558 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:44:28 ] >>557 ありがとう 家に帰ったらいろいろ試してみます
559 名前:デフォルトの名無しさん [2008/10/17(金) 17:54:59 ] セルの値が1のときセルの色づけ赤,2のときセルの色づけ青 とするマクロをVBAで組んだのですが,一回実行した後, セルの値を1から2を変更しても,実行ボタンをあらためて 押さないと色が青に変わりません。 2を入力すれば直ちにセルの色づけが青に変わるようにする ためにはどのようなコードを入れればよいのでしょうか。 よろしくお願いします。
560 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:27:43 ] >>559 ボタン押したら色が変わるようにしたんだろ? だったら当然だな 入力してすぐに変えたければ 1.ボタンはやめてワークシートのChangeイベントで動かす 2.VBAをやめて条件付書式にする どちらかだな ところでテンプレ>>1 の★5読んだか?
561 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:06:41 ] >>560 ありがとうございます。 まったくの初心者です。場所を間違えたようです。 失礼しました。
562 名前:547 mailto:sage [2008/10/17(金) 20:36:21 ] > ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then なんですが、 dateaddをして、比較したいのですが、 If Dateadd("y", target.offset(0,1).value, target.value) < Date Then と、やってみてもダメでした、 Private Sub Worksheet_Change If Target.Column = 1 Then に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、 上記であっているのでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 21:38:26 ] >>562 ダメだった時はどうダメだったのかを書こうぜ > 特定セルと特定セルの右隣を関数に入れて比較 そこは合ってる で、右隣のセルに入ってるのは日数じゃなく年数でしょ? 後はもっぺんヘルプ読んで
564 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 01:46:12 ] >>559 条件付書式だかそんな感じの奴でマクロなしでできる
565 名前:547 mailto:sage [2008/10/18(土) 04:21:40 ] >>563 もう一度考えてみました。 やりたいことと、セルの値 購入日 保証年数 2006/10/05 2 ←保証切れ(青色になって欲しい) 2004/08/12 5 ←保証が切れていない(色は黒色に) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then ' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較 Target.EntireRow.Font.ColorIndex = 5 '青 Else Target.EntireRow.Font.ColorIndex = 0 '黒 End If End If End Sub 日付を入れると「全部青になってしまいます」 ちなみに If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then と年数バージョンでもやってみましたが、同じ結果orzでした。 全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。 日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
566 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 05:47:32 ] >>565 おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ 今日の日付に足したら、何足したって未来になるだろw >>562 のでほぼ合ってるんだよ オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、 おまいのにはないのか?
567 名前:565 mailto:sage [2008/10/18(土) 06:29:37 ] ありがとうございます。 yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。 たしかにadddateで今ヘルプを見ると、 設定値 内容 yyyy yyyy y 年間通算日 yyyy・・・内容書いていませんwww (by Office 2003) でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。 しかし、大問題が発生しました。 xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、 worksheet_changeじゃだめなんです。 workbookが開いたとき、な方法があればいいのですが、 worksheet_activate、selectionchangeでも反応しませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
568 名前:565 mailto:sage [2008/10/18(土) 06:53:58 ] 何度もすいません、 たぶん、worksheet_activateイベントで良いと思うのですが、 activateになった時に計算させるということは、 自動的に Private Sub Worksheet_Activate(ByVal Target As Range) If Target.Column = 1 Then If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then Target.EntireRow.Font.ColorIndex = 5 '青 Else Target.EntireRow.Font.ColorIndex = 0 '黒 End If End If End Sub Private Sub部分を変えただけだと 違うシートを選んで、選択し直すと 「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」 と出ますが、すでに上の言葉が理解できません。 if文以下も変更しなければならないのでしょうか? byヘルプ プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。 イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。 たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。 ダメです、わけわかりませんorz
569 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 08:23:40 ] >>567-568 > yyyy yyyy ちょwマジでw おちおち「ヘルプ読め」とも言えんじゃないか まあそっちは解決したようで良かった イベント変更の方だが、worksheet_activateは引数を取らないから、 そうなるのは当然だな 引数を消して、targetを自前で指定してやればOK つか、workbook_openイベントもあるんだが つか、今さらだけど、 色変えたいだけなら条件付き書式でもできるがw
570 名前:デフォルトの名無しさん [2008/10/19(日) 02:32:28 ] VBAにEffective C++やEffective Javaみたいなガイドラインってある?
571 名前:568 mailto:sage [2008/10/19(日) 02:58:41 ] >>569 >色変えたいだけなら条件付き書式でもできるがw こ、こんなのあったんですか・・。 春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。 わざわざVBAを使う必要無かったんだ・・・。 ___________ || || ⊂⊃ || ∧ ∧ || ( ⌒ ヽ でも勉強にナターヨ・・・ ∧||∧ ∪ ノ ( ⌒ ヽ 彡 V ∪ ノ フワーリ ∪∪
572 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 03:29:41 ] ほんとに色変えるだけなのかよwまいったw >>559 もそうだし、こういう奴、実は多いのか? 何という時間の無駄
573 名前:デフォルトの名無しさん [2008/10/19(日) 07:09:25 ] 悪いけど笑わせてもらう ァ ∧_∧ ァ,、 ,、'` 。゚( ゚^∀^゚)゚。,、'` '` ( ⊃ ⊂) '`
574 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 07:12:51 ] 関数でできることをマクロでやろうとしたり、案外よくあるよな
575 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 12:16:55 ] だんだんとワークシート関数がウザくなってくるんだよなw
576 名前:デフォルトの名無しさん [2008/10/19(日) 17:15:03 ] 暇だから何か問題だしやが……出して下さい
577 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:25:44 ] >576 Excel総合相談所74で質問が出てますよ。(レス番号325です)
578 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:49:32 ] プログラミング初心者かつエクセルにも詳しくない奴が、 この手ので延々悩むんよね 心理的ハードルを超えさせる書式の魔力おそるべし
579 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 21:31:47 ] >>576 4色問題お願いします。
580 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:29:21 ] >>577 ありがと 解決済みだった >>579 全ての図形が4色で塗り分けられるとかなんとかだよね 図形の形とか定義あるのかな? セルに色塗るなら二色で出来ちゃうし
581 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:33:43 ] 二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに 格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
582 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:43:16 ] >>581 あります 入力規則のリストなら、マクロの記録録ればわかります コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます 但しフォームツールのコンボボックスなら多分セル書き出し必須
583 名前:581 mailto:sage [2008/10/19(日) 22:50:06 ] >>582 すみませんコントロールツールボックスの方です シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…
584 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:51:02 ] >>580 4色問題ってこんな感じのです。 ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C
585 名前:デフォルトの名無しさん [2008/10/19(日) 22:59:02 ] >>584 ありがとう 1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす 2.領域ごとに、隣り合わせ同色にならないように色IDを付ける 3.色IDが1から4で収まっているか判定 っていうアプローチでよいかなあ アルゴリズムの問題っぽいがw
586 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:36:57 ] セルに依存しない計算は速いのですが結果をセルに 出力するのに時間がかかります。たとえば Dim X(10000, 10) As Double Dim I As Integer Dim J As Integer '計算 For I = 1 To 10000 For J = 1 To 10 X(I, J) = Sqr(I) * Sqr(J) Next J Next I ' 出力 For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = X(I, J) Next J Next I で出力の所要時間を計算時間と同程度にすることができるような 出力の書き方があれば教えてください。
587 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:32 ] For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = Sqr(I) * Sqr(J) Next J Next I
588 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:40 ] ちらつき抑制でよいかな? forの前に Application.ScreenUpdating = False を入れると、シートの描画しないから早くなる 少しずつ描画見たいなら、例えばNextの間に Application.ScreenUpdating = Tlue Application.ScreenUpdating = False を追加すると、Iが一つ進むごとに描画される 例えばIが100ごとに実行したいなら J Mod 100 使ったりできる
589 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:54:01 ] つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん
590 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:20:55 ] >588 21秒から13秒に8秒も短縮できました。ありがとうございます。 >589 具体的に「そのまま書き出す」ってどうすればいいんですか? よろしくお願いします。
591 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:29:07 ] >>590 >>589 じゃないけど、 range(cells(1,1),(cells(10000,10)) = X
592 名前:591 mailto:sage [2008/10/20(月) 00:30:17 ] タイプミス range(cells(1,1),cells(10000,10)) = X
593 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:36:38 ] base 1 にするのはお勧めできない。 変数に+1しる。
594 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:41:35 ] 592>> やってみました。1秒かからないんですね!ありがとうございました。
595 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:42:22 ] base 1 にするのはお勧めできないが 変数に+1するのもお勧めできない X(1 To 10000,1 To 10)にしる
596 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:49:07 ] すみません Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10) とするとコンパイルエラーがでるんですが・・・。
597 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:52:29 ] >>596 違う違うw 1 to 10000 とかを書くのは dim のとこ
598 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:56:26 ] Dim X(1 To 10000, 1 To 10) As Double でしたね。失礼しました。 みなさんどうもありがとうございました。
599 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 02:02:50 ] EXCEL XP, 2000, 2003, 2007において、 VBAはクアッドコアに対応しているの? コア4つのVBAはやはり処理が早いんだろうか・・。
600 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 04:35:01 ] >>582 余談だけどフォームの方もできる
601 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 06:43:22 ] すみません 文字列の入ったセルをselectした際に、単にselectにするだけではなく、 編集中の状態にまでもっていきたいのですが、 そのような方法を御存じないでしょうか。 select後、sendkeys"{F2}"で実現できるのですが、 Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
602 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 08:24:46 ] 数式バーで編集じゃだめなの?
603 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:42:57 ] Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?
604 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:52:14 ] >>603 Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
605 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:54:49 ] +1忘れた
606 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 14:05:48 ] >>604 d
607 名前:デフォルトの名無しさん [2008/10/20(月) 16:56:04 ] どこがVBAやねん
608 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 18:13:53 ] 春から悩んでたかも知れないじゃないか
609 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:11:15 ] >>599 まず、複数スレッドを作ることが実質的に無理だ。 Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
610 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:17:31 ] 依存関係ありまくりの計算だからなあ。
611 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:00:07 ] オートフィルターがオンになっているシートの選択行について、ソートと処理を 行った後、再度元の並びに戻す方法を模索中です。 1)選択行範囲の最後(列n)に式["=ROW()"]を設定 2)列nの式を値に変更(コピぺ) *ソートと処理を行う 4)列nで昇順にソートした後、列nを削除 この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け の領域が違うため貼付けエラーになります。 1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター 情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。 他にもっと良い方法をご存知でしたら御教授願います。 選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが データ量が三万件とかだとコピーにも多少時間が掛かるので...
612 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 17:29:28 ] >>611 仮に、"=row()" を入れた範囲を range("G5:G10") として、 G列を非表示にして、 range("G5:G10").value = range("G5:G10").value ってのはダメ?
613 名前:611 mailto:sage [2008/10/21(火) 18:27:03 ] >>612 助かりました、有難うございます。orz だけど、非表示だと何故上手くいくのでしょう?
614 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:33:32 ] どこがVBAの問題なのか春先まで悩みそうだ
615 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:41:59 ] >>613 わからん。なんかやってみたらできた 仕様なのかバグなのかも知らんw
616 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:01:59 ] 非表示だと pastespecial もうまくいくな どうやら仕様くさい
617 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:24:20 ] 初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが 無くよく分らなくてもし良かったら教えて下さい。 だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな くて困ってます。 10 for m=1 to12 20 print m 30 next m 40 stop なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
618 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:27:30 ] それはVBAじゃない。VBでもない太古のBASICのプログラム。
619 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:30:01 ] らしいです。VBAを覚えたいなぁ〜って言ったら色々言われて私が全然分からなく なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理 なんでしょうか;
620 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:50:26 ] もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。 VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。 敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。 そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
621 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:39:24 ] 釣られすぎ
622 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 23:24:21 ] 縦読みじゃないのね。
623 名前:デフォルトの名無しさん [2008/10/22(水) 07:27:31 ] Interiorってクラス名としてはどうなんですか?
624 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 10:00:18 ] 激しく紛らわしいからやめた方が良いかと
625 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 00:27:13 ] 自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった
626 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:16:21 ] そりゃクラスの内容に因るだろうな 個数や上限決めておらず、必要に応じて作る場合とか 1万や2万は当たり前に使ってることあるが ちゃんと配慮してれば全然問題ない
627 名前:デフォルトの名無しさん [2008/10/24(金) 11:20:18 ] 選択アドレスから重複を削除する方法はありますでしょうか? 例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス 範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。 Excelのステータスバー(右側)には重複を除いた合計値が表示されます。 これと同様の値(特定の1列のみ)をVBAで取得したいのです。
628 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:06:03 ] >>627 unionしちゃばOK
629 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:09:11 ] >>627 Sub test1() Dim rg1 As Range, rg2 As Range For Each rg1 In Selection.Areas If rg2 Is Nothing Then Set rg2 = rg1 Else Set rg2 = Range(rg2, rg1) End If Next rg1 Debug.Print WorksheetFunction.Sum(rg2) End Sub >>628 Unionは無理じゃない?
630 名前:629 mailto:sage [2008/10/24(金) 12:20:32 ] 今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・
631 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:22:27 ] >>629 ? range("$A$2:$A$5,$A$5:$A$10").cells.count 10 ? union(range("$A$2:$A$5"),range("$A$5:$A$10")).cells.count 9 ? union(range("$A$2:$A$5"),range("$A$5:$A$10")).address $A$2:$A$10 「特定の1列のみ」だそうだからOKかなと
632 名前:629 mailto:sage [2008/10/24(金) 12:29:12 ] RangeをUnionに書き換えたらいけたような気がするw
633 名前:デフォルトの名無しさん [2008/10/24(金) 14:52:48 ] 有難うございます。 Set rg2 = Union(rg2, rg1) に変更したら上手くいきました。 もう1つ教えて下さい。 選択された範囲の行を対象に特定の列(例では8列目)を以下の様に集計して いますが、選択範囲から集計範囲(特定列)への変換にもっと簡単なやり方が ありますでしょうか? Dim vals As Variant, i As Integer, c As Integer, addr As String c = 8 vals = Split(Selection.Address, ",") For i = 0 To UBound(vals) With Range(vals(i)) vals(i) = Range(Cells(.Row, c), Cells(.Row + .Rows.Count - 1, c)).Address End With Next addr = Join(vals, ",") Debug.Print WorksheetFunction.Subtotal(9, Range(addr))
634 名前:633 mailto:sage [2008/10/24(金) 16:24:56 ] 列の特定と同時に重複を削除しないと駄目のようです。 >>629 さんの方法に組み込むと良い様に思います。 Set r1 = Cells(rg1.Row, 8) Set r2 = Cells(rg1.Row + rg1.Rows.Count - 1, 8) If rg2 Is Nothing Then Set rg2 = Range(r1, r2) Else Set rg2 = Union(rg2, Range(r1, r2)) End If
635 名前:デフォルトの名無しさん [2008/10/24(金) 16:33:53 ] 質問です。 エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
636 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 19:46:01 ] 質問です 訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから 内容を読み出してテキストファイルに起こしたいのですが、 Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで 近しい形状の通常のアルファベットに置き換えられてしまうようです。 結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが 対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと 思って書き込みさせていただきました。 なにかお知恵などありましたらよろしくお願いいたします<(__)>
637 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:14:02 ] >>635 何を何処へコピーするのか
638 名前:デフォルトの名無しさん [2008/10/24(金) 20:26:20 ] 両面コピーって両面印刷の事?プリンタの話になるんじゃないの?
639 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:33:08 ] >636 元となるExcelファイルは、Excelのどのバージョンで作られたものですか? あるいは、どこの国用のExcelで作られたものでしょうか? VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに) ペーストすることはできたのでしょうか? ↓このサイトは見ましたか? www.microsoft.com/japan/office/ork/three/intd02.mspx Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス Unicode サポートの活用 「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
640 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:48:44 ] あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、 500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。 オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。 原因としてはどんなことが考えられるでしょうか?
641 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:53:05 ] サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。 その情報だけだと、メモリかCPU?としか言えない。
642 名前:デフォルトの名無しさん [2008/10/24(金) 21:55:54 ] >>635 sub 裏表印刷() 印刷実行 Msgbox ゛用紙裏面をセットしてください゛ 印刷実行 end sub
643 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:56:08 ] >>641 メモリっぽいですね。ちょっと調べてみます。 ありがとうございました。
644 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 22:09:55 ] >>640 DoEvents homepage2.nifty.com/kasayan/vba/doevents.htm
645 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 00:45:40 ] 636です >>639 動作環境を書くのをすっかり失念してました この手の質問には必須なのに…申し訳ありません OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。 現在VBA開発に使用しているxlsファイルは Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです 紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね (VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…) まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので Unicodeをサポートしていればうまく行くとは限らない気もしますが でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
646 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 07:04:27 ] オーバーフローの意味もしらないのかVBA厨房は
647 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 11:29:01 ] アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね
648 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 14:59:26 ] >>633 unionでいいんなら Sub test() Dim rg1 As Range, c As Integer c = 8 Set rg1 = Intersect(Union(Selection, Selection).EntireRow, Columns(c)) Debug.Print WorksheetFunction.Subtotal(9, rg1) End Sub
649 名前:デフォルトの名無しさん [2008/10/25(土) 15:46:42 ] どなたかお教えください マクロでたとえばですが ActiveCell.Replace What:="*", Replacement:="x" のように セル文字列の * の部分だけをxに変換したいのですが アスタリスクはすべて変換してしまいますよね。 A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって ほしいのですが。実際は x 担ってしまいます どのようにすればよいのでしょうか。
650 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 16:07:52 ] >>649 ActiveCell.Replace What:="~*", Replacement:="x"
651 名前:デフォルトの名無しさん [2008/10/25(土) 16:09:39 ] >>650 すごいですね。どうもです
652 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 17:06:03 ] 春先から悩んでた人多いな
653 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 18:11:57 ] >>645 参考になるかも ttp://codezine.jp/article/detail/1718
654 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 19:10:31 ] しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。
655 名前:デフォルトの名無しさん [2008/10/26(日) 03:08:58 ] 教えてください VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
656 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:24:14 ] >>655 明日の日付はDate関数に+1すれば解る 特定の日付が日曜日か否かはWeekday関数で解る 3週目か否かは日を算術演算すれば解る あとはそれらを条件に条件分岐してA1に値を代入すれば良い この説明で解らなければ>>1 ★5なので、さようなら
657 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:44:51 ] >>656 ありがとうございます。 算出演算ってのがよく解らないですががんばってみます。
658 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 06:05:51 ] だからエクセルでやれよ
659 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:35:27 ] だよな。数式でできるレベル
660 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:40:58 ] 質問です。 Excel2003を使っています。 コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが どなたか教えていただけませんでしょうか。 よろしくお願いします。
661 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 14:10:39 ] ちょっとは自分で調べる努力した?
662 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 15:32:19 ] >>660 コマンドボックスって何ぞや?
663 名前:660 mailto:sage [2008/10/26(日) 15:45:47 ] 聞いておいて遅レスごめんなさい。 コマンドボタンの間違いです。 色々調べてみたのですが、変数の定義の仕方そのものがよく理解できていなくて わからないなりに考えたのが↓です Sub test_Click() Dim h As Long h = Range("A1").Value If h = 0 Then h = 1 Else h = h + 1 End If End Sub もうちょっと頑張ってみます
664 名前:649 [2008/10/26(日) 15:48:36 ] お教え願いますか '=A1 という文字列を =A1 という数式に変換するマクロありますか。 同かよろしくお願いします。
665 名前:649 [2008/10/26(日) 15:50:36 ] 舌足らずでした あるセルに '=A1 という文字が書かれています。 マクロコマンド使って =A1 という数式に置換したいのですが。 どうかよろしくお願いします。
666 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:32:40 ] >>663 cells(1,1).value = cells(1,1).value + 1 >>665 Cells(1, 1).Formula = Cells(1, 1).Value
667 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:33:34 ] >>663 Range("A1").Value = Range("A1").Value + 1
668 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:43:51 ] こんなばかみたいな質問にいちいち答えるなよ
669 名前:660 mailto:sage [2008/10/26(日) 16:47:26 ] >>666 >>667 ありがとうございました。 一から勉強してきます。
670 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 17:06:11 ] 変数の定義ができないとか、 単純な代入式も書けないレベルの奴は入門書買え いちいち他人の手を煩わすな
671 名前:デフォルトの名無しさん [2008/10/26(日) 22:22:34 ] 初めて質問させていただきます。 初心者ではないですが、レベルは低いですσ^^; セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、 これだとなにか悪影響がありますか? 今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、 書き方が分からない時がある、ってことくらいです。 単に字数が少なくて済むからという理由で[**]形式にしているんですが、 ちょっと気になってます。 というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
672 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:45:34 ] 他の人が見たときに分かりにくいとか 少なくとも俺はわからん
673 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:19:11 ] 動作自体には問題ない あとは使う場面やメンテナンス性などを考えて使えば良い 複数人で扱う物には使わない方がいいし、汎用モジュールも然り 個人専用の使い捨てマクロの類なら[A1]形式でも医員で内科医 連続しない複数セルもしくは範囲を扱う場合なんかは便利なので 俺も他人が弄る可能性のないものでは使うこともある 『 [A:A,C:C,E:F].ClearContents 』とか『 [A3,C3:F10,H3:H10] = 0 』とかね 因みにうちでは『r""』のキー打ちで『Range("")』が入力され、カーソルが""の間に移動するので Range("A1")は、『 R " " A 1 』で済む為、[A1]でもRange("A1")でも入力字数は大差ない 俺の場合RangeよりCellsの方がよく使うが、Cellsも同じく入力省略出来るようにしてある
674 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:27:30 ] 簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、 本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、 初心者のうちからcellsで指定する方が良いと思うよ。 rangeと言えば、あくまでrangeオブジェクトである訳で・・・。 何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。 タッチ数も増えるしで、良い事ない。
675 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:28:39 ] 最後の3行が言いたかっただけちゃうかー
676 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:36:52 ] ?
677 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 00:10:33 ] [A1]なんて書き方知らなかった……。もっと精進するわ。
678 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 02:51:46 ] >>671 結局は evaluate の省略記法だから、excel に渡して評価させる分、 多少処理の無駄があるんじゃないかと思う(たぶん) [A1].value = 0 range("A1").value = 0 それぞれ10万回ループさせると数秒だが差が出る evaluate("A1").value = 0 は、[A1]記法とほぼ同じになる 誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は 避けた方がいいかもね
679 名前:デフォルトの名無しさん [2008/10/27(月) 09:49:00 ] [A1]だと後ろにピリオド打っても入力候補が出てこねぇ。 Cells(1,1)も出てこねー。 Range("A1")だと出てくる。 どれもいったんRange型変数に入れりゃ同じだが。
680 名前:デフォルトの名無しさん [2008/10/27(月) 10:57:11 ] pc11.2ch.net/test/read.cgi/gamedev/1217601153/ Syntax Error.しか知らないキチガイがあらわれました
681 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 11:57:01 ] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220150877 大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。 このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか? 【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23] gimpo.2ch.net/test/read.cgi/owabiplus/1224789237/ ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう gimpo.2ch.net/test/read.cgi/kaden/1222787235/ 【店員の質】ヨドバシカメラ総合17【落ちまくり】 gimpo.2ch.net/test/read.cgi/kaden/1215013408/ 補足 どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、 キノトロープスリーイントという会社( www.k-3int.co.jp/ )が請けたようです。 また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は 億単位で発生していると言われています。 キノトロープってどうよ?PART4 namidame.2ch.net/test/read.cgi/venture/1224762171/
682 名前:633 [2008/10/27(月) 14:06:59 ] >>648 おぉー、素晴らしい限りです! アクティブシート以外に対してIntersectは無理なのでしょうか?
683 名前:682 [2008/10/27(月) 14:21:18 ] 失礼しました。orz columns(c)を修飾したら出来ました。
684 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 16:04:05 ] >>682 書いた後で気づいたんだが、それ union いらないっぽいw ? selection.address $A$1:$A$5,$A$5:$A$10 ? selection.entirerow.address $1:$5,$5:$10 ? intersect(selection.entirerow, columns(8)).address $H$1:$H$10 intersect かけた時点で重複してる行はまとめられるから、 Set rg1 = Intersect(Selection.EntireRow, Columns(c)) だけでいいようだ
685 名前:682 mailto:sage [2008/10/27(月) 16:34:34 ] >>684 究極のリファクタリング有難うございます。orz こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...
686 名前:671 [2008/10/27(月) 22:41:20 ] みなさんいろいろご意見ありがとうございました。 RangeやCells形式も使いこなせるように、もっと勉強していきます^^
687 名前:デフォルトの名無しさん [2008/10/28(火) 10:08:01 ] もう1つ教えて下さい。 選択エリアの全行数は For each r in Selection.Areas rcnt = rcnt + r.Rows.Count Next で求めていますが、一気に知る方法がありますでしょうか?
688 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 18:29:27 ] >>687 一気に知る方法は知らないがそのままだと重複している行もカウントされる 少し前で話題に出たIntersectを組み込んで For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas とかにしたほうがいいんじゃないか?
689 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:48:43 ] 初心者って「一気に」とか「1行で」とか好きだよな
690 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:14:07 ] コードが長くなると理解できなくなるんだよw
691 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:47:58 ] 関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。 もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。
692 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 01:54:25 ] 学習が下手な奴ほど早く学習する事が1つだけある それは「人に訊いた方がラクだ」という事だ なんちてw >>687 一般的なやり方じゃないかも知らんが一応これで行けそう 重複行込み rcnt = selection.entirerow.cells.count / activesheet.columns.count 重複行抜き rcnt = intersect(selection.entirerow,columns(1)).count
693 名前:デフォルトの名無しさん [2008/10/29(水) 02:45:55 ] ループの中で =average() の引数を可変的に指定する方法を教えてください 具体例: (1)乱数で10個のデータを生成し,列方向に保存 (2)保存したデータから平均を計算し, 2つ下のセルに出力 (3)上記(1)から(2) を n回繰り返す(とりあえずn=3). 上記(2)がうまく計算できません(下から3行目のコード). --------------- Sub dice_siml01() Cells.Clear Dim i As Integer Dim j As Integer Dim n As Integer Dim nobs As Integer Cells(1, 1) = "試行回数" n = 3 nobs = 10 For j = 1 To n For i = 1 To nobs Cells(i + 1, j + 1).Formula = "=randbetween(1,6)" Next Cells(nobs + 3, j + 1).Formula = "=Average(Range(Cells(2, j+1), Cells(2+nobs-1, j+1)))" Next End Sub --------------- 【注】 randbetween(1,6) エラーの場合 rand()で置き換えてお願いします.
694 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 03:31:17 ] >>693 .formula に入れるのはセルにそのまま打ち込める式 範囲指定のところが "B2:B11" とかの形式になるように、 文字列を生成すればOK
695 名前:デフォルトの名無しさん [2008/10/29(水) 09:46:54 ] >>694 どうもありがと。 できれば、具体的な変換方法もお願いします。
696 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:03:37 ] >>695 宿題か何か? デカい誤り指摘してヒントも出したんだから、 そこからもっぺん自分で考えてみような じゃなきゃこんな練習問題やってる意味ないだろ
697 名前:687 mailto:sage [2008/10/29(水) 10:09:55 ] >>688 >>692 有難うございます。 「聞くは一時の恥じ...」 なんちてw セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう けど速度やメンテを考えるとコードは単純な程良い。
698 名前:デフォルトの名無しさん [2008/10/29(水) 10:36:40 ] >>696 これ以上は分からん。
699 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:37:47 ] >>697 あ、速度考えるなら intersect とか濫用しない方がいいよ 10万回ループさせると>>692 より>>687 の方が早いんで
700 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:16:46 ] >>697 >けど速度やメンテを考えるとコードは単純な程良い。 これは少し間違ってる気がする 速度を考えるなら処理するデータを単純にした上でコードも単純なものにする 例えばセルのプロパティを変数に入れるとか さらにメモリの使い方にも気を配れればいい 書くと短くても動かすと重たい処理なんてたくさんあるし
701 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 16:48:37 ] コードの見た目(行数、文字数とか)が単純なのと、 実際の処理が単純なのは違うよね あと>>699 の自己フォローなんだけど、 selectionの状態に依存するわな、、、w areasが2-3ぐらいなら>>687 の方が早いってことで
702 名前:デフォルトの名無しさん [2008/10/29(水) 21:27:30 ] 置換に関しての質問なのですが、 検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?
703 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:39:33 ] hoge = "あくまで一例" set piyo = cells.find(hoge).offset(0,2) piyo.value = piyo.value & "1"
704 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:57:52 ] 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
705 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:01:22 ] 丸投げはやめようぜ。 自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。 作成依頼所じゃないんで。
706 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:03:28 ] すいません、数値がずれまくりました。 もう一度書き込ませてください。 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 @ A B A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
707 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:05:26 ] >>706 >705
708 名前:デフォルトの名無しさん [2008/10/29(水) 22:22:44 ] >>703 さん ありがとうございます!! A列全部で検索かけたい場合どうすればいいでしょうか?
709 名前:704 706 mailto:sage [2008/10/29(水) 22:27:40 ] 申し訳ございませんでした。 EXCEL総合相談所で聞いてきます。 マルチになってしまいますが、ご了承ください。 レベルが上がったらこのスレに来たいと思います。
710 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:42:39 ] >>708 2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
711 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:45:03 ] 他のレスと混同してた・・・
712 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:03:32 ] >>708 cells はセル全部 columns(1) は1列目 ヒントはここまで。
713 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 03:25:08 ] >>706 ズリネタとして結構面白かった
714 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:00:44 ] dim rg as range rg=activecell 処理 この処理後に、元のアクティブセルに戻る文が書けません。 どんなだったか、教えて。
715 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:07:50 ] もう一個、よろしく。 処理の中で範囲を指定してコピー、貼付をしている。 application.screenupdating=false を直前に入れても 画面が動くのですが、画面が動かないようにできませんか?
716 名前:y mailto:sage [2008/11/02(日) 18:36:29 ] >>714 rg.Parent.Activate rg.Avtivate ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。 >>715 CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、 一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
717 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:37:54 ] >>716 久しぶりなので、マクロの記録で、終わってましたorz おかげで、思い出すことが出来ました。 サンクス。
718 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:51:29 ] >>716 その2行目も・・・
719 名前:デフォルトの名無しさん [2008/11/02(日) 20:57:01 ] プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック を開き、データブックのイベントに対する処理をしています。 Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様 です。 Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。 方法をご教授頂けると有難いです。
720 名前:y mailto:sage [2008/11/02(日) 22:45:44 ] >>718 うは ご指摘ありがとうございます。 >>719 ×ボタンでBeforeCloseイベントが発生するので、 同イベントプロシージャ内に Application.Quit を記述します。
721 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:00:30 ] range型変数にsetしてないってのは突っ込んじゃいけない所? 最近、微妙な空気が読めなくなってきたよ・・・。
722 名前:719 [2008/11/02(日) 23:24:17 ] >>720 自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。 SnendKeys(Alt+F4)を試したら終了できました。orz
723 名前:719 [2008/11/03(月) 00:23:33 ] 訂正です。 SendKeys(Alt+F4)でもだめでした。 プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に 変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4 を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
724 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:25:16 ] >>722 application.quit の前にワークブックの close やってる? 後にしてみたらどうなる?2007はわからんけど、、、
725 名前:722 [2008/11/03(月) 00:44:26 ] >>724 もう少し具体的に教えて下さいませんか。 2007以外は×ボタンでExcel終了が終了するようになっています。 同じブックを2007の互換モードで動かして×ボタンでExcelを終了 したいのです。 この方法が分からないのです。
726 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 01:21:12 ] >>725 あ、ごめん ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html この辺の問題のことだったの。 2007以外ではいけてるなら関係ないね。失礼した
727 名前:y mailto:sage [2008/11/03(月) 07:57:50 ] >>725 2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね? 一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。 VBAでのやり方は、後で職場の2007で探してみます。
728 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 09:09:42 ] range型ってsetしなくても使えるの?
729 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:14:59 ] 範囲指定をしてコピー等をした後、コピーモードををフォルスにした 後のことです。 範囲指定を解除する方法は、どこかのセルをactivateやselectするしか 方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を したくないのですが、何か方法が無いでしょうか?
730 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:51:57 ] 久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。 >>725 724は具体的に言ってるでしょ。 ダイアログが出るために終了できないのならダイアログが出ないようにすれば? どうしてダイアログが出るの? ブックが変更されてるのに保存されてないからでしょ? だったら保存したら? こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。 >>729 全体的に何がいいたいのかよくわからない気がする。
731 名前:デフォルトの名無しさん [2008/11/03(月) 10:54:12 ] どうしてもわからないので 教えていただきたいのですが、 Book1を起動して Book1のマクロで Book2を開くことはできたのですが Book2の内容をコピーして Book1に貼り付けすることができません よろしくお願いします。
732 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:59:28 ] >>729 ググってもすぐ見つかるし マクロの記録でもすぐ解るようなことを何故聞く? そのものズバリの解除法が簡単に見つかるのに >>731 Bool2を開くと、戻り値としてBool2のオブジェクトが返る あとは好きなようにコピーなりなんなりすれば良い
733 名前:725 [2008/11/03(月) 11:12:00 ] >>730 保存するかどうかはユーザーが決める事で、プログラム側で決められる のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。 説明不足?それとも...
734 名前:725 [2008/11/03(月) 11:17:49 ] >>730 719に記述した通りなんだけど...
735 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:25:31 ] >>734 だから? ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。 お前さんが検証もせずそう思い込んでいるだけにすぎない。 全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
736 名前:デフォルトの名無しさん [2008/11/03(月) 11:43:21 ] >>735 確かに、Excel2000と2007で同じブックを動作した検証で違いが出た だけですが...
737 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:48:40 ] API
738 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:06:15 ] もしかして、.saved や displayalerts の値はいじらずに、 組み込みダイアログをそのまま使ってるのかな?>>733 組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、 ユーザに選ばせるなら自前でやった方が確実かも
739 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:23:48 ] >665 たとえば、セル(4, 3)に '=A1+A2が記入してあり その式をセル(5, 1)に書き込む場合 Cells(5, 1) = Mid$(Cells(4, 3), 1) でどうでしょう?
740 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:33:08 ] いつの話だよ
741 名前:デフォルトの名無しさん [2008/11/05(水) 10:16:29 ] ? ActiveSheet.UsedRange.Rows.Count これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。 これって、仕様ですか?
742 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:06:19 ] >>741 イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる ?1+1とかでも同じ でもウォッチ式として使えば問題ない
743 名前:742 mailto:sage [2008/11/05(水) 11:11:33 ] 今試したらウォッチ式でもだめだった orz
744 名前:741 [2008/11/05(水) 15:12:16 ] セルの選択範囲が変更になったとき、最終行を調べたいのですが ? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row だと、保護されたシートの時エラーになってしまう。 他にUndoを生かしたまま最終行を求める方法あります?
745 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:17:36 ] >>744 ?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()) でどう?
746 名前:デフォルトの名無しさん [2008/11/05(水) 16:42:43 ] >>745 有難うございます。 ? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row で出来たのですが、列を特定しないと駄目なのですよね。 自分も気付いたのですが、 保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法 もありますね。
747 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:26:47 ] 超初心者なのですが、グラフ作成のところで詰まってしまいました。 B2を起点とするデータ 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
748 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:13:25 ] >>747 set mySouce = の時は、データの入ってるワークシートが アクティブになっててその書き方で行けるんだけど、 set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、 range("B21") がどこにあるのかわからんってさ
749 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:51:43 ] >>748 なるほど!!明快な説明ありがとうございます。 つまり、set mySouce2 = の前に、 データが格納されているシートをセレクトすればよかったのですね。 対処だけでなく原因が分かりためになりました!
750 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:11:14 ] >>749 そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、 最初にまとめて下準備しちゃえば効率がいいよね selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
751 名前:デフォルトの名無しさん [2008/11/06(木) 18:01:30 ] ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが Dim rng as Range Set rng = ActiveCell rng.Value = x この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。 もう少しましな方法を教えて頂けるとありがたいです。
752 名前:デフォルトの名無しさん [2008/11/06(木) 18:14:58 ] >>751 Format(x, ActiveCell.NumberFormatLocal) セルの書式によってはバグるかも試練がw
753 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:35:33 ] そうなんです [G/標準]とかでエラーになる為、セル代入を考えたのですが...
754 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:50:58 ] 「セルの書式に合わせた文字列に変換」でいいのね ? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal)) とかは?
755 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:12:31 ] TEXT関数か・・・ならば worksheetfunction.text(x, activecell.numberformat) これでどうかな?
756 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:20:37 ] >>755 書式に和暦や曜日が指定されてるとヘンになるよ そういうの無視でいいならいいんだけど
757 名前:デフォルトの名無しさん [2008/11/06(木) 19:35:05 ] しつこいようだけど、頼む。 セルについて指定無しの状態にするすることは可能ですか? set rg = nothing とか試してみたけどだめだったorz
758 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:44:51 ] >>757 ほんとしつこいなぁ、、、って誰?w というか、質問の意味がわからない >>756 自己レス 曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
759 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:15 ] >>757 以前やってみようとした事があったけど見つからなかった 本当に出来るのかどうかも不明 >>758 お前頭悪そうだな
760 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:56:56 ] >>759 質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
761 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:01:11 ] 質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。
762 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:10:08 ] >>761 そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ 質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
763 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:46:09 ] 喧嘩は他所でスレ立ててやれよ 目障り
764 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:18:48 ] 自己紹介乙
765 名前:デフォルトの名無しさん [2008/11/06(木) 21:53:02 ] >>763 おまえは引っ込んでろ! このカス。
766 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 04:10:27 ] 俺も >>757 の質問がよくわからないし つか、前に質問したなら名前欄にレス番とか入れてくれ
767 名前:569 mailto:sage [2008/11/07(金) 06:17:38 ] フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・) 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
768 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 06:18:18 ] すんません。上のやつ>>569 さんじゃないです・・・。名前に入っちゃいました。
769 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 08:44:46 ] >>767 >そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか? 試した? 試してもいないのに質問しに来てない?
770 名前:751 [2008/11/07(金) 09:34:48 ] >>754 >>755 >>758 ありがとうございます.orz 754さんの方法でグーですね。
771 名前:751 [2008/11/07(金) 09:47:36 ] ついでにもう1つ教えてください。 xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別 するにはどうしたらよいのでしょうか? ? Application.WorksheetFunction.IsError(x) だとエラーにならないのですが...
772 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:00:12 ] どういうエラーでそのxが何か分からないと答えられない セル(Range)なのか数値や文字なのか
773 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:09:03 ] >>767 「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
774 名前:771 [2008/11/07(金) 10:50:19 ] 入力したテキストxでAutoFilterの設定・解除をしています。 (フィールドはアクティブセルの列) この時、xの書式をアクティブセルの書式への変換は >>751 さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に Set rng = ActiveCell: rng.Value = x if WorksheetFunction.Iserror(rng) とすると、アクティブセルの保存が必要になってしまう為もう少しましな 方法を模索中なのです。
775 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:54:09 ] >>769 ちょっと試せない状態だったのでとりあえず聞きました。 >>773 ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。 お騒がせしました。
776 名前:デフォルトの名無しさん [2008/11/07(金) 13:14:43 ] 初歩的な質問なんですが、 intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。 二つ目の変数に別のアクティブセルを代入するとerror13が現れます。 どなたかご教授願えないでしょうか?
777 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:47:26 ] >>776 アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
778 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 15:38:15 ] >>776 Error 13は「型が一致しません。」だから 単純にint型に文字列(スペース含む)を代入しようとしてるとか? セルが空なら0が入るし
779 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:04:36 ] 膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ
780 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:10:46 ] >>774 x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ? いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
781 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:27:19 ] 説明が下手な奴大杉
782 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:54 ] 説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが 殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
783 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:45:31 ] >>782 よく分からない論理だな。
784 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:12:21 ] わからんではないが、そこまで言い放つことでもない 甘え放題も困るが委縮させ過ぎるのもよくない 意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
785 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:17:57 ] ヒマだからスレ読み返してたらわかったw >>757 =>>729 だね。たぶん>>715 も同じ人っぽい screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく off にしたらしっぱなしになる位置でやらないと 範囲指定を解除(セルが select されていない状態に)する方法だけど、 高さ・幅 0のイメージを用意してそれを select すれば、 selection が range でない状態にすることはできる activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
786 名前:デフォルトの名無しさん [2008/11/08(土) 17:49:36 ] >>785 ベリー、ベリー、サンクス お見込みのとおり、その3つは折れです。 展望が開けました。 サンクス。
787 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 08:43:30 ] Enumとして宣言さている列挙型のmember名をStringとして取得できますか?
788 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:32:30 ] 販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
789 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:34:07 ] だれのための、どういう報告なの?
790 名前:788 mailto:sage [2008/11/09(日) 11:36:43 ] 販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、 xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
791 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:53:23 ] >>787 スレ違い それはVBAではなくVB言語の質問だ >>790 あるけど、それはWindowsの設定の問題だ
792 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:57 ] windows弄ったら出来るのかー。 ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。 VisualStudioからEXCELのコントロールわからんしな;;
793 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ] できないだろ 無理にやると普通に開けなくなるだろ バッチファイルかWSHにドロップして 引数を環境変数に設定して xlsファイルを開き 環境変数を見る
794 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:43:56 ] いつもそんなことやってるの?
795 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:34:55 ] >>790 普通にアドインを作れば解決するケースに思えるけど。
796 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:03:05 ] アドイン??
797 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:16:11 ] >>795 教えてくれ
798 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:31:57 ] 「Excel アドイン」でググってトップのところに詳しい説明があるから それを読んだ方がいいよ。 VBAのコードが普通に書ける人ならすぐに理解できると思う。
799 名前:788 mailto:sage [2008/11/09(日) 21:34:13 ] >>795 >>798 まさにこれだ!!! ありがとう!!!
800 名前:655 mailto:sage [2008/11/10(月) 00:15:33 ] >>655 If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then Range("A1").Value = "明日は第三週の日曜日" End If 正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
801 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 10:07:40 ] >>786 書いて良かった。誰?とか言ってゴメンなw >>790 処理対象ファイルが自動的に特定できれば一番ラクそうだけど、 人間が見ないと特定できないの? あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理? 正直、アドインにする利点がピンと来ない、、、
802 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 11:51:04 ] >>801 販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。 たとえは今日なら20081110.xlsって手打ちで名前をつけてね。 それをこのマクロの入ったBook1.xlsから呼び出すんだ。 それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
803 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:55:12 ] >>802 >販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。 保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね? 一々保存してからマクロ動かさないといけない理由でもあるのか?
804 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:58:20 ] >>802 なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
805 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 13:33:50 ] 今までが無駄過ぎただけだな。
806 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:03:48 ] >>803 保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
807 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:05:19 ] >>804 それがアドインかと思ってたorz orz
808 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:24:04 ] >>804 そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
809 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:26:46 ] >>808 ツールバーにマクロ登録すると その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
810 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:30:27 ] うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?
811 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:40:33 ] マクロが記述してあるだけのブックを用意して そのマクロをツールバーに登録するんだよ ネットワーク越しでも大丈夫だし
812 名前:デフォルトの名無しさん [2008/11/10(月) 23:38:11 ] 初心者なので、丸投げでお願いします。 application on timeを使って、 開始したら、 a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を やって、終わる。 というものです。 どうにも、最近、頭が回らなくなって困ってます (~.~)
813 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:48:19 ] はい次の話題
814 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:02:20 ] 812の追記 処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と いうことでお願いします。
815 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 01:31:29 ] A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。 Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが) abc ="08/11/11"; sscanf(abc,"%d/%d/%d",&a,&,b,&c); printf("20%02d%02d%02d",a,b,c); VBAで書くにはどんな関数使えばいいのでしょう。
816 名前:812 mailto:sage [2008/11/11(火) 01:45:58 ] 自己解決できましたので、 >>812 814はスルーでよろっ。
817 名前:815 mailto:sage [2008/11/11(火) 02:02:40 ] 文字列操作でこうやってみた tmpdate_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
818 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 02:09:50 ] >>815 いったん日付型にしてから書式変換するとラクだと思う 文字列→日付型への変換は cdate() 日付型→書式付文字列変換は format() 詳しくはヘルプ読んでね
819 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:44:30 ] すいません質問です エクセルのマクロで module1内にコード書くのと sheet1内にコード書くのとでは 動作にどんな違いがありますか? sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
820 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:50:39 ] 訂正)Selection→Select
821 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 20:51:01 ] >>445 で解決しましたすいません
822 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 21:15:30 ] こんばんは 複数のセルの値を一度に比較することってできますか? Sheet1のA1:B5とSheet2のA1:B5のValueが 同じであるかどうか、が分かるだけでokなのですが。
823 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:20:52 ] 各シートは配列のようにアクセスできるが
824 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 01:57:12 ] >>822 配列数式でできるよ
825 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 05:52:03 ] Excel2003を使っています。 羅線の太さを調節する方法ってありますか? できるだけ細くしたいのです。
826 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 06:21:13 ] >>825 マクロの記録使って保存すればおk 単純に細くするだけの質問ならスレチ
827 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:48:05 ] Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512 セル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 どうやったら速度アップできるか知りたいのですが...
828 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:52:09 ] 羅線ってなんだ? らせん?
829 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 13:26:01 ] 螺旋 罫線 新羅 確かに間違える人は居るかも
830 名前:827 mailto:sage [2008/11/12(水) 14:59:51 ] やりたい事は シート・アクティブ時にコピー挿入し編集 シート・ディアクティブ時に挿入データを削除(元の状態に戻す) なのです。
831 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:02:57 ] > 1回目:13秒 > 2回目以降:54秒 (Pasteに変更すると29秒) 単位、「秒」じゃなくて「_秒」の間違いだよね?
832 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:15:35 ] 秒です。
833 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:17:38 ] セルを結合していなければ1秒未満です。
834 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:20:33 ] いや、結合していても_秒でしょ
835 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:34:39 ] 結合云々は関係なく1秒かからんな データは何かあるのか? とりあえず高速化のために Application.ScreenUpdating=False はやってるよな?
836 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:54:59 ] 新規ブックでセルをマージし、>>827 のコードを走らせただけです。 ScreenUpdating, EnableEvent, Calculation等もやってみています。 マシン・スペック(5年前)の問題でしょうか?
837 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:15:36 ] スペックは漏れのマシンのほうが悪いくらいのはずw 計測方法の問題じゃないか?
838 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:54:32 ] すまん、Mobile Pentium4の間違いだったorz
839 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:23:09 ] Mobile Celeron(1200MHz)512MB RAM Mobile云々は置いといてこっちは1.2GHzなんだよw OSが2kだからってここまで差は出ないよな? 体感でも1秒以上かかってるのか?
840 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:38:52 ] excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512 でセルA1とB1を結合して走らせてみたら 1回目:9秒 2回目:40秒 体感で1秒未満は、セル結合無しの場合だけ
841 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:53:33 ] あぁA1とB1を結合かw それなら確かに遅くなるな
842 名前:827 mailto:sage [2008/11/12(水) 18:00:26 ] >>827 のA1とA2はA1とB1の結合に訂正願います orz
843 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 18:03:34 ] 俺の古典的環境だと1回目20秒、2回目1分40秒w 遅過ぎワロタw
844 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:23:38 ] >>830 どこまでが編集前でどこからが編集後? 編集は .mergecells = false の前?後?
845 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:30:46 ] *)シート(A1とB1結合)アクティブ時の処理 rows(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
846 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:40:02 ] メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?
847 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 12:31:54 ] >>845 了解 多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、 シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね オレなりに試してみた限りでは、 挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ コピーし、狭間へ 1行目を 20000行分コピー 削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す ( .mergecells = false もいらない) ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
848 名前:845 mailto:sage [2008/11/13(木) 13:26:06 ] >>847 有難うございます 挿入処理は、 insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです 削除処理は、 ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます
849 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:21:48 ] >>848 名前か。それは厄介だ 挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし insert だけでも 2回目は遅くなるし 後は、編集時にシートコピーしたシートを使っといて、deactivate されたら シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、
850 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:26:26 ] シートのコピーから戻す方式を試したら更に時間が掛かる様になってしまった
851 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 18:16:20 ] >>850 データ量や数式、書式設定その他によってかなり違うだろうね オレのはあくまで>>827 の条件で試しただけだし
852 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:52:40 ] >>847 の処理における名前付き範囲は、挿入時に range("namedarea").offset(20000).name = "namedarea" コピーバックの後に .offset(-20000) で、わりと簡単に対応できた 画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
853 名前:851 mailto:sage [2008/11/14(金) 00:13:24 ] とりあえず、A2:Z3000 をテキトーな数式で埋めて試して見たけど、 やっぱ>>847 のが早かった。calculation 切れば数式なしの時とあんま変わんない とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは 効果ないかも
854 名前:デフォルトの名無しさん [2008/11/14(金) 21:41:28 ] はじめまして、こんばんは。 今日はじめて本屋にて VBA の存在を知りました。 初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか? 詳しいかた教えてください。
855 名前:デフォルトの名無しさん [2008/11/14(金) 22:05:58 ] >>854 例えば野球データベース 選手名を入力すればその選手のプロでの全成績が一覧表示されるとか インベーダーゲーム作ってる人もいるよ とにかくExcelをVBAプログラムで自在に操れるって事
856 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:22:40 ] >>854 業務で言うと、データベースをexcelに展開して、 色んなチェックプログラムを掛けて品質保証したりとか。 ワークシートで使える関数を作って会社内に配布したり。 excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
857 名前:無職カス [2008/11/16(日) 02:50:07 ] みなさん、こんばんは、 >>854 です。 >>855 >>856 さん 返答ありがとうございます。かなり使える機能ですね。 最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。 これからVBAを勉強していきます。 多々質問すると思いますが、みなさんよろしくおねがいします。
858 名前:デフォルトの名無しさん [2008/11/16(日) 03:45:10 ] 下に全員の成績表があって、 そこから各部門のトップ5を上の小さい表に抽出したいんだけど、 ランクとは違う気がするし行き詰っています。 どなたかご教授願えますでしょうか?
859 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 05:08:38 ] officexpのマクロと関数の処理順(と思われる事項)で知恵を貸していただきたく書き込みいたします。 セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、 セルBの書式が自身の値によって変わるようにマクロを組もうとしています。 (書式は4種類以上なので条件付き書式は使えません) worksheet_changeで書式変更を自動実行するようにしたのですが、 マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります) その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、 マクロ自体には問題はないようです。 おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために マクロによる変化が見られない状況であると思っています。 (違っているなら根本から考え直さないといけないかもしれませんが) このような構成の場合、関数による値の変更が反映された後で 書式変更などのマクロが実行されるようにすることはできないのでしょうか? ご教示お願い申し上げます。
860 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:11:55 ] Calculate
861 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:51:08 ] >>860 ご回答ありがとうございます。 5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら 既にお答えくださっていたのですね。 初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
862 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:13:30 ] >>857 基礎を勉強するには独学でも全然問題ないけど、 プログラム未経験で、かつ仕事に就いてないとなると、 プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。 んで、そこから先は明確な目標が無いと無理。 やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。 例えば>>855 でゲームの話が出てたけど、確かに作る事は出来る。 けど、VBAからAPI呼び出してるに過ぎないし、更に言えば タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。 ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。 Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。 何か目標持った方が良いよ。
863 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:15:00 ] >>859 calculate使う理由が分からん・・・。 VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
864 名前:独り言(ちら裏) mailto:sage [2008/11/17(月) 01:24:05 ] というか、条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に 問題ありかと... それがExcelのポリシーというのであれば、そういうアプリめいたものを Excelで作ることが間違いだったということになるか...
865 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 10:16:53 ] > 条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に > 問題ありかと... という意見が多いので、2007で設定数が 3 から 無制限 に、 優先順位も設定を書き直さずに変更できるようになった。
866 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 14:02:59 ] ということで、Excel2007以降の購入をお勧め
867 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:07:26 ] てゆーか、条件によって変化するセルの書式の種類は3つに留めておく というのが無難かと
868 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:50:10 ] >>864 selection changeイベントで好きなだけ設定しろ。 おまいのVBAは飾りもんか?
869 名前:デフォルトの名無しさん [2008/11/18(火) 17:07:45 ] これのFSO(FileSystemObject)使ってテキストデータの読み込みすると文字化けします。 ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?