[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 01/29 07:34 / Filesize : 283 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part22



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 ]
別のプロシージャに配列渡してその値変えたら元も変わる?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<283KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef