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/
237 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 21:04:31.60 ] >>236 言われてみたら確かにそうですね w
238 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 21:33:37.60 ] 削除は下から消さないと・・・
239 名前:デフォルトの名無しさん [2011/12/14(水) 22:21:48.02 ] >>238 分割された領域なら下からとか右からで削除しないと面倒だけど、 連続の領域をまとめて消すんなら別にどうでも良いんじゃね?
240 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:59:06.37 ] アドバイスお願いします。 数字、名前のペアが複数あって、数字をキーにすると名前が取り出せて、 名前をキーにすると数字が取り出せる連想配列のようなものを作りたいのですが、 VBAではどのようにすると効率的でしょうか? それぞれ、一意的にペアが決まっています。
241 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 23:06:34.94 ] >>240 Scripting.Dictionary オブジェクトを2つ用意して、 一方は数字をキー、もう一方は名前をキーと使い分ければいい
242 名前:240 mailto:sage [2011/12/15(木) 22:30:21.63 ] >>241 ありがとうございます。試してみます。
243 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 00:14:21.90 ] どちらで聞いたらいいのか分からなかったのでこちらで聞きますが セルの値を数値処理する場合vbsから操作するのとvbaから操作するのだとどちらが計算早いですか?
244 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 00:15:16.83 ] vbs
245 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 00:19:32.00 ] Excelとのやり取りが殆ど無い場合でも、 腐っても型付言語であるVBAの方が速いと思う。 やり取りが多い場合はインプロセスとアウトプロセスの 越えられない壁があるからVBSに勝ち目無し。
246 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 00:32:28.93 ] VBSでエクセルを偽装してだね
247 名前:デフォルトの名無しさん [2011/12/16(金) 08:03:26.05 ] x個の数からy個の数をランダムに取り出したいときってどうしてますか? 数の集合が{1, 2, 3, 4, 5}つまりx=5でy=3の場合だと 毎回 2, 3, 5 1, 2, 4 3, 4, 5 みたいに5個の数のうちランダムに3つ選び出す、というアルゴリズムです
248 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 08:13:33.97 ] 単純にやるなら乱数3つ 問いの内容ならxCy個の中から乱数1つ 1なら(123)、2なら(124)……て形で割り振るアルゴリズムを通してゲット 重複や順列の内容で幅を変えればいい
249 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 15:55:35.00 ] www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_rnd.html ここ参考にすればいいんじゃねーの
250 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:02:45.72 ] vbaって動的の多次元配列ってできねえの?
251 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:03:30.70 ] 型はstringで
252 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:06:42.33 ] なんでそういうサイトを上げるんかねぇ。 恥かかせるためか?
253 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:07:54.02 ] >>250 やってみりゃ分かるだろ?
254 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:08:28.00 ] dim hoge(,) as string これだとエラーなんだけど
255 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:09:48.29 ] dim hoge[][] as string これもエラーだった
256 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 18:10:19.05 ] 二次元で要素数が不定の動的配列はできないんじゃないの? 検索するとできるって書いてあるページもあるけど、サンプルをコピペするとエラー出るし VBとVBAを勘違いしてんじゃないかと思う 要素数固定で宣言して、片方の次元だけReDimする方式の動的配列なら可能だけど
257 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 19:23:51.82 ] >>250 Dim hoge() As String ReDim hoge(10, 5, 3) hoge(0, 0, 0) = "3次元" Debug.Print hoge(0, 0, 0)
258 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 20:49:43.90 ] >>257 思ってたのとちょっと違いますけどこれとpreserveで代用できそうだな ありがとうございます
259 名前:デフォルトの名無しさん [2011/12/17(土) 00:44:13.36 ] WindowsAPIを使用したいときは、いちいち定義しないとダメなんでしょうか? 現場では資料もなくネットも使えない環境なので手打ちをキツイです。
260 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 00:50:47.84 ] >>259 いちいち定義しないとダメですが、WinAPIなら百科事典が発売されているのでそれを持ち込むという手も あとはmsdnのオンラインヘルプ(CD-ROM版)を用意して、CのソースをVBAに書き換えるマクロとか用意すれば なんとかなるでしょう
261 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 01:22:48.76 ] vbaでこんな感じのリクエストを飛ばすのってどうやるのですか? GET / HTTP/1.1 Accept-Language: ja Accept-Encoding: gzip User-Agent: hoge (1.1.1) Host: wwww.aaa.bb
262 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 01:34:28.67 ] GET /hogehoge.cgi HTTP/1.1 Accept-Language: ja Accept-Encoding: gzip User-Agent: hoge (1.1.1) Host: wwww.aaa.bb 送るとこかいてませんでした
263 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 03:32:05.24 ] >>261 WinInet関連のAPIを使う HttpAddRequestHeadersしてHttpSendRequestかな? WinHTTPライブラリ(WinInetの後継らしい)てのもあるが詳細はしらない これ以上はスレチになるんで ググるか APIのすれで聞いておくれ
264 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 04:19:21.00 ] >>261 ネットのやりとりはいろんな方法がある たぶん、こんな感じで行けると思う Set oHttp = CreateObject("MSXML2.XMLHTTP") oHttp.Open "GET", "www.aaa.bbb/hoge.cgi ", False oHttp.SetRequestHeader "Accept-Language", "ja" oHttp.SetRequestHeader "Accept-Encoding", "gzip oHttp.SetRequestHeader "User-Agent", "hoge(1.1.1)" oHttp.Send ' リクエスト送信 istatus = oHttp.Status ' 結果確認 If istatus = 200 Then s = oHttp.responseText ' 本文(HTMLソース)取得
265 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 09:44:20.71 ] Dim WS As Worksheet Set WS = Worksheets("記録") Worksheets(WS).Activate ← で、矢印の部分で型が一致しないって出るんですけど、String型でないと駄目ッてこと ですか?
266 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 09:47:26.21 ] Dim WSName As String WSName = "記録" Worksheets(WSName).Activate じゃないの?たぶん
267 名前:デフォルトの名無しさん [2011/12/17(土) 09:52:46.36 ] >>265 265の方法でもよいし、Object型(Worksheet型)で宣言したときは Worksheets(WS).Activate じゃなくて WS.Activate って書けば良い
268 名前:267 [2011/12/17(土) 09:54:36.29 ] 安価ミスった 「265のやり方」じゃなくて「266のやり方」でした
269 名前:265 mailto:sage [2011/12/17(土) 09:55:52.47 ] なるほど! ありがとうございます
270 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 16:18:35.70 ] >>264 できました! ありがとうございます
271 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:21:08.96 ] constって使う必要あるの? 変数に値持たせてそれ変えなければいいだけじゃないの
272 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:35:36.34 ] >>271 プロシジャ毎にPrivate変数に一々代入するのって面倒じゃない?
273 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:48:53.68 ] Constの場合は確実に固定値だと判断が出来る。 普通の変数だと、その点が曖昧にならざるを得ないから、 後でソースを見返す時に面倒。
274 名前:デフォルトの名無しさん [2011/12/17(土) 19:14:43.41 ] >>272 ところでモジュール間でも定数は自由に使えますかにゃ? 標準モジュールとフォームモジュールを使ってた場合、 どちらかのモジュールの一番上に書いておけば、他方のモジュールをその時点で未使用でも、その他方の上のほうに書いてある定数は使用可能?
275 名前:274訂正 [2011/12/17(土) 19:16:32.05 ] >>272 ところでモジュール間でも定数は自由に使えますかにゃ? 標準モジュールとフォームモジュールを使ってた場合、 どちらかのモジュールの一番上に書いておけば、他方のモジュールから実行が始まったとき、 書いてるほうのモジュールがその時点で未使用でも、その他方のモジュールから別のモジュールの上のほうに書いてある定数は使用可能?
276 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 19:36:50.61 ] ちょっと試せばすぐにわかるのに
277 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 19:37:56.98 ] モジュールはマクロ開始時点で全て初期化される。
278 名前:デフォルトの名無しさん [2011/12/17(土) 19:39:29.49 ] >>276 あなたのVBA力と回答力を試しているんですが
279 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 19:43:07.60 ] VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
280 名前:デフォルトの名無しさん [2011/12/17(土) 20:11:42.31 ] わからないなら無理にレスしてくれなくていいよ?
281 名前:デフォルトの名無しさん [2011/12/17(土) 21:08:41.34 ] VBAで、数値から文字列、文字列から数値への変換の方法はいろいろあるみたいだけど どの方法が一番標準ですか? 自分は前者はCStr、後者はVal、でそれぞれやってますが、これって変?
282 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 21:25:43.32 ] 基本は自動型変換で良くね? 後、Val関数は何気に色々と面白い仕様だから注意した方が良いよ。
283 名前:デフォルトの名無しさん [2011/12/17(土) 22:04:12.83 ] >>282 自動型変換とは何ですか? 面白い仕様とはどういうことですか? あにゃたの発言のほうが意味がいろいろ取れて神経を使います。
284 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 22:58:53.98 ] 別に標準とかないでしょ いろいろな方法があるのにはそれなりに理由があるんだから その時によって最適な方法を選べば良い
285 名前:デフォルトの名無しさん [2011/12/17(土) 23:21:52.65 ] valは使わないな 文字列にする時はこんな自作ライブラリつかってる Function dfVntToStr(ByVal StringVal As Variant) As String On Error Resume Next dfVntToStr = \\\"\\\" \\\'初期化 If Not IsNull(StringVal) Then dfVntToStr = StringVal & \\\"\\\" \\\'文字列へ変換 End If On Error GoTo 0 \\\'エラークリア End Function 同じようにintに変換とかlongに変換とかのライブラリも作ってる ネタ元はこれ VisualBasic6エラーコーディング ttp://www.amazon.co.jp/dp/4894712237/
286 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 00:52:58.28 ] VBAで自作ライブラリ作ってる人とか初めて見た・・・すごいな
287 名前:デフォルトの名無しさん [2011/12/18(日) 01:00:33.26 ] >>285 なぜ標準的な機能がすでに存在してるのに わざわざ自作ライブラリまで作るんですか? つこてる豆が違うんですか?
288 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:13:53.11 ] その\\\は何なの
289 名前:デフォルトの名無しさん [2011/12/18(日) 01:18:30.50 ] つこてる豆です
290 名前:デフォルトの名無しさん [2011/12/18(日) 01:50:27.77 ] \\\\\\はたぶんp2が原因、だと思う 理由は変換でエラーが起きても統一した処理が書けるようにするため ネタ本はVB6のエラー処理を解説してる本で、安全なプログラミングの フレームワークのサンプルもある(285はその1つ) 個人的にツッコミを入れてたところへの解答がちゃんと書いてある本だったので、ExcelVBAでも使わせてもらってる この本のライブラリと、「Excelプロフェッショナルエンジニアテクニック 」で 紹介されているアドイン:VBADeveloper.xla は自分が使うExcelVBA環境では 使いまわすようにしてる
291 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 02:45:14.73 ] 1時間かけてコーディングたものをデバッグしたら、最後のコードが.saved=true:.closeで、次開いたらコードが全て消えていました! 途中保存はしていませんでした、どうすればいいですか!!!
292 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 02:53:35.82 ] www.gigafree.net/utility/recovery/undelete360.html
293 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 02:58:10.81 ] デスクトップクリックして Alt + F4 押して エンター押せば解決だ!
294 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 03:23:28.84 ] Winキーを押してすばやくUを2回押すとバックアップ取得できるよ
295 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 04:24:50.37 ] >>291 おまえはこの1時間で金では買えない貴重な体験をした 明日からがんばれ
296 名前:デフォルトの名無しさん [2011/12/18(日) 05:06:32.28 ] Sub kk() Dim a As Long, b As Long, c As Long, d As Long a = 10 Do While Cells(a, 2) <> " " If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then If Cells(a, "N") = 1 Then Cells(a, "Y").Copy = Cells(a, "AA") Cells(a, "Z").Copy = Cells(a, "AB") End If If Cells(a, "N") = 1 Or 2 Or 3 Then Cells(a, "Z").Copy = Cells(a, "AB") End If Else: Cells(a, "AF") = "TRUE" End If a = a + 1 Loop End Sub
297 名前:296 [2011/12/18(日) 05:07:21.63 ] >>296 ですが、エラー1004が出てしまいます・・・ アドバイスいただけないでしょうか?
298 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 05:24:31.13 ] >>296 ここ、 If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then ↓ こうじゃないの? If Cells(a, 1) >= 9 And Cells(a - 1, 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
299 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 05:26:00.71 ] >>296 これは、 If Cells(a, "N") = 1 Or 2 Or 3 Then ↓ たぶん、こう If Cells(a, "N") = 1 Or Cells(a, "N") = 2 Or Cells(a, "N") = 3 Then
300 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 05:28:57.05 ] >>296 Copyの使い方がおかしい Cells(a, "Y").Copy = Cells(a, "AA") ↓修正 Cells(a, "Y").Copy Cells(a, "AA") または Cells(a, "AA") = Cells(a, "Y")
301 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 08:50:31.31 ] >>285 数値から文字列への変換って意味ではそれ単なる暗黙の型変換だね
302 名前:デフォルトの名無しさん [2011/12/18(日) 11:21:49.50 ] これはなぜエラーが出るの? Sub Test() ActiveSheet.ActiveCell = 1 End Sub
303 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 11:49:50.34 ] ActiveCellはActiveSheetのプロパティではないから
304 名前:302 [2011/12/18(日) 12:22:44.96 ] >>303 でもActiveCellはsheet一般のプロパティじゃないの? そしてActiveSheetはsheet一般に属するんじゃないの? 以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
305 名前:デフォルトの名無しさん [2011/12/18(日) 12:36:07.79 ] >>302 officetanaka.net/excel/vba/tips/tips34.htm これを見る限り、「ActiveCellはsheet一般のプロパティ」じゃないっぽい (ちなみに俺は>>303 じゃないよ)
306 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 12:41:09.09 ] オブジェクトブラウザで確認しろ、ってことだな。 もしくは、一旦Sheet型に代入してからアクセスするとか。
307 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 14:27:30.83 ] 変数を初期化する時に数値型なら0を入れるのが普通ですよね(まぁ特定のセルの値をそれに使うこともあるでしょうけど) 日付型の時って初期化はどうするんですか? Dim hi_from As Date で hi_from = "" としたら怒られちゃった^^;
308 名前:296 [2011/12/18(日) 14:27:36.53 ] >>298-300 おかげさまで解決しました。 ご丁寧にありがとうございましたー
309 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 14:33:48.23 ] >>307 >としたら怒られちゃった^^; 何のために初期化したいのか知らんけど、0 でも入れときゃいいんじゃね。
310 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 14:37:58.97 ] >>309 thx
311 名前:デフォルトの名無しさん [2011/12/18(日) 14:52:54.06 ] >>307 この野郎! おまえ何をやっとるんだ(怒)!! みたいに怒られたのか? それって誰によ?
312 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 14:57:58.13 ] >>304 >でもActiveCellはsheet一般のプロパティじゃないの? 違う ApplicationまたはWindowのプロパティ >そしてActiveSheetはsheet一般に属するんじゃないの? 違う Application、WindowまたはWorkbookのプロパティ >以上から、ActiveCellはActiveSheetのプロパティになるんですけど。 ならないからエラー出るんだよ
313 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:00:13.09 ] >>307 っていうかDimした時点で初期化されてるよ
314 名前:312 mailto:sage [2011/12/18(日) 15:04:30.79 ] あーすまん ActiveSheetが返すのはWorksheetオブジェクトね
315 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:05:10.06 ] >>304 Excelのオブジェクトは階層構造になっている Application - WorkBook(Application毎に複数) - WorkSheet(WorkBook毎に複数) ActiveCell は最上位の Application オブジェクトのプロパティなので、Sheet オブジェクトから直接参照することはできない やるならたぶん ActiveSheet.Application.ActiveCell となるはず
316 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:22:26.85 ] なんで MSDN とか見ないのか… msdn.microsoft.com/en-us/library/ff834673.aspx The following expressions all return the active cell, and are all equivalent. ActiveCell Application.ActiveCell ActiveWindow.ActiveCell Application.ActiveWindow.ActiveCell
317 名前:デフォルトの名無しさん [2011/12/18(日) 16:00:58.06 ] じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか? XXXXX.Activecell みたいな形はない、と覚えておいてOK? そしてこれらの法則は、Activebookや、Activesheetにも当てはまる? つまり、Workbooks(2).Activesheet みたいな形はない?
318 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 16:16:36.14 ] >XXXXX.Activecell みたいな形はない、と覚えておいてOK? ダメ Application.ActiveCell ActiveWindow.ActiveCell >>312 で「ApplicationまたはWindowのプロパティ」って書いたよね? >>315 とか>>316 にも書いてあるよね? >そしてこれらの法則は、Activebookや、Activesheetにも当てはまる? 法則とかの話じゃないし >つまり、Workbooks(2).Activesheet みたいな形はない? ある >>312 で「Application、WindowまたはWorkbookのプロパティ」って書いたよね?
319 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 16:31:28.44 ] >>317 > XXXXX.Activecell みたいな形はない、と覚えておいてOK? Type YYYYY ActiveCell As Integer End Type Dim XXXXX As YYYYY みたいなケースは (やるかどうかは別にして) ありえるから、ダメ。
320 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 16:34:27.34 ] >>317 >じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか? ActiveCellプロパティを持つオブジェクトを書く 書かなければApplicationとみなされる あと、とりあえず>>319 は無視していい
321 名前:デフォルトの名無しさん [2011/12/18(日) 16:51:48.87 ] Application ActiveWindow Application.ActiveWindow この違いはなんなのでしょう? 誰か違いのわかる男(あるいは女)はいますか?
322 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 17:41:31.56 ] 字数が異なります
323 名前:321 [2011/12/18(日) 17:50:13.70 ] ふざけるな
324 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 17:58:43.06 ] >>321 前提として ApplicationはExcel自体 WindowはExcel内の子ウィンドウで、Book などに対応して作成される Excelを起動すると、Applicationオブジェクトが作成される Bookを作成すると、Applicationオブジェクト配下に、WorkbookオブジェクトとWindowオブジェクトが作成される もう一つBookを作成すると、Applicationオブジェクト配下に、別のWorkbookオブジェクトと別のWindowオブジェクトが作成される workbookは文書内容そのものを保持し、Windowはドキュメント内容以外の状態や表示設定(Book単位のActiveCellや画面の拡縮率など)を保持する ActiveなBook(ActiveWorkbook)を切り替えると、ApplicationオブジェクトのActiveWindow、ActiveCell、ActiveChartなども一式自動的に切り替わる で、 Application は、ActiveSheet.Applicationの省略形で、Excel全体を表すApplicationオブジェクトを指す Application.ActiveWindowは、Excel内のアクティブなWindowオブジェクトを指す(workbookを切り替えるとWindowオブジェクトも切り替わる) ActiveWindow は、Application.ActiveWindow の省略形で、Application.ActiveWindow と同じ おそらく内部では、 Application.ActiveCell を参照したとき、Application.ActiveWindow.ActiveCell を返すような実装になってるはずなので、 ActiveCell Application.ActiveCell ActiveWindow.ActiveCell Application.ActiveWindow.ActiveCell の4つは常に同一になるはず
325 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 18:32:16.70 ] 2つのオブジェクトが同一かどうか調べる方法ってあるのかな? たとえば Set ObjA = ActiveCell Set ObjB = Application.ActiveWindow.ActiveCell If ObjA = ObjB Then … みたいな感じで
326 名前:321 [2011/12/18(日) 18:42:08.92 ] >>324 ご丁寧なご説明ありがとうございます。 かなりわかってきたような気がします。 >>322 のアホとは違いますね。 つこてる豆が違います。 こういう基本的とも思えることまで解説した本などがあればいいのにね。
327 名前:デフォルトの名無しさん [2011/12/18(日) 19:02:29.27 ] >>325 実際に試したら 書いているとおりのコードで調べることができましたよ。 Sub Test() Dim objA As Object Dim objB As Object Set objA = ActiveCell Set objB = Application.ActiveWindow.ActiveCell If objA = objB Then Stop '<=ここで止まった。 End If End Sub
328 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 19:06:04.93 ] "つこてる豆が違います" の検索結果が見つかりませんでした。 つ こ てる 魔 眼 が 違います の検索結果を表示しています。 Bingワロタw
329 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 20:41:28.74 ] なぞなぞ Debug.Print ActiveCell Is ActiveCell の結果はFalse。さて理由は?
330 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 20:52:33.37 ] >>327 ダウト。これ試してみ Sub Test() Dim objA As Object, objB As Object Set objA = Range("A1") Set objB = Range("B2") If objA = objB Then Debug.Print "同じ" End Sub
331 名前:327 [2011/12/18(日) 21:22:50.30 ] >>330 If objA = objB Then でレンジを入れたオブジェクト変数を比較すると、 objAとobjBのValueで比較するみたいですね。 上記コードに else Debug.Print "違う" を付け加えて、セルに違う値入れて実行したら"違う"になりました。 あとは例えば比較対象をobjA.AddressとobjB.Addressにすると"違う"と判別されましたし、 A1とB2で書式設定を違うものにしたら objA.NumberformatとobjB.Numberformatの比較も"違う"という結果になります。
332 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 21:29:46.45 ] >>329 ひょっとして、 ActiveCellが返すRangeオブジェクトは現在の選択座標をもとに都度新規に作成されるとかそういう話?
333 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 21:34:17.84 ] それを言うなら Range("A1") Is Range("A1") もFalseだね
334 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 21:39:41.65 ] >>329 これ前から謎だったんたよな 正解を教えてくれると助かる で自分なりに出した答えは セルの参照先は一緒だけどRangeオブジェクト(インスタンス?)が違うから 下と同じ原理かなと思う Set objA = Range("A1") Set objB = Range("A1") Debug.Print objA Is objB Set objA = Range("A1") Set objB = objA Debug.Print objA Is objB 前者はFalse だけと 後者はTrue
335 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 22:45:17.52 ] ヒント Set objA = Worksheets(1) Set objB = Worksheets(1) Debug.Print objA Is objB これはTRUE
336 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 23:16:30.48 ] うわあ・・・
337 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 23:22:59.09 ] 別のプロシージャに配列渡してその値変えたら元も変わる?