1 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 22:36:18.78 ] 01 pc11.2ch.net/test/read.cgi/tech/1054356121/ 02 pc11.2ch.net/test/read.cgi/tech/1168308855/ 03 pc11.2ch.net/test/read.cgi/tech/1180192018/ 04 pc11.2ch.net/test/read.cgi/tech/1189814602/ 05 pc11.2ch.net/test/read.cgi/tech/1197448064/ 06 pc11.2ch.net/test/read.cgi/tech/1205231499/ 07 pc11.2ch.net/test/read.cgi/tech/1212587819/ 08 pc11.2ch.net/test/read.cgi/tech/1219673793/ 09 pc11.2ch.net/test/read.cgi/tech/1228372971/ 10 pc12.2ch.net/test/read.cgi/tech/1235332603/ 11 pc12.2ch.net/test/read.cgi/tech/1241885130/ 12 pc12.2ch.net/test/read.cgi/tech/1247566074/ 13 pc12.2ch.net/test/read.cgi/tech/1254281104/ 14 pc12.2ch.net/test/read.cgi/tech/1262748898/ 15 pc12.2ch.net/test/read.cgi/tech/1271261239/ 16 hibari.2ch.net/test/read.cgi/tech/1280045912/ 17 hibari.2ch.net/test/read.cgi/tech/1289182437/ 18 hibari.2ch.net/test/read.cgi/tech/1298240666/ 19 hibari.2ch.net/test/read.cgi/tech/1305754555/ 20 hibari.2ch.net/test/read.cgi/tech/1312435844/ 前スレ: Excel VBA 質問スレ Part21 hibari.2ch.net/test/read.cgi/tech/1316931607/
82 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 06:47:38.01 ] 最近vbaの勉強始めた 大村あつしさんの参考書使ってる 4月までには使えるようになりたい プロ野球の選手成績を管理したいんだ 野球ゲームの成績まとめでも使いたいし
83 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 08:39:20.32 ] >>81 なんてメッセージ出てんの?
84 名前:デフォルトの名無しさん [2011/12/07(水) 19:26:41.10 ] >>83 メッセージはなにも出ないんだ。 みんなも個人用マクロブックを作ってたらそうなってるんでしょ?
85 名前:デフォルトの名無しさん [2011/12/07(水) 19:27:27.27 ] >>82 yuzuru.2ch.net/test/read.cgi/gamespo/1323059897/14- あなたはこの人ですか?
86 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 20:52:36.60 ] >>78 activateしないとできないのは、copyメソッドとかpastespecialメソッドとかでしょ 他にもあったっけ なぜできないのか、この辺の理屈がどうも分からないんだよな〜
87 名前:デフォルトの名無しさん [2011/12/07(水) 21:12:04.89 ] Pasteメソッドが、シートに対して行うというのも理解できない。 なぜそういう仕様になってるかおわかりのかたいらっしゃいますか?
88 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 23:17:29.91 ] お知恵を拝借させてください。 下のように右クリックメニューから選択範囲のセルを塗りつぶす、みたいなことがしたいのですが、 「引数は省略できません。」のエラーになります。 どうすれば引数(例:34)を渡せますでしょうか? Sub addMenu() Dim CB Set CB = Application.CommandBars("Cell").Controls.Add() With CB .Caption = "塗りつぶし" .OnAction = "setColor(34)" End With End Sub Sub setColor(col As Long) With Selection.Interior .ColorIndex = col End With End Sub
89 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 00:05:42.28 ] >>88 パージョンいくつ? .OnAction = "'setColor(34)'" 又は .OnAction = "'setColor 34'" じゃないかな?(シングルクウォートで括る。) ちなみに複数の引数を渡したい時は、自分の知ってる限りでは .OnAction = "'setColor 34,4'" とかでうまくいくハズ
90 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 02:25:45.46 ] >>87 仕様の理由はわからんけど、動作見る限りエクセルVBAって 人が操作する動作をトレースしてるだけだから 手動で出来ないことはVBAでも出来ないってコトでいいんじゃね? だからコピーもペーストもシートをアクティブにしないと出来ないと。
91 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 09:27:07.74 ] >>90 VBの機能も使えるから出来ることは同じじゃない
92 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 12:48:05.58 ] >>86 ,90 Sub test() Sheet2.Activate With Worksheets("Sheet1") .Range("C1:C5").Copy .Range("D1:D5").PasteSpecial _ Operation:=xlPasteSpecialOperationAdd .Paste (.Range("E1:E5")) End With End Sub 別にシートがアクティブじゃなくても使えますが? >>87 (この場合の)Pasteメソッドがシートのメソッドなんだから対象がシートなのはまあ当然 RangeにPasteメソッドが無い理由なら解らん。PasteSpecialはあるのにな どうせ操作対象をちゃんと指定してないから、アクティブシートが対象になってるだけだろ アクティブじゃないとできない操作の実例教えてくれ
93 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 14:00:27.28 ] Activateが必要だと思ってる奴はド素人
94 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 19:50:51.44 ] どうせExcelのバージョンで挙動が違うとかいうオチだろ。 実際に使われる環境で正しく動けば、それで良いじゃん。
95 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 22:05:52.74 ] >>89 できました!ありがとうございました。 バージョンは2003と2007です。
96 名前:デフォルトの名無しさん [2011/12/08(木) 22:14:25.21 ] さまざまな処理を各プロシージャが担当させるようにし 本体プロシージャはシンプルそのもの、 そしてプロシージャから他のプロシージャを呼び出しまくるような かっこいいプログラミングがしたいです。 そんなスキル (=プロシージャを呼び出しまくるスキル) を学ぶに特化した学習用の本があれば紹介していただけますか?
97 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 06:29:49.64 ] 最近学習を始めたばかりの初心者です わからないことがあったので質問させてください VBAを使って 1、2500、5000、7500 の4つの数字をランダムで選ぶ そしてこの動作を繰り返す というプログラムはどうやって書けば良いのでしょうか よろしくお願いします
98 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 06:43:25.56 ] 丸投げいくない
99 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 06:54:05.47 ] >>98 すいません できるか出来ないかだけでも教えていただけますか? この4つをMT乱数を用いて選び出したいんです そしてこの試行を繰り返す、という動作です
100 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 07:12:39.98 ] 数字を配列変数に代入 乱数を取得 乱数の3の余剰を求める 前記余剰を配列番号に与えてアタイを撮る
101 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 07:17:25.61 ] 数字を配列変数に代入 乱数を取得 乱数の3の余剰を求める 前記余剰を配列番号に与えてアタイを撮る アタイをLogに出力 の上記をひたすら気が済むまでLoopする
102 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 07:46:34.64 ] >>97 0〜3もしくは1〜4の整数の乱数の出し方知ってる? 配列(0)に1 配列(1)に2500 配列(2)に5000 配列(3)に7500 に入れておいて0〜3の乱数で3が出たら配列(3)の値を取得すればいい。 配列が分からなければCellsを使ってもいいだろう。 そんときゃA1〜A4に希望する数値を入れて1〜4の乱数を求め4が出たらCells(4,1)の値を取得すればいい。 最近は配列に入れないでCollectionに入れるDQNがいるけど。
103 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 07:52:19.50 ] >>99 もちろん「できる」 ところでVBAの乱数って内部アルゴリズムは公開されてたっけ? MT乱数の使用が必須条件なら自分で乱数発生プログラムも書く必要があるかも
104 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 08:03:45.92 ] MT乱数 VBA で ヤホーでググればたくさん落ちてる ちなみにワシは100-101だが ボケてた。 3の余剰じゃなくって4の余剰だ
105 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 08:06:06.37 ] みなさんありがとうございます C言語の基本的なことはわかるので、配列で出来そうです 乱数は自分でプログラム書かなくても大丈夫だったような…… わからないことだらけなのでまた質問することもあるかとは思いますが、その時はよろしくお願いします 今回は皆さんのおかげで解決出来ました ありがとうございます
106 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 09:09:25.31 ] >>105 C言語の基本なことがわかってる奴が >>97 みたいな質問するのか? と、思った奴は俺だけじゃないと思う。
107 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 10:43:42.62 ] >>103 正式には公開されてないけど、どこかで解析されてたぞ。 MT乱数ならExcelで使えるdllがある。 なんか64bitのWindowsでは使えないみたいだが。 PtrSafeかましてもうまくいかん。
108 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 10:46:17.93 ] うまくいかんのは64bitのExcelだった。
109 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 20:35:25.18 ] VBA上だと変数のビット数が足りなくて完全なMTは実装できないとかなんとか
110 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 21:43:02.26 ] 'This is the Visual Basic for Applications (VBA) version of the MT19937ar, 'or "MERSENNE TWISTER" algorithm for pseudo random number generation, 'with initialization improved, by MAKOTO MATSUMOTO and TAKUJI NISHIMURA, 'of 2002/1/26. 'This translation to VBA was made and tested by Pablo Mariano Ronchi (2005-Sep-12) www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/BASIC/mt19937arVBcode.txt
111 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 01:13:56.71 ] >>106 すいません 実はVBA触るのは今回が初めてでなにが出来てなにが出来ないのかがまるでわかってないんです 基本Cと同じく考えて良いんですかね
112 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 01:31:07.91 ] >>111 まじめにCが普通に使える奴なら、VBA はマージン見ても一週間もあれば それなりに使えるようになると思う。 ポインタは使えない (異論ある人もいるだろうけど、あえて言い切る) けど、 構造体もあるし、似たようなもんだと思っていい。
113 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 01:48:34.83 ] >>112 Cが使えるか?と言われると中々自信が無いですけどね 基本は学んだことがあるので、コードを見てなにが書いてあるか位なら何となくはわかるかと おかげで少しやる気がでました とりあえずやりたいことに関する参考書でも探してみようと思います
114 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 10:31:40.78 ] >>113 > コードを見てなにが書いてあるか位なら何となくはわかるかと 自分で書いたことはないってこと? 読めるのと書けるのの間はそれなりにある (例えば小説考えればわかるでしょ) ので、 一週間じゃ難しいかも。 幸いなことに VBA はネットにも本屋にも山ほど情報はあるから、じっくりがんばれ。
115 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 12:09:19.41 ] >>109 そんなわけあるか 「多倍長」でぐぐれ
116 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 12:10:05.05 ] 文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
117 名前:デフォルトの名無しさん [2011/12/10(土) 12:35:07.22 ] 大は小を兼ねるから 変数の型は integerやlongやは使わず すべてdoubleにしていいですか?
118 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 12:54:57.60 ] 整数使いたいの?小数使いたいの?どっち?
119 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 12:58:11.55 ] >>117 プログラムが複雑になってくると、最小限に切り詰めた方が計算は速くなるんだけど そういう質問をするレベルなら大したプログラムは作らんだろうから、たぶん大丈夫
120 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 13:03:28.16 ] すべてVariant使えばいいじゃん
121 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 14:11:46.85 ] >>116 >文章と違ってコードは書くより読む方が難しいと思うんだけどなあ 読むと言う意味が違うんじゃない? 俺は、例えば I = I + 1 がどういう動作かわかるのを読むと言ってて、 貴方はプログラム全体がどういう動作するかをl理解することを読むと 言ってるんじゃない?
122 名前:デフォルトの名無しさん [2011/12/10(土) 15:52:32.15 ] そういえば変数じゃなくて定数は型宣言しなくていいんだっけ? いま手元にあるVBAの本には定数のことについての説明が1ページもない。 変数は Dim a as Integer だけど、 定数は Const a=3.14 みたいな感じ? それとも Const a as Double = 3.14 みたいに書くんだっけ?
123 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 16:43:38.17 ] ↓自分で作って動かしてるもの w Public Const shisuu As Integer = 0 Public Const sakimono As Integer = 4
124 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 16:48:13.30 ] Sendkeysステートメント(メソッド)を使って、他アプリケーションへの入力作業を行っています。 日本語入力の文字化け現象についてはVBAではどうにもならないと聞きました。 クリップボードを経由してもダメでした。 何か良い方法は無いでしょうか?
125 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 17:16:54.06 ] ファイルから読み込みしたら?
126 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 17:23:31.69 ] SendMessageすれば*
127 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 20:02:53.99 ] >>126 ありがとうございます。 SendMessageについて色々調べてみましたが、今一理解できません。 失礼は重々承知ですが、使い方を教えて下さいませんか? とりあえず、Yahooトップページの検索ボックス(既にフォーカスされているものとして)に 下記の文字列を送信するコードを教えて下さい。 "日本語で入力します。" よろしくお願いします。
128 名前:デフォルトの名無しさん [2011/12/10(土) 20:36:01.01 ] 定数はどうやって型宣言するんだっけ? Const a=3.14 みたいな感じ? それともこう? Const a as Double = 3.14
129 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 20:41:52.19 ] >>0 x80 >>0 x7B
130 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 20:57:48.09 ] このスレ的には、 >>&H80 >>&H7B じゃね?
131 名前:0x81 mailto:sage [2011/12/10(土) 21:30:56.65 ] すまぬのう ExcelVBAで組み込みCの色々なテーブルとかマクロ作って生活の足しに しているんでな。 つーかワークシートの位置指すのにヘキサで書く理由がわからないですが そういう仕事の人はいますか?(居たら事例を聞きたい)
132 名前:0x81 mailto:sage [2011/12/10(土) 22:16:12.22 ] すまん、自分でも何言っているのかわからない。 まぁ、ワシのティンコは言うこときかないんですけどね。元気すぎて
133 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 22:36:49.98 ] >>127 Sub yahoo_search() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.navigate ("yahoo.co.jp ") Do While objIE.ReadyState <> 4 DoEvents Loop SendKeys "日本語で入力します。" SendKeys "{ENTER}" End Sub
134 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:00:06.36 ] VBAのSendKeysは普通に日本語送れるけど >>124 はどういう状況なんだろう
135 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:13:24.16 ] 2バイト文字入力で化けるソフトがあって、その入力支援が出来ません ってことかな 表示がバグるだけで内部データは問題ないんじゃね
136 名前:0x81 mailto:sage [2011/12/11(日) 00:20:33.70 ] ADOと使って変換すればいけるの?
137 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:30:15.04 ] >>133 >>134 すみません!完全に私の記述ミス&勘違いです!! エクセルファイルの各内容を変数に取得して、 社内システムにフォーカスを移して入力を試みています。 半角文字列や数字は問題なく入力できるのですが、 全角文字列(日本語)をSendkeysで送っても文字化けしてしまうのです… 文字化けしないようにするにはSendMessageを使う必要があるって聞きましたが、 使い方がよく分かりません。お手数掛けてすみませんが、ご教授お願いします。
138 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:31:36.91 ] >>135 え、そうなんですか? 月曜日に確認してみます! ありがとうございます!!
139 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:46:38.45 ] >>137 全角文字とSendKyesの組み合わせだと、 入力したい全角文字列をクリップボートにコピーしてから、SendKeys で Ctro+V のみを送るって方法がある
140 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:54:48.00 ] >>139 ありがとうございます。 でも、 ^V って何故だか動作しませんでした…
141 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 00:56:06.62 ] >>139 なるほど みんな苦労してるんだなあ うちもツギハギのWEBアプリで四苦八苦してるよ 十何年もかけて機能の拡張やバージョンアップを繰り返してるから画面のデザインとか操作体系がめちゃくちゃになってる 支店が全国に一万店以上あるからうっかり大幅に変更すると再教育のコストもかかるしどうにもならなくなってきてる
142 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 01:15:47.91 ] うーん、確かにメモ帳だと SendKeys "^v" で貼り付けできるのにIEだとできないね 何度も試してるとできることもあるけど、再現条件がわからん Sleepで待ち時間を入れてもDoEventsをはさんでも同じ 半角だと貼れるのに全角は貼れない わけがわからん
143 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 01:19:34.66 ] VBAでDOSコマンド書いてそこから介入
144 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 01:45:06.76 ] できた VBAのSendKeysではうまくいかないけど、VBSのSendKeysならうまくいくことがわかった 以下のサンプルはクリップボードにデータを設定する部分で警告が出るけど、そこは問題の本質じゃないので無視してくれ Sub yahoo_search() Set IE = CreateObject("InternetExplorer.application") IE.Visible = True IE.navigate ("yahoo.co.jp ") Do While IE.ReadyState <> 4 '表示終了まで待つ DoEvents Loop Set ws = CreateObject("Wscript.Shell") IE.Document.ParentWindow.ClipboardData.SetData "text", "英語を貼り付ける。" ws.SendKeys "^v" End Sub
145 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 07:23:03.30 ] っていうか相手がIEだったら(>>124 ) SendKeysなんか使わずにDOM操作した方がよくない? 例えば>>133 のコードを拝借すると、SendKeysの2行をこんな風にする objIE.Document.getElementById("srchtxt").Value = "日本語で入力します。" objIE.Document.getElementById("srchbtn").Click 対象がすでに表示中のIEだと捕まえるのがちょっと面倒だけどね
146 名前:145 mailto:sage [2011/12/11(日) 07:25:19.85 ] うわ編集中に送ってしまった 1行目 っていうか相手がIEだったら(>>124 ) ↓ っていうか相手がIEだったら(>>124 は「社内システム」としか書いてないからわからんけど)
147 名前:デフォルトの名無しさん [2011/12/11(日) 09:07:00.03 ] 環境 XP、Office2003 [Sheet1] Private Sub Worksheet_Calculate() Worksheets("Sheet1").操作() End Sub という事を実現したいが、シート名は可変です。 で、 Private Sub Worksheet_Calculate() ActiveSheet.操作() End Sub という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。 (手元にExcelがないのでコードは不正確かもしれません)
148 名前:124 mailto:sage [2011/12/11(日) 09:16:05.26 ] >>142-146 お返事が遅くなりすみません。 社内システムはIEではありません。 .exeファイルです。 …VBSのSendkeysとか想像もしてませんでした。 DataObjectでクリップボードに格納して、VBSのSendkeysを試してみます。 いずれにせよ、月曜日じゃないと確認できませんが。。。 何度もアドバイス下さり、本当にありがとうございます! また、結果などをご報告いたします。
149 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 10:35:28.06 ] >>147 ブックの"Sheet1"という名前のシートに操作をするなら For i = 1 To ActiveWorkbook.Sheets.Count If ActiveWorkbook.Sheets(i).Name = "Sheet1" Then 操作 End If Next にしたらいかがでせうか
150 名前:149 [2011/12/11(日) 10:36:30.35 ] レスを良く見てなかったんで 取り消してくらはい
151 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 11:31:08.05 ] >>147 >という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。 当然そんな保証はない。 「シート名は可変です。」と書いてあるが、ではソノシート名はいつどこで指定するのか? あらかじめ指定しておくと言うなら、 Dim SheetName As String Private Sub Setup( ) SheetName = "Sheet1" End Sub Private Sub Worksheet_Calculate( ) Worksheeets(SheetName).操作( ) End Sub でいい。 Sheet1 がないケースなどがあるなら、適切なエラー処理が必要。
152 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 11:34:28.91 ] あと、本来名前でいろいろ参照するのはお勧めしない。 >>151 の例なら、 Dim TargetSheet As Worksheet Private Sub Setup( ) Set TargetSheet = Worksheets("Sheet1") End Sub Private Sub Worksheet_Calculate( ) TargetSeet.操作( ) End Sub の方が (個人的には) よりいいと思う。
153 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 11:40:53.64 ] >>147 Worksheet_Calculateイベントはアクティブシートがどこにあっても発生する可能性があります シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです [Sheet1] Private Sub Worksheet_Calculate() 操作() ' ←これだけ End Sub
154 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 12:27:23.26 ] シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば? 変なエラーが起こらない。 For I = 1 To Worksheets.Count If Worksheets(I).Name = "Hoge" then 'やりたいことやる endif Next
155 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 12:31:01.24 ] >>147 すんまそん、アンカ忘れてた。 今からカリ首吊ってくる シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば? 変なエラーが起こらない。 For I = 1 To Worksheets.Count If Worksheets(I).Name = "Hoge" then 'やりたいことやる endif Next
156 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 15:20:43.60 ] Excel:2007、OS:Win7 上書き保存時、セーブ前に行列番号を消し、保存後、行列番号を再度表示させたいです。 ビュアーで見る時に番号を消したい、という意図です。 とりあえず調べた限り、以下でいいと思ったのですが以下の問題点でつまずいています。 ・そもそも保存されない ・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。 いいえかキャンセルのみで抜けられる。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _ , Cancel As Boolean) With ActiveWindow .DisplayHeadings = False '行列番号消し ThisWorkbook.Save 'セーブ。できてない? Cancel = True '通常の上書き保存をキャンセル .DisplayHeadings = True '行列番号表示 End With End Sub
157 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 15:59:31.16 ] >>156 環境が無いんで確認できないけど、 ThisWorkbook.SaveがWorkbook_BeforeSaveを誘発してるでしょ。 自分で聞いてやるしかないと思うよ。 Msgbox("保存しますか?",vbYesNo) Yesなら Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True メッセージは、Ctrl+S時に表示しちゃまずいから、 BeforeCloseで保存確認しちゃった方がいいかもね。 まぁ結局はWorkbook_openで DisplayHeadings = True '行列番号表示 しちゃう方が簡単だと思うんだ。
158 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 16:09:24.49 ] >>156 Saveの直前にイベント抑止してみるとか Application.EnableEvents = False ThisWorkbook.Save 'セーブ。できてない? Application.EnableEvents = True ただ、保存されたものは常に行番号なしになるのでopen時には再度行番号有効化してやるとかの考慮は必要になる あと、実際に保存された直後、 .DisplayHeadlings = True の行でおそらく編集扱いになるので、ただ閉じようとしても必ず 保存しますか? と聞かれてしまうのは仕方ないように思える
159 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 16:13:35.98 ] 157>> 返信ありがとう! 上司からのオーダーなもんで出来るだけ対応したいんだけどねぇ。 Ctrl+Sでやりたいから、必ずしもウィンドウを閉じる時ばかりじゃないもんで。 俺もこれを聞く前に閉じるときにセーブ前に非表示→開くときに表示というふうに したんだけどそれだとダメらしい 出来ればCtrl+Sとかでも対応できるようBeforSaveでやりたいが…… 自前の保存マクロでやるしかないかな……
160 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 16:21:54.14 ] >>158 >.DisplayHeadlings = True >の行でおそらく編集扱いになるので ThisWorkbook.saved=Trueでどう?
161 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 16:23:43.56 ] >>158 こっちもありがとう! イベントの抑制・・・そういうのもあるのですね。参考にしてみる。 開くときに表示ON自体は_OpenでしてやればOKですね。実際それはもう仕込んであるので。 しかし、なるほど、結局、表示消すのが編集扱いになってるから何ども聞かれるのか。 そりゃそうだわな……
162 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 17:45:20.24 ] >>160 遅れたがサンクス。 とりあえず各アソバイスを入れた結果、Ctrl+Sで保存で行が消せるようになった! ビュアーでみてもちゃんと消える。 ただ ・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。 いいえかキャンセルのみで抜けられる。 は解消されないな……一度保存すればあとはいいえ押せばいいだけなんだけどね。 ThisWorkbook.Saved = Trueの使い方がまずい? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _ , Cancel As Boolean) With ActiveWindow .DisplayHeadings = False '行列番号消し 'Application.DisplayAlerts = False Application.EnableEvents = False ThisWorkbook.Save 'セーブ。できてない? Application.EnableEvents = True Cancel = True '通常の上書き保存をキャンセル .DisplayHeadings = True '行列番号表示 ThisWorkbook.Saved = True '変更適応OK End With 'Application.EnableEvents = False End Sub ※その他、Open時とClose時にそれぞれ行列表示のOn,Offをいれてます。
163 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 20:16:58.40 ] >>162 EXCEL2000ならあったから入れてみた。 ideone.com/tn9oN 出来てるとは思うけど、 割と脆弱なロジックなので、限られた範囲での使用に留めるべき。 仕事であれば別にボタンを用意するかな。
164 名前:デフォルトの名無しさん mailto:sage [2011/12/11(日) 22:57:32.48 ] あ、vbNoの処理間違ってた。 Saved=Trueが必要かな
165 名前:147 [2011/12/11(日) 23:51:37.67 ] Worksheet_Calculate()時のActiveSheetは自シートか?という質問に関し、 >>149-155 ありがとうございました。勉強になります。手元にExcelが無いので明日試させて頂きます。 が、理解を超えている点があるので再質問させて下さい。 >>153 > シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです その場合、省略された自分自身を表わす記法はどのようになりますか? 例えば、自シートをローカル変数に代入したいとか。(他モジュールで使い回したいような目的で) [Sheet1] ' Set SelfSheet = Worksheets("Sheet1") 相当をシート名無しで実現するには? Dim SelfSheet As Worksheet Set SelfSheet = ' ThisWorksheet と書きたいが。
166 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 00:26:16.12 ] >>165 俺はそんな時 Me を良く使うお Set SelfSheet = Me
167 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 00:31:30.30 ] すいません、質問が VBAを使って、 Aというセルに数値を入れた時に、BというセルにそのAに入れた数値によって様々な値を出力する というのを作りたいのですが、どうすればいいのでしょうか
168 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 01:24:37.73 ] >>167 セルBにセルAを参照する数式を記述する
169 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 01:24:46.11 ] 質問です mnock = 1: hno = 1の :ってどういういみなんですか? 代入を一行に書いたわけではないんですよね・・・
170 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 01:56:23.33 ] 改行の代わり
171 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 01:59:19.61 ] >>170 そうなのか・・・特殊記号かとおもってしまいました ありがとう
172 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 09:47:18.15 ] 範囲指定をして何か処理(ソートとか)した後、その選択範囲が選択されたままになってしまいますが、それを解除する命令 とかってありますか? 何処かのセルを選択すればそれが解除されはするんですが、それとは別に言ったような選択を解除するようなものがあるのか ?と思いまして。
173 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 10:21:17.05 ] 未選択状態見たこと無いから無いんじゃない?
174 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 10:23:20.77 ] thxです やっぱり無いですかね w
175 名前:デフォルトの名無しさん [2011/12/12(月) 11:18:55.59 ] 質問があります。 OS:Windows 7 Ultimate 64bit SP1 Excelのバージョン:Office 2007 Personal SP3 A1-A10までのセルのいづれか1つに*が入力されたら、それ以外のA1-A10のセルを空にしたいです。(排他?) ※A1-A10のうち、*が入力されているのは常に1つの状態にしたいという事です。 よろしくお願いします。
176 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 12:02:31.09 ] わーくしーとあふたーあっぷでーと() A1〜10に入力があったら他排除 えんどサブ
177 名前:175 mailto:sage [2011/12/12(月) 12:35:42.16 ] >>176 すみませんが、貴方の言う「A1〜10に入力があったら他排除」が分からないと質問をしているのです。 回答する気がないのであれば、中途半端なレスはいりませんよ、176さんも暇じゃないでしょうから。
178 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 12:43:30.40 ] >>177 >>2
179 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 13:07:20.85 ] >>175 おまえの態度が気に入らない VBAを勉強する前に掲示板の使い方を覚えろ Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False r = Target.Row c = Target.Column If c = 1 And r <= 10 Then If Cells(r, c) = "*" Then Range("A1:A10").Clear Cells(r, c) = "*" Else Intersect(Target, Range("A1:A10")) = "" End If End If Application.EnableEvents = True End Sub
180 名前:175 mailto:sage [2011/12/12(月) 13:12:20.64 ] >>179 態度を改めます。 掲示板の使い方も覚えます。 コードありがとうございました。
181 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 13:16:48.65 ] ああごめん、フックが解んないかと思ってたわ
182 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 14:02:21.15 ] >>163 サンクス。かなり参考にさせてもらった。 でもブックを閉じた時、保存ではいを押しても保存出来ないっぽい。2007の差でもあるのか ちなみに皆さん、マクロ配布するときどうしてます? エキスポートでcls出してインポートで使わせようと思ってもthis bookに書かなきゃうまくうごかなかった。そもそもVBAわざわざ開かせるのも微妙で。