08/01/02 21:27:35
>>236
まじっすか!?
とりあえず見てみるわ。
>>235
図書館にも死ぬほどあったw
238:かな
08/01/03 11:25:29
Excelであみだくじつくりたいんやけど、どっかにサンプルないかな?
セルつかうんじゃなくてちゃんと線を引いてやりたいんや?
239:デフォルトの名無しさん
08/01/03 12:43:46
しね
240:デフォルトの名無しさん
08/01/03 13:59:10
こんにちは。突然ですが
いろいろ試してみたんですけど
VBAで乱数の回数分だけループさせる方法ってやっぱり不可能ですよね?
241:デフォルトの名無しさん
08/01/03 14:03:50
全然不可能じゃないとおもうけど・・・
242:デフォルトの名無しさん
08/01/03 14:17:15
>>240にはってこと?
243:デフォルトの名無しさん
08/01/03 15:30:45
乱数って少数の端数が出てしまうじゃないですか。
244:かな
08/01/03 15:32:36
誰かおしえて?
245:デフォルトの名無しさん
08/01/03 15:56:29
ループさせたいだけなら一回目に発生させた乱数を変数に入れたら終わりな話だと思う
246:デフォルトの名無しさん
08/01/03 16:04:37
少数の端数てことはないだろ。
247:デフォルトの名無しさん
08/01/03 16:05:53
つCint
248:デフォルトの名無しさん
08/01/03 16:06:37
0になるだろ
249:デフォルトの名無しさん
08/01/03 16:10:19
CIntだろ
250:デフォルトの名無しさん
08/01/03 16:21:41
すごい釣りだなw
251:デフォルトの名無しさん
08/01/03 16:28:39
つMid(Rnd,3)
252:デフォルトの名無しさん
08/01/03 16:39:24
Replace(Rnd,".","")
253:デフォルトの名無しさん
08/01/03 17:02:32
Count = CInt(Rnd * N) + 1
hoge:
'ここで何かする
Count = Count - 1
If Count >= 0 Then
Goto hoge
End If
254:デフォルトの名無しさん
08/01/03 18:34:00
ループ中に乱数の値ってどんどん変わっていくんじゃない?
255:デフォルトの名無しさん
08/01/03 18:35:55
・・・。
>>254って本気で言ってるのか?
256:デフォルトの名無しさん
08/01/03 20:18:11
質問です。
実際に開発する環境はXP excel 2003で
学習環境はvista excel 2007なんですが、
何か学習書を購入するとき、2007に対応したものじゃないと
理解は難しいのでしょうか?
2007に対応したVBA書はまだ少ないように感じるもので・・・
257:デフォルトの名無しさん
08/01/03 23:17:50
確かに2007で変わった部分はある。でも基本部分(構文とかそういうの)は変わってない。
2007用の書籍があればそりゃいいだろうけど、変わった部分を調べておけば別に古いのでも問題はないかと。
258:デフォルトの名無しさん
08/01/04 02:25:11
構文規則(VB部分)は変わってないけど
オブジェクトメンバ(VBA部分)は結構変わったよ
一応古いメンバにもアクセス出来るようにはなってるが
新しいメンバより動作が遅かったりというデメリットもある
2007用だと新しい体系に関しての説明が主になるだろうから
実際の開発が2003なら、2003用か2002/2003/2007兼用版とかがいいかと
259:デフォルトの名無しさん
08/01/04 06:26:50
EXCEL2002でVBAを書いています。
マクロでセルにEXCEL関数を入力する際に、『シートの選択』ダイアログ[OK、キャンセル]が表示されます。
ダイアログを表示さない、もしくはダイアログのキャンセルを自動で押す方法はありますか?
セルに入力しようとしている文字列
='D:\[計算書.xls]20.1月'!$J$3
計算書.xlsの20.1月は存在しません。
下記、3つは記述済みです。
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
260:256
08/01/04 07:26:44
>>257-258
ありがとうございます。
詳しい解説があったほうがいいのでよく考えて選びます。
261:デフォルトの名無しさん
08/01/04 08:19:47
>>259
うちは出ない (2000, 2003)
262:デフォルトの名無しさん
08/01/04 08:31:34
>>259
どんなマクロを書いているんだ?
263:デフォルトの名無しさん
08/01/04 09:52:52
>>259
再現した。 ワークシートの存在を確認するしかないかな?
Dim s As Worksheet
For Each s In Me.Worksheets
If UCase(s.Name) = UCase("20.1月") Then
s.Range("A1").Value = "='D:\[計算書.xls]20.1月'!$J$3"
Exit For
End If
Next
あるいは、可能であればワークシート別のイベントで処理させるとか。
264:かな
08/01/04 09:57:33
だれか教えてん♪
265:デフォルトの名無しさん
08/01/04 10:43:44
>>238>>244>>264
URLリンク(www.google.co.jp)
まぁ釣りだとは思うんだけど…
266:まな
08/01/04 10:52:16
>>264
手とり足とり、組んずほぐれつ?
267:デフォルトの名無しさん
08/01/04 17:41:29
すいません、XPでEXCEL2003です。
複数のセルに数式が入れてあるのですが、
その数式から導かれた値が、ある一定の値を超えた場合そのセル番号を表示させるプログラムを作ろうと考えています。
このようなことは可能でしょうか?
もし可能ならどのようなプロパティやメソッドを使えばいいのか教えてください。
後は本も買ってきたのでできるだけ自分でやりたいと思いますので、ヒントだけでもありがたいです。
268:デフォルトの名無しさん
08/01/04 17:44:47
>261
EXCELの設定で表示しないようにできるんですかね・・・。
>262
NW.Cells(tate, yoko).Formula = Replace(str_cell, this_Date, Nxt_Date)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
↑ ='D:\[計算書.xls]20.1月'!$J$3 が入る
~~~~~~
↑このシートは存在しない。
『シートの選択』ダイアログが表示される・・・。
>263
やっぱりダイアログが表示しますよね。ない場合シート作成させるしかないですかね・・・?
269:デフォルトの名無しさん
08/01/04 17:53:43
>>215
つOn Error
270:デフォルトの名無しさん
08/01/04 22:16:05
>>268
NW ?
271:263
08/01/05 11:58:51
>>268
シート作る必要があるの?
どうせエラー("#REF")になる式なんか入れないで、263の例みたいに空白のままじゃダメ?
>>270
どうせローカル変数名でしょ、New Worksheet の頭文字。てか、そこ突っ込まなくても・・・
272:デフォルトの名無しさん
08/01/07 17:08:47
XP、Excel2003で、改ページの枠を固定することはできるでしょうか。
この固定とは、保護等で管理者以外は触れないようにするということです。
ウィンドウの固定ではなく、改ページ範囲の固定です。
ご存知の方がいましたら、ご教授願います。
273:デフォルトの名無しさん
08/01/07 17:20:25
>>272 追記です。
結合したセルがあります。
そのセルに対する設定変更(書式、結合解除、フォント)は不可とし、
入力のみ可能とすることはできますか?
ご存知の方がいましたら、ご教授願います。
274:デフォルトの名無しさん
08/01/07 20:01:11
対象とするアクションが起こった場合にパスワード等を求めるとかじゃだめかな?
275:デフォルトの名無しさん
08/01/07 23:30:12
テキストボックスの余白自動設定解除に手間取った。
なんか簡単な方法ってないの?
276:デフォルトの名無しさん
08/01/08 08:29:16
「手間取ってる」ではなく「手間取った」ってことは
一応目的は達成されてるわけだよね
ではそれを提示してください
コード貼ってもブックをうpしても構いません
そしたらそれより簡単な方法があれば教えましょう
それが嫌ならさようなら
277:デフォルトの名無しさん
08/01/08 12:52:16
散々既出ぽい話題ですが、エクセルで、
先頭の0を消さずにcsvで書き出ししたいのですが、
以下の式では当然不可能で・・・
Option Explicit
Sub eight()
Dim eight As String
Dim bigeight As String
Range("a1").Value = 8
bigeight = Range("a1").Value + 100000000
MsgBox bigeight
eight = right(bigeight, 8)
MsgBox eight
Range("A2").Value = eight
MsgBox eight
End Sub
関数で同じことをやると出来るのですがゴミデータが出て、
コンマの数が変わってしまいます。
278:デフォルトの名無しさん
08/01/08 13:17:17
変数の型について勉強しましょう
文字列数値と数値の違いを理解しましょう
プロシージャ名と変数名を同じにするセンスを何とかしましょう
279:デフォルトの名無しさん
08/01/08 13:48:25
>>277
セルの書式設定(F) → 表示形式:ユーザー定義 → 種類(T):00000000 (8桁固定)
280:デフォルトの名無しさん
08/01/08 14:13:45
>>279
おお。
これをVBAで指定するには?
281:デフォルトの名無しさん
08/01/08 14:18:49
てか、そもそもセルに転記しなければ良いのか(・∀・;)
282:デフォルトの名無しさん
08/01/08 14:53:59
>>281
転記するにしても、セル(範囲)ごと持っていけば済むよ。
Range("A1").Copy Range("A2")
283:デフォルトの名無しさん
08/01/08 15:06:19
あ、表示形式ってマクロ記録できるんだ。
これで、解決・・・かな
284:デフォルトの名無しさん
08/01/08 15:24:41
礼も言えないゆとりであった
285:デフォルトの名無しさん
08/01/08 23:22:13
質問なのですが、ユーザーフォームの中に80コのテキストボックスを作りたい。
プログラムでループ文を使いテキストボックスを横に4×縦に20で一気に作る方法はありますでしょうか?
286:デフォルトの名無しさん
08/01/08 23:45:08
あります
LeftとTopを調整しましょう
コード教えては厳禁
287:デフォルトの名無しさん
08/01/08 23:50:48
調整とはユーザーフォームの設定ということですか?
プログラムだけで可能なのですよね?
もう少しだけヒントをお願いできないでしょうか?
288:デフォルトの名無しさん
08/01/08 23:55:08
別にそこまで厳しくせんでも。 Excel2003ではできる。
Set ctrl = Me.Controls.Add("Forms.TextBox.1")
って感じに追加して、ctrlのプロパティを調整する。
MSFormsに追加するのに、これでいいのか?という気もするが。
289:デフォルトの名無しさん
08/01/09 00:14:18
できました!あとは80コスペースを空けて作る方法を考えてみます。
288さん有難う御座いました。
290:デフォルトの名無しさん
08/01/09 00:16:15
丸投げを助長する
寄生虫が増殖する
らしいです
291:デフォルトの名無しさん
08/01/09 00:33:43
丸投げと、できるだけズバリなヒントを欲しているのとは確実に違うと思うわけだが。
292:デフォルトの名無しさん
08/01/09 14:20:42
278=284=290
293:デフォルトの名無しさん
08/01/09 14:30:40
しかし>>284には同意せざるを得ない
294:デフォルトの名無しさん
08/01/09 14:36:58
礼なんぞいらん。邪魔。
295:sage
08/01/09 14:47:15
IDが無いと誰が誰かワカラン
296:デフォルトの名無しさん
08/01/09 18:11:06
質問です。
Dim c1 as Collection
Dim c2 as Collection
Set c1 = New Collection
c1.Add "a"
c1.Add "b"
Set c2 = c1
この次に、
c1.Remove(1) 'c1の最初のアイテムを削除
とやるとc2のアイテムも"b"だけになりますよね。
これはたぶんc2が、c1と同じCollectionオブジェクトを
指しているためなんだな、と理解しています。
理解できないのは、c1.Remove(1)ではなく、
Set c1 = Nothing
とした場合です。
c2もNothingになるのかと思いこんでいましたが、
実際c2には、"a"も"b"も、ちゃんと残っていました。
これはなぜでしょうか?
297:デフォルトの名無しさん
08/01/09 18:25:52
a=1
b=a
a=0
にしてもb=0にならないのと同じ
298:デフォルトの名無しさん
08/01/09 18:27:51
「変数そのもの」と「変数が指す先」の区別を理解しませう。
set c1=nothingは、変数そのものへの操作で、変数が指す先にたいしては、
ほとんど影響しない。(唯一、リファレンスカウントにだけ影響するんだっけか。)
299:デフォルトの名無しさん
08/01/09 18:29:59
それはNothingキーワードが実体を解放するものではないため
300:デフォルトの名無しさん
08/01/09 19:41:42
数値の代入式の場合は、値そのものをコピーする。
オブジェクトの代入式の場合は、値を保存してある場所(参照)をコピーする。
なので、c1の要素を消すと、c2の要素も消えるが、
Set c1 = Nothing とした場合は、c1と値そのものとの関連が削除されるが、値そのものは残ってる。
全ての参照が削除された時点で、値そのものも削除される状態になる。
301:296
08/01/09 20:12:40
>>298
>>299
>>300
レスありがとうございました。
よくわかった、つもりです。
次のような理解でよろしいでしょうか...
Set c1 = Nothing によって、変数c1に格納された参照は削除される。
しかし参照先の実体を、まだ変数c2が参照している。
そのため、実体はメモリ上に存続する。
このあとで更に、Set c2 = Nothing とすると、
実体を指す参照がすべて無くなる。
すると、その実体が自動的に解放される。
302:デフォルトの名無しさん
08/01/09 21:28:25
質問なんですが、
セルの値(自動で変化する)が変わった瞬間に所定のコードを実行する(JavaScriptでいうところのonchange見たいな)、
と言うのは如何すればいいんでしょうか?
303:デフォルトの名無しさん
08/01/09 21:40:07
changeイベントを使えばいいよ
304:デフォルトの名無しさん
08/01/09 22:57:14
>>303
㌧クスです
なるほど、ワークシート単位ではチェンジイベントがあるんですね。
早速やってみます。
305:デフォルトの名無しさん
08/01/10 13:29:04
1から10000までの数字を全部掛けたときに
末尾に並ぶ0の個数を求めるのをVBAでおながいします
306:デフォルトの名無しさん
08/01/10 13:47:41
Excelどころか言語すら関係ないアルゴリズムの話か
>>305→>>2★4
307:デフォルトの名無しさん
08/01/10 13:51:31
>>305
というか桁数が膨大になるので計算機を使っても無理かと。
代数的な解法があるんじゃないですか?数学板の質問スレに質問しては?
308:デフォルトの名無しさん
08/01/10 14:02:10
じゃあ100まででもいいです
309:デフォルトの名無しさん
08/01/10 14:07:59
>>307
アルゴリズム次第では桁数は膨大にならないよ
だって総桁数を調べるのではなく、0の数を数えるだけだから
なんにしろスレ違いだけど
310:デフォルトの名無しさん
08/01/10 15:05:43
セルのコピー、ペーストをvbaで行った後に、コピー元のセルを囲っている
網のようなラインが消えないのですが、これをvba内で
解除するにはどうすればいいでしょうか。
311:デフォルトの名無しさん
08/01/10 15:26:51
>>310
Application.CutCopyMode = False
これはちゃんとExcel VBAの質問だな
312:sage
08/01/10 15:31:47
>>311
お、早速
ありがとうございます
313:デフォルトの名無しさん
08/01/10 16:28:25
オートフィルタを使ってデータベースの集計をしているのですが
1列目 2列目 3列目
A B タイトル
という風になっています。1列目と2列目は評価項目でA,B,C,D,E,Fのいずれかが記入されています
現在これをカウントしているVBAが、
3行目をオートフィルタで集計したいタイトルで搾り出す
1行目をAで抽出後、SubtotalでAの数をカウント
2行目をBで抽出後、Subtotalで…
となっています。昔はこれで十分だったのですが、次第にタイトルが増えてきて
全部やるとなると膨大な時間がかかるようになってきてしまいました。
1つのタイトルに付き単純に12回抽出→数えるとやっているので…
いちいちAで抽出→数える、Bで抽出→数える…と繰り返さずに、
タイトルで絞った後にCoutIFのようにAはいくつ、Bはいくつみたいな具合でやる方法はないでしょうか?
CountIFだと非表示のセルのA~Fまで集計してしまって困っています
314:デフォルトの名無しさん
08/01/10 16:39:34
よーわからんけど..
Sub hogera_vs_mogera()
For i = 1 To 8
hoge = Range("A" & i).Value
If hoge = "A" Then hoge_counter = hoge_counter + 1
Next i
MsgBox hoge_counter
End Sub
315:デフォルトの名無しさん
08/01/10 18:11:37
>>313
ピボットテーブルレポート使ってみて。
316:デフォルトの名無しさん
08/01/10 19:41:52
セルに名前が "hoge"
とついてる場合
range("hoge").value = "ほげほげ"
と操作できますが
この名前 "hoge" の行 列の値を得る方法を
教えて下さい hogeが(1,5)なら
int row = 1
int col = 5
のように得たいです。
317:デフォルトの名無しさん
08/01/10 19:56:30
Range("hoge").Row
Range("hoge").Column
318:デフォルトの名無しさん
08/01/10 23:06:12
質問なのですが、
Public Type SyainData
Id As Long
Name As String
End Type
Dim Kyo(5) as SyainData
と宣言しループ処理で関数の引数として2番目のNameを渡したいのですがどうすればいいですか?
319:デフォルトの名無しさん
08/01/10 23:19:01
Kyo(2).Name
320:デフォルトの名無しさん
08/01/10 23:23:03
319さん、ByRefコンパイルエラーと表示されます。
321:デフォルトの名無しさん
08/01/10 23:26:15
319さん
ちなみにAユーザーフォームからNameに入力して
標準モジュールに定義してある構造体にそれぞれ格納した値をBユーザーフォームに出力したいのです。
322:デフォルトの名無しさん
08/01/11 00:19:38
関数の呼び出し方と、関数の定義くらい書いたら? (先頭の、Sub/Function~の行)
判断する情報が少なすぎる。
323:316
08/01/11 09:24:37
>>317
ありがとうございました(^▽^)
324:デフォルトの名無しさん
08/01/11 10:14:12
VBAで実行中に「vbcritical」と共に、「400」って
数字が表示されるエラーはなんですか?
325:デフォルトの名無しさん
08/01/11 14:21:13
msgboxやinputboxの外観をもっと可愛くしたい!
326:デフォルトの名無しさん
08/01/11 14:33:31
スマン連投・・・
>>325はどうでもいいです
VBAを含むxlsを「共有」した途端に、そのvbaの挙動が微妙に変わってしまいました。
vbaの内容は、セル範囲をrangeで指定して、最下行にペーストするだけなんですが・・・。
なんか、ちょっとずれる感じなんです。ウィンドウの固定が原因かも。
共有と同時にVBAがロックされるので、原因の確かめようが無い状態(T-T
327:デフォルトの名無しさん
08/01/11 15:27:54
質問の仕方すら何かズレてるみたいだし、しょうがないね。 そういう星の下に生まれたんだよ。
328:326
08/01/11 16:19:52
共有の関係で、ペースト先の結合がバラバラになった模様・・・orz
こればっかりはどうしようもないですかね
保護されたセルに書き込むというのはvbaで何とかなりましたが・・・
329:デフォルトの名無しさん
08/01/11 16:48:30
>>325
つAssistant
330:デフォルトの名無しさん
08/01/11 18:07:53
>>329
なるほど、カイル君が使えるんですね・・・
ありがとうございます
331:デフォルトの名無しさん
08/01/11 19:37:54
>>328
このスレはオマイの進捗報告書かと
332:デフォルトの名無しさん
08/01/12 13:39:08
winxpでExcel2003を使用しています。
VBA-Editorからの実行は正常で、ワークシート上のコマンドボタンからの実行だと
時々、Excelが強制終了します。
コードは変えていないのに、上記の状況が発生しないときもあります。
バグだと思うのですが、発生しない時もあるので、原因がつかめません。
そんな事ってありますか?
333:デフォルトの名無しさん
08/01/12 13:49:06
>>332
あるよ。何か、以前にも出てたと思う。
クラスをインプリメントして、何かややこしいことしようとしてるヒトが居て、
エラーが出たり出なかったりするという話があった。基本的にはそれと同じ系統の問題では?
334:デフォルトの名無しさん
08/01/13 01:40:25
winxpでExcel2003を使用しています。
以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。
1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。
Sub まとめ()
Dim i As Integer 'カウンタ変数iの宣言
Dim n As Integer
Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言
Dim MyC As Worksheet
Worksheets.Add before:=Worksheets("全国")
ActiveSheet.Name = "data"
Set MyS1= Worksheets("data")
With Worksheets("全国")
MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value
End With
i=12
For Each MyC In Worksheets
If MyC.Name<> "data" Then
n = 12
MyS1.Cells(i,1)=MyC.Name
i=i+1
Do While MyC.Cells(n,2).Value<>""
MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value
i=i+1
n=n+1
Loop
End If
335:デフォルトの名無しさん
08/01/13 01:45:30
Sub まとめ()←死ね
Dim i As Integer 'カウンタ変数iの宣言←死ね
Dim n As Integer ←死ね
Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言←死ね
Dim MyC As Worksheet←死ね
←死ね
Worksheets.Add before:=Worksheets("全国")←死ね
ActiveSheet.Name = "data"←死ね
Set MyS1= Worksheets("data")←死ね
With Worksheets("全国")←死ね
MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value←死ね
End With←死ね
←死ね
i=12←死ね
For Each MyC In Worksheets←死ね
If MyC.Name<> "data" Then←死ね
n = 12←死ね
MyS1.Cells(i,1)=MyC.Name←死ね
i=i+1←死ね
Do While MyC.Cells(n,2).Value<>""←死ね
MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value←死ね
i=i+1←死ね
n=n+1←死ね
Loop←死ね
End If←死ね
336:デフォルトの名無しさん
08/01/13 04:26:19
こんなひどい丸投げを久しぶりに見た・・・
337:デフォルトの名無しさん
08/01/13 05:08:47
replace "\n" "←死ね\n"
338:デフォルトの名無しさん
08/01/13 05:10:22
>>334
随分酷いコードだな
VBA始めて3日くらいの奴が書いたコードだろ
こんな下劣なコードの説明なんてまっぴらだぜ
339:デフォルトの名無しさん
08/01/13 14:25:58
ある意味、微笑ましいコードだなw VBならでは、とでも言うか。
340:334
08/01/13 14:39:48
わからないのなら、レスくださらなくて結構です。
わかる方のみでお願いします。
341:デフォルトの名無しさん
08/01/13 14:58:48
>>340
どうもすみません・・。
342:デフォルトの名無しさん
08/01/13 15:17:23
要はググれということだ
343:デフォルトの名無しさん
08/01/13 15:18:17
>>340
判るんだけどさぁ、それを説明するのはスレ違いだし、そもそも野暮だろ?
344:デフォルトの名無しさん
08/01/13 15:56:32
>>340は馬鹿女
345:デフォルトの名無しさん
08/01/13 16:01:13
馬鹿かどうかは重要じゃない
大事なのは写真だ
346:デフォルトの名無しさん
08/01/13 16:06:19
>>340
1行ずつ説明が必要とかいう時点でおかしいと思わないか?
Dim i As Integerにも説明が必要なのか?どのレベルでだ?
Dimが何を意味して、Integerが何を意味するかまで解説するのか?
あるいは内部でIntegerがどのように管理されているかまで必要か?
処理ってのはある程度の塊で説明するのが普通だろ?
「ここはクラスの平均点を計算する」みたいな感じでよ。
文法がわからないのであれば入門書買うなりググるなりすればいい。
ピンポイントなら教えてやれても全部教えろとか金取りたくなるわ。
347:デフォルトの名無しさん
08/01/13 16:07:50
写真なんかはどうでもいい。
動画だ。動画をよこせ。
348:デフォルトの名無しさん
08/01/13 16:11:57
クリーチャーが「あたしはできる女なのよ!」とか自己紹介してる動画とかか?
349:デフォルトの名無しさん
08/01/13 21:03:19
質問ですが、組み込みダイアログボックス(例えばApplication.Dialogs(xlDialogPrint).Show)の
ウィンドウハンドルを取得するには、どうすればよろしいでしょうか?
APIを使って行うと思いますが、Excel本体やユーザーフォームのウィンドウハンドルの取得であれば
ググれば出てきたのですが、組み込みダイアログボックスのウィンドウハンドルの取得は
見つけることができなかったので、よろしくお願いします。
350:デフォルトの名無しさん
08/01/13 21:15:02
Spy.exe
351:デフォルトの名無しさん
08/01/14 06:14:32
>>334
i=12
iに12を設定する
For Each MyC In Worksheets
MyCごとの処理です
If MyC.Name<> "data" Then
n = 12
MyC.Nameがdataと違うときは、nに12を設定する
MyS1.Cells(i,1)=MyC.Name
i=i+1
MyC.NameをMyS1 の(12,1)に設定して、iを13にする
Do While MyC.Cells(n,2).Value<>""
MyCの(12,2)が空じゃなければ、以下の処理を繰り返す
MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value
MyS1の(13,1)から(13,12)に、 MyCの(12,1)から(12,12)を設定する
i=i+1
n=n+1
Loop
iを14に、nを13にして Do Whileに戻り、
MyCの(13,2)が空じゃなければ、また処理を繰り返す
MyS1の(14,1)から(14,12)に、 MyCの(13,1)から(13,12)を設定する
その次はMyS1の(15,1)から(15,12)に、 MyCの(14,1)から(14,12)を設定する
というふうに、iとnは1ずつ大きくなり、MyCの(n,2)が空になると処理をやめる
End If
352:デフォルトの名無しさん
08/01/14 07:47:13
URLリンク(zoomtv.web.fc2.com)
353:デフォルトの名無しさん
08/01/14 08:10:03
>>351
やさしいにもほどがあるな
354:デフォルトの名無しさん
08/01/14 09:41:33
教えたがりは一種の荒らし
355:デフォルトの名無しさん
08/01/14 10:18:46
中途半端なヤツほど、簡単な質問に答えたがる。
結局、自分自身の頭の整理をしてるんだろうな。
356:デフォルトの名無しさん
08/01/14 10:53:34
>>353-355
君たち気持ち悪いよ。
357:デフォルトの名無しさん
08/01/14 11:21:53
このスレ気持ち悪いよ
358:デフォルトの名無しさん
08/01/14 11:31:16
このスレ気持ち悪いよ
359:デフォルトの名無しさん
08/01/14 11:48:28
このスレ気持ち悪いよ
360:デフォルトの名無しさん
08/01/14 13:42:05
おいおいどう見ても皮肉のレスだろ
求めてる答えがあれなら質問の意味がないと思うぞ
361:デフォルトの名無しさん
08/01/14 14:04:34
だれも回答しないから自分で書いたんだろうな
362:デフォルトの名無しさん
08/01/14 18:30:10
質問スレって所で答えては駄目だと。じゃぁ、このスレの存在意義って何さ。
363:デフォルトの名無しさん
08/01/14 18:50:09
教えたがり撲滅
364:デフォルトの名無しさん
08/01/14 18:58:48
>>362
ごきぶりほいほい
365:デフォルトの名無しさん
08/01/14 20:43:59
要は面倒なことはやりたくないだけだろw
366:デフォルトの名無しさん
08/01/14 22:43:08
>>362
> 質問スレって所で
そう、ここは質問スレであって、
自社商品を購入してくれた顧客相手のサポートセンターでも
受講料を支払ってくれた生徒相手のスクールでも無い
367:デフォルトの名無しさん
08/01/14 23:14:23
要は面倒なことはやりたくないだけだろ
368:デフォルトの名無しさん
08/01/14 23:15:24
ここは無知な人間をののしるためのスレに決まってんじゃん
369:デフォルトの名無しさん
08/01/14 23:21:18
昔はそれなりにレスが付いていたが、今となっては・・・ね
370:デフォルトの名無しさん
08/01/15 00:05:33
Excel VBA回答スレが必要だな
371:デフォルトの名無しさん
08/01/15 00:41:49
質問です。
OS: xp pro
EXCELバージョン :2003
RGB値を使いセルの塗りつぶしを行いたいと思い、
Cells(1, 1).Interior.Color = RGB(227, 229, 223)と記述しました。
しかし実際セルの色を見てみるとまったく違う色が塗られていました。
色を解析するソフトでその色のRGB値を調べてみるとRGB(204,255,204)でした。
もうわけわかりません、アドバイスお願いします。
372:デフォルトの名無しさん
08/01/15 00:51:12
>>371
RGB(255, 0, 0)なら赤になるか?
なるならcells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか?
RGB解析ソフトでRGB(255, 0, 0)等が正しく読み取れるか?
これくらい試してみてくれないか?
373:デフォルトの名無しさん
08/01/15 01:21:22
>>372
ありがとうございます、試してみました。
RGB(255, 0, 0)なら赤になるか?→ なりました。
cells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか?
→
For w_row = 1 To 256
For w_gyo = 1 To 256
ThisWorkbook.Sheets(3).Cells(w_row, w_gyo).Interior.Color = RGB(w_row, w_gyo, 0)
Next
Next
を試したところ正しいグラデーションにはなりませんでした。
参考画像です。URLリンク(nagamochi.info)
ツール→オプション→色で表示したい色を追加すると表示できました。
これ以外には方法はないのでしょうか?
374:デフォルトの名無しさん
08/01/15 01:25:01
>>371
エクセルは全てパレット管理。
パレットの色しか表せない。パレット以外の色をVBA等で選んでも近いパレットの色を使用させられる。
↓
すなわちパレットを変更すればいい
>ツール→オプション→色で表示したい色を追加すると表示できました。
>これ以外には方法はないのでしょうか?
その表示できた方法をマクロの記録で記録してやればいい。
375:デフォルトの名無しさん
08/01/15 01:46:21
>>374
解決できました、ありがとうございました。
376:デフォルトの名無しさん
08/01/15 11:36:29
>>351
ありがとうございました!
377:334
08/01/15 11:42:32
>>351
そんなことを聞いているわけじゃありません、冗談は勘弁してください。
378:デフォルトの名無しさん
08/01/15 14:45:05
もっと言ったれw
379:デフォルトの名無しさん
08/01/15 18:52:50
>>334=377
ぷっっ て、ところだけど、何をききたいのか、言ってみたら。
折れが笑ってあげるからw
380:379
08/01/15 20:05:12
解決しました
381:デフォルトの名無しさん
08/01/15 20:49:36
>>380
おまい、アンカーもようつけんで、・・・www
382:379
08/01/15 20:52:47
>>380
は偽者です。
383:379
08/01/15 21:08:38
>>382
お前も偽物だろうがw
384:379
08/01/15 21:32:44
俺は偽物ですよ
でも>>380は本物ですよ
385:デフォルトの名無しさん
08/01/16 01:17:42
>>379
>>>334=377
いいえ、等しくありません。
386:デフォルトの名無しさん
08/01/16 10:06:13
>>373
どうでもいいが、RGB()関数って256を指定してもエラーにならないのか、知らなかった。
387:デフォルトの名無しさん
08/01/16 13:00:24
項目とデータを含んだ2次元配列変数A,B たとえばA(30×2),B(100×2)があり、
Bの100個の項目のなかからAの項目30に該当するものをそのままAのデータに代入したい
ということを考えています。ワークシート上で行う場合はlookup関数を使えばよいのですが
マクロのままで高速に行う方法はないものでしょうか?
ワークシート関数を使ったとしても一度ワークシートにデータを書き出さなければ
つかえないのでしょうか?色々調べても分からなかったので
どなたか御教示頂けると嬉しいです。
388:デフォルトの名無しさん
08/01/16 13:26:11
>>387
ん? というか、既に処理を書いてるんだったら、
VBAで処理してからワークシートに吐いた方が、そりゃ若干早いはずだと思うが。
389:デフォルトの名無しさん
08/01/16 13:46:00
あ、すみません。Bの項目、データは揃っていますが、Aは項目だけで
B100個の項目の一部でAの30個の項目と重複しているものを検索、抽出して
Aの該当する項目のデータとして代入しようとしています。
ワークシートの上でやるのなら、lookup関数をつかえば良いのでしょうが
ワークシートを一切いじらずに配列の内部処理だけで同様な操作を高速に
できないかと悩んでいる次第です。
390:デフォルトの名無しさん
08/01/16 14:21:54
>>389
Dim i, j As Integer
Dim AKey(30), AValue(30), BKey(100), BValue(100)
For i = 0 To 29
For j = 0 To 99
if AKey(i) = BKey(j) Then AValue(i) = BValue(j)
Next j
Next i
こういう事かな?
この程度の個数ならワークシートでやってもほぼ一瞬だと思うけど。
391:デフォルトの名無しさん
08/01/16 17:41:03
質問。
セル[A2:C2]に英語・数学・国語の得点が入っている。合計点を計算し、
セル[D2]に入れるマクロを作成しなさい。
また、合計点が270点以上の時には「大変よくできました」、
180~269点のときには「よくできました」、
180点未満のときには「がんばろう」というメッセージをセル[E2]に表示しなさい。
英語の得点は90点
数学の得点は85点
国語の得点は100点 とする。
よろちくね。
392:デフォルトの名無しさん
08/01/16 18:03:29
>>391
それは質問とは言わないような・・・。
Sub Macro()
Range("D2") = Range("A2") + Range("B2") + Range("C2")
Select Case Range("D2")
Case Is >= 270
Range("E2") = "大変よくできました"
Case Is >= 180
Range("E2") = "よくできました"
Case Else
Range("E2") = "がんばろう"
End Select
End Sub
393:デフォルトの名無しさん
08/01/16 19:17:08
デフォルトプロパティの省略はやめましょう
少なくとも他人にコードを渡すときは
394:デフォルトの名無しさん
08/01/16 21:49:52
2007で作ったマクロは何であんなに重くなるんだ。
一旦5.0で保存したら軽くなったんだけどまともに動かなくなるし。
これから2007が標準になっていくのかと思うと憂鬱だ。
395:デフォルトの名無しさん
08/01/16 21:59:19
うちの会社、未だに2000使ってて、GJ!!!
自宅の自前PCも、2000のまま。サポートし続けろよ>MS
396:デフォルトの名無しさん
08/01/16 22:02:13
Office 2000
メインストリーム サポート : 2004 年 6 月 30 日終了
延長サポート 期間 : 2004 年 7 月 1 日から 2009 年 7 月 14 日まで
(修正プログラム サポートには最新のサービス パックがインストールされている必要があります)
397:デフォルトの名無しさん
08/01/17 10:00:49
>>390 ありがとうございます。
やりたいことはそういうことなのですが、
その書き方だと要素が膨大になった時は明らかに遅くなると思います。
VBA上で高速に行う書き方などご存知ありませんでしょうか?
398:デフォルトの名無しさん
08/01/17 10:22:24
>>397
アルゴリズム的な話なら、手法はいろいろあるが、「VBA上で高速に行う書き方」ではなく
「VB言語で高速に行う書き方」になるので、例えExcelでやるとしてもスレ違いだよ >>2★3★4
399:デフォルトの名無しさん
08/01/17 11:14:43
>>397
参照される側(ここではB)をCollectionにすればO(n)なるよ。
Dim i As Integer
Dim AKey(30), AValue(30)
Dim B As New Collection
For i = 0 To 29
AValue(i) = B.Item(AKey(i))
Next i
400:デフォルトの名無しさん
08/01/17 11:51:13
各都道府県に分けられているデータをdataという名前のシートに集計するプログラムを作成したいです。
簡単に言いますと1つのシートに47個のシートを入れたいです。
よろしくお願いします
401:デフォルトの名無しさん
08/01/17 12:51:36
>>392 さん
ありがとうございます。
402:デフォルトの名無しさん
08/01/17 20:37:20
>>400
>1つのシートに47個のシートを入れたいです。
意味不明
1つのブックに47個の県別シートを作りたいという意味なのか?
逆に県別に47個あるシートから1つのdataって言う名前のシートに集計したいってことなのか?
どのセルに何をどういう条件で集計するのかも書いていない。
403:デフォルトの名無しさん
08/01/17 22:54:26
質問です、VBA構造体配列を初期化したいのですがどうすればいいですか?
調べたのですがよくわかりませんでした。
404:デフォルトの名無しさん
08/01/17 23:16:07
初期化用の構造体を作って代入
405:デフォルトの名無しさん
08/01/18 00:46:52
初期化用関数作る
406:デフォルトの名無しさん
08/01/18 01:31:22
403です。
404.405さん以外のやり方を探しているのですがEarseの使い方やZreoMemoryの使い方がわからないです
407:デフォルトの名無しさん
08/01/18 02:43:12
>Earseの使い方やZreoMemoryの使い方がわからないです
そりゃそうでしょう、そんなものありませんから。
408:デフォルトの名無しさん
08/01/18 08:27:07
>>403
その辺の仕様はVB6と一緒です
つまり>>2★3★4
409:デフォルトの名無しさん
08/01/18 11:59:04
VBAを実行する前に、このブックが共有されているかどうか
調べて、結果を返す方法は無いでしょうか。
410:デフォルトの名無しさん
08/01/18 12:20:06
>>409
Workbook.MultiUserEditing で調べられるけど、これはVBAだからダメってこと?
411:デフォルトの名無しさん
08/01/18 12:25:45
VBA実行してからまたきてね♪
412:デフォルトの名無しさん
08/01/18 12:31:44
ありがとうございます!
いえ、multiuserediting の存在を知りませんでした・・
413:397
08/01/18 14:55:18
>>398,>>399さん、判りました。自分でもまた試してみます。
ありがとうございました。
414:デフォルトの名無しさん
08/01/18 18:11:23
使えねーな
415:デフォルトの名無しさん
08/01/18 19:41:23
Worksheet_Changeで対応できない書式の変更にリアルタイム反応するためユーザーが入力した書式などをリアルタイム監視するプログラムを作成したところ、終了条件の問題に突き当たり処理に悩んでます。
'-----------------------------
Private EndFlg As Boolean
Sub Worksheets_Activate
EndFlg = False
Call 監視処理
End Sub
Sub Worksheets_Deactivate
EndFlg = True
End Sub
Sub 監視処理
Do
(処理)
DoEvents
Loop Until EndFlg = True
End Sub
'------------------------------
このようなものが、ほとんどのワークシートに書いてある状態です。
Loop Until EndFlg = True の直後にメッセージボックスを設け確認したところ、Worksheet_Activateのあるシートに移動するとその場では終了せず、Activateのないシートに移動した瞬間に終了します。
たとえばActivateのあるシートA、BとActivateのないシートCがある場合
A→C、B→Cは正常な終了が確認できるのですが
A→B、B→Aは終了メッセージが出ません。
A→B→A…を延々繰り返したあとにCを選択すると、終了メッセージがA⇔Bした回数に比例して複数出るため多重起動であると断定できました。
Activateのないシートをはさまずに開放する方法ありませんでしょうか。
416:デフォルトの名無しさん
08/01/18 20:16:17
TextBox1の入力に応じてlistboxの内容を決め、
クリックされた項目とTextBox1の入力を考慮して
TextBox2の内容を決めるということをやろうとしています。
後述のように書こうとしました。
Private Sub TextBox1_Change()
'入力に応じてワークシートからhaniにアドレスを取り出す
以下略
With UserForm1.ListBox1
.ColumnCount = 1
.RowSource = hani.Address
End With
End Sub
Private Sub ListBox1_Click()
'先ほどの入力とリストの結果からテキスト2の内容を決める。
UserForm1.TextBox2.Value = 以下略
End Sub
このようにするとPrivate Sub TextBox1から
Private Sub ListBox1_Click()に受け渡されるのは
haniの内容だけで、それ以外の変数を渡そうとしても
上手くいかず困っています。callの構文を使えば良いのでしょうか?
色々調べてみても判らずどなたかアドヴァイス頂けると嬉しいです。
417:デフォルトの名無しさん
08/01/18 22:25:58
初歩的ですみません。
VBAで、あるセル範囲にある数式の答えを出力するにはどうすればいいんでしょうか?
Range("A1:A5")="b2/2+b5"みたいにすると数式がそのまま出力されるし・・・
418:デフォルトの名無しさん
08/01/18 22:31:50
>>417
それが初歩的だとわかるぐらいならじゅうぶん中級車さ
419:デフォルトの名無しさん
08/01/18 22:32:42
>>415
ループが入れ子になってると思う。
監視処理を各シートにを書くんじゃなくて、どこか一枚に
Sub 監視処理
Do
if !SheetA.EndFlg(0) = False Then (処理)
if !SheetA.EndFlg(1) = False Then (処理)
・・・
DoEvents
Loop Until 監視終了=True
End Sub
とか何とか書いて、実行しておけばいいんじゃないかな?
>>416
言ってる意味がよく判らないけど、
TextBox1_Change()内で使ってる変数を、ListBox1_Click()内でも使いたい、
と言う事なら、グローバル変数でも使えばいいんじゃないの?
>>417
Range("A1:A5") = "=b2/2+b5"
420:デフォルトの名無しさん
08/01/18 23:11:24
>>415
DoEvents ステートメントは、ウィンドウズメッセージとイベントプロシージャの処理が終わるまで
戻ってこないから、多分、AのDeactivate⇒即座にBのActivateが走ってる状態。
ちょっと構造を見直した方がいいかもね。
421:デフォルトの名無しさん
08/01/19 17:14:35
OS XP、Excel2003
普段は、VBエディタから 挿入 → 標準モジュール で
Module** といったファイルを作成してコードを書いています。
このModule** というファイルを自分の好きな名前にするのにはどうしたら良いのでしょうか?
422:デフォルトの名無しさん
08/01/19 17:25:27
右クリックの名前を変更かF2でできたと思う。
423:421
08/01/19 19:16:55
>>422
ご解答ありがとう御座います。
しかし、右クリックしても「名前を変更」が見つかりません。
また、F2ではオブジェクトブラウザという表示になるのですが
名前を変更する方法がわかりません。
分かる方みえましたらお願いします。
424:デフォルトの名無しさん
08/01/19 19:22:37
>>423
プロパティウィンドウ→オブジェクト名を変える
425:デフォルトの名無しさん
08/01/19 19:23:18
>>423
プロパティウィンドウの、(オブジェクト名)を変更すると変わる。
426:416
08/01/19 21:26:44
>>419 ありがとうございます。グローバル変数にしたら解決しました。
また基本的な質問ですみませんが
マクロを起動した瞬間にリストboxに
候補を表示させようとしました
Private Sub UserForm1_initialize()
Set com1_r = Range("A1:A5")
With UserForm1.ListBox2
.ColumnCount = 1
.RowSource = com1_r.Address
End With
End Sub
のように書いても表示されません。
他のPrivate Sub TextBox1_Change()等に
書いた時は表示されるのですが
一体何が誤っているか御指摘頂けませんでしょうか?
427:421
08/01/19 21:29:38
>>424
>>425
教えて頂いた方法で出来ました。
大変ありがとう御座いました。お二人に幸あれ。
428:デフォルトの名無しさん
08/01/19 21:56:53
>>426
そのコードをそのままこちらで実行してみたけど、問題なく動いたよ。
何か別の場所でミスしてるんでは?
例えば、
値を表示させたいリストボックスのオブジェクト名が ListBox2 ではなく ListBox1 だった、とか
代入元のセル A1:A5 の値がマクロ起動時には空白だった、とか。
今一度、確認すべし。
429:質問
08/01/19 22:40:54
Visual Basic Editerの画面で何かの拍子に下記のように
操作パネルが統合されなくなってしまいました。
どうすれば元通りにできるでしょうか?よろしくお願いします!
URLリンク(members.at.infoseek.co.jp)
430:デフォルトの名無しさん
08/01/19 23:08:09
>>428 Private Sub UserForm1_initialize()
だとgeneralになっていたので
Private Sub UserForm_initialize()
に直すとUserFormになって動きました。
作ってるのはUserForm1なのに不思議ですね。
ともかく有難うございました。
431:デフォルトの名無しさん
08/01/19 23:51:21
>>430
画面のコントロール以外(フォーム、クラス等)のイベントプロシージャ名は、
オブジェクト名に影響されないハズなんだけどね。何でだろ?
でも、言われてみれば違和感あるよな。今気づいたw
432:429
08/01/19 23:52:15
自己解決しました。
プロジェクトエクスプローラで「ドッキング可能」にしたら直りました。
下記にも載ってました(^^)
URLリンク(www2.moug.net)
433:デフォルトの名無しさん
08/01/19 23:52:47
>>429
メニューの、ツール ⇒ オプション ⇒ [ドッキング] タブ を確認してみて。
434:デフォルトの名無しさん
08/01/20 00:16:46
>>400
47個あるシートから1つのdataと言う名前のシートに集計したい場合は多分これです。
Sub test()
Dim ws As Worksheet
Dim r As Range
Dim rr As Range
With Worksheets("data")
Set rr = .Range("A1")
For Each ws In Worksheets
If ws.Name <> .Name Then
Set r = ws.Range("A1").CurrentRegion
rr.Resize(r.Rows.Count, r.Columns.Count).Value = r.Value
Set rr = rr.Offset(r.Rows.Count)
End If
Next
End With
End Sub
435:デフォルトの名無しさん
08/01/20 00:28:12
>>427
祈われるまでもなく幸ねぇよw
>>400
もうちょい詳しく書かないと失礼だぞぅ
436:デフォルトの名無しさん
08/01/20 00:30:46
range変数で格納できる範囲はRange(Cells(1, 1), Cells(5, 4))
のような一枚のワークシート上の範囲だけでなのでしょうか?
1枚目のRange(Cells(1, 1), Cells(5, 4))と2枚目のなんたらのように
別のsheetにわたった範囲の格納などしたい場合はどうすればいいのでしょう
437:デフォルトの名無しさん
08/01/20 00:57:59
>>436
それは無理。 クラスの概念を知らないと分からないかもしれないけど。
別々の変数に持たせるしかないと思う。もちろん、配列やコレクションは使えるはず。
438:デフォルトの名無しさん
08/01/20 20:46:37
Excelの分析ツールを使ってランダムにサンプルを取り出して計算するシート作ったのですが
Application.ScreenUpdating = False
て書いてもサンプル取り出すたびに再計算画面が出てしまいます
画面更新しないようにするにはどうしたらいいですか?
Sub MonteSample()
Dim myMonte As Integer
Dim i As Integer
Dim myMsg As String, myTitle As String
Dim myFun As Range
Dim myAv As Long, myStd As Long, myMax As Long, myMin As Long
Dim n As Long
Dim mysouce As Range
Dim mydat As Range
Dim mydats As Range
myMsg = "計算回数を入力してください"
myTitle = "モンテカルロ・シュミレーション"
myMonte = Application.InputBox(prompt:=myMsg, Title:=myTitle, Default:=30, Type:=1)
If Range("A12") = "" Then
MsgBox "A12のセルから損益のデータを入力してください", vbOKOnly + vbExclamation
End
End If
Range("D12:D1011").Select
Selection.ClearContents
Range("K32:K100").Select
Selection.ClearContents
Range("i32:i33000").Select
Selection.ClearContents
Application.ScreenUpdating = False
439:デフォルトの名無しさん
08/01/20 20:48:04
For i = 1 To myMonte
Range("A12").Activate
Set mydat = ActiveCell.CurrentRegion
Set mydats = mydat.Offset(1, 0).Resize(mydat.Rows.Count - 1, _
mydat.Columns.Count)
Application.Run "ATPVBAEN.XLA!Sample", mydats, _
ActiveSheet.Range("D12:D1011"), "R", 1000, False
Range("I65536").End(xlUp).Offset(1).Select
ActiveCell.Value = Range("E1011")
Range("D12:D1011").Select
Selection.ClearContents
Next i
Range("N4").Value = myMonte
Range("I31").Activate
Set myFun = ActiveCell.CurrentRegion
myFun.Offset(1, 0).Resize(myFun.Rows.Count - 1, _
myFun.Columns.Count).Select
myAv = Application.WorksheetFunction.Average(myFun)
Range("N5").Value = myAv
myStd = Application.WorksheetFunction.StDev(myFun)
Range("N6").Value = myStd
myMin = Application.WorksheetFunction.Min(myFun)
Range("N7").Value = myMin
myMax = Application.WorksheetFunction.Max(myFun)
Range("N8").Value = myMax
Range("K32").Value = myMin
Range("K33").Select
440:デフォルトの名無しさん
08/01/20 20:49:08
For i = 1 To 49
n = ActiveCell.Offset(-1).Value
ActiveCell.Formula = Int((Abs(myMin) + myMax) / 49) + n
ActiveCell.Offset(1).Select
Next i
Range("L32:L81").Select
Selection.FormulaArray = Application.WorksheetFunction.Frequency(myFun, Range("K32:K81"))
Set mysouce = Range("L32:L81")
ActiveSheet.ChartObjects(1).Activate
ActiveChart.SetSourceData Source:=mysouce, PlotBy:=xlColumns
Application.ScreenUpdating = True
End Sub
441:デフォルトの名無しさん
08/01/20 21:03:23
Application.ScreenUpdating = False
Application.ScreenUpdating = True
↓
Application.EnableCalculation = False
Application.EnableCalculation = True
442:デフォルトの名無しさん
08/01/20 21:22:32
>>441
再計算しない場合はそんなのあるのか、ありがとう。
でも、変えてみたけど実行時エラーでてだめだった、
ワークシートで再計算してるから使えないのか
ワークシートの再計算はそのままで画面の更新だけ止めるのはできないのかな
443:441
08/01/20 22:05:30
折れには、試す気もないのでわからない。
続けての回答を待っているといけないから、折れには以後書くことはないと伝えておくよ。
あと、折れが使うのは
Application.EnableEvents = False (と True)
Application.Visible = False (と True)
444:デフォルトの名無しさん
08/01/20 22:17:22
>>443
いろいろありがと
新しいこと少し覚えられてよかったw
まあ、うまくいかなかったけど趣味で使ってるだけだから
そのうちできるようになると思うのでゆっくりやります
445:デフォルトの名無しさん
08/01/20 23:58:30
>>442
全くためしてないんだが
Application.ScreenUpdating = 画面の更新をするか
Application.EnableCalculation = 再計算してるか
を考えれば幸せになるんじゃね?
俺的には全部コードでやっちゃうがw
446:441
08/01/21 01:01:55
>>442での「実行時エラー」ってのが、気になった・・・
application.run関係ぐらいしか実行時エラーが出うる箇所はないように見えた。
もしかしたらだけど、ここが参考になるかも
URLリンク(www.geocities.jp)
おやすみ
447:デフォルトの名無しさん
08/01/21 01:59:57
>>445
>>446
ありがとうございます。
441さんの指摘のようにapplication.runが原因みたいです
Excelの分析ツール使うと画面更新されてしまうみたいです
ワークシート上だけで乱数関数使って同じようなコードで実行したら、
画面は更新されないでうまくいきました。
鋭い指摘ありがとう!
448:デフォルトの名無しさん
08/01/21 15:40:17
例えば、C3からK11まで範囲指定するのに、
rangeを使わず、offsetを使って指定することは可能でしょうか。
やりたいことをイメージ化すると以下のようなのですが・・・
Sub hoge()
Range("A1").Select
Range(ActiveCell.Offset(2, 2).Select, ActiveCell.Offset(10, 10).Select).Select
End Sub
449:デフォルトの名無しさん
08/01/21 15:58:59
あのさ、
いちいちこのスレで聞くよりもさ、
自分でググるなり本を買うなりして調べた方が圧倒的に早いと思うんだけど。
450:デフォルトの名無しさん
08/01/21 16:09:36
range("A1").select
range(selection.offset(2, 2), selection.offset(10, 10)).select
--
dim r as range
set r = range("A1")
debug.print range(r.offset(2, 2), r.offset(10, 10)).address
range(r.offset(2, 2), r.offset(10, 10)).value = 12345
451:デフォルトの名無しさん
08/01/21 16:10:15
>>448
つか、目的がよくわかんねーよ。 あと、その例文、.Offset に .Select付いてたらエラーになるぞ。
そもそも、Offset って、基本的にRangeのプロパティなんだが。Rangeを使わずにどうしろと?
452:デフォルトの名無しさん
08/01/21 16:57:48
If 気に入らない or わからない Then
スルーしろ
End If
453:デフォルトの名無しさん
08/01/21 17:01:03
意味が分かれば協力する気持ちがあるから訊いてるんだよ。全否定すんな。
それとも、どこが分からないか、こちらが分かりやすく優しく丁寧に質問しないとダメなのかよ?
454:448
08/01/21 17:19:29
すまん!
Sub hoge()
Range("A1").Select
Range(ActiveCell.Offset(2, 2), ActiveCell.Offset(10, 10)).Select
End Sub
selectとったらいけました。
逝ってくる
455:デフォルトの名無しさん
08/01/21 17:56:47
>>453
やりたいことの「イメージ」って書いてるだろ。
これで意図がわからんというのがわからん。
456:デフォルトの名無しさん
08/01/21 20:42:56
>>453はかわいそうな子
457:451
08/01/21 21:10:50
>>455
レスの流れぐらい見ろよ。レスから読み取れる範囲で回答はしてる。
それとも、IDがないと同一人物かどうかも判断できんか?
458:デフォルトの名無しさん
08/01/21 23:47:53
構造体の2次元配列の参照って
Kouzoutai(1,2).Member = 1
という形であってます?
オブジェクトが必要ですとかいうエラーが返ってくるんですが…
459:デフォルトの名無しさん
08/01/21 23:59:26
すごいな。
もう思いついたことをとりあえず質問するスレになってるな。
>>458なんてはなっから自分で調べる気ないもんな。
460:デフォルトの名無しさん
08/01/22 00:30:46
>>458
オブジェクトがないんだよ。
Dim Kouzoutai( 5, 5 ) as HOGE
って形になってるか?
どうせ
Type Kouzoutai
Member as integer
End Type
とかになってんだろ。
「VBA 構造体」でググればびっくりするくらいヒットするじゃないか。
461:デフォルトの名無しさん
08/01/22 07:24:11
OSはWindows XP Home Edition、
Excelは2003の11.8169.8172です。
VBA初心者でここも初めてです。質問させてください。
2種類のグラフをそれぞれ別のシート上のオブジェクトとして作成しました。
(2つ同時ではなく、まず1つ目のグラフを作り、その後別のグラフを作るというやり方です。)
2つ目のグラフを作る際、1つ目のグラフの数値軸で自動的に表示された軸の最大値と最小値を
2つ目のグラフにも反映させたい(同一の値にしたい)のですが、
どのように記述すれば1つ目のグラフの最大値や最小値を呼び出すことができますか?
With ActiveChart.Axes(xlValue)
.MinimumScale = ココと
.MaximumScale = ココです。
End With
ぜひヒントがほしいです、よろしくお願いします。
462:デフォルトの名無しさん
08/01/22 12:59:28
>>461
確認する時間がないのでヒントのみ。 あとはヘルプ見ながら直して。
Dim s As Worksheet
Dim c As ChartObject
Set s = Worksheets.Item("test") ←"test" って名前のシートが取得できる
Set c = s.ChartObjects(1) ←取得したシートの、1つめの図を取得
あとは c.Chart.Axes.Item(xlValue).MinimumScale な感じで対応する値が取得できると思われ。
まとめて書くこともできるが、とりあえず入力補助に反応する書き方にしといた。
463:デフォルトの名無しさん
08/01/22 13:25:13
E6からE26とN6からN26に数字を入力したのですが、このコードよりも簡単な方法はないでしょうか?
Dim c As Long
Dim f As String
Dim v1() As Variant
Dim v2() As Variant
With Excel.Range("E6:E26,N6:N26")
c = .Areas.Item(1).Count
f = "ROW(" & .Worksheet.Range("A1") _
.Resize(c).Address & ")"
v1 = .Application.Evaluate(f)
v1 = .Application.Small(.Cells, v1)
f = "ROW(" & .Worksheet.Range("A" & 1 + c) _
.Resize(.Areas.Item(2).Count).Address & ")"
v2 = .Application.Evaluate(f)
v2 = .Application.Small(.Cells, v2)
.ClearContents
.Areas.Item(1).Value = v1
.Areas.Item(2).Value = v2
End With
464:デフォルトの名無しさん
08/01/22 13:31:48
>>463
日本語でやりたいことを書け
465:デフォルトの名無しさん
08/01/22 13:38:05
>>463 観光客の人数をExcelで作成したのですが、E6からE26とN6からN26
に観光客の人数を入力したのですが、これを小さい順に書き換えるにはどうし
たらいいのですか?
466:デフォルトの名無しさん
08/01/22 13:46:13
つ【並べ替え(S)】
467:デフォルトの名無しさん
08/01/22 18:25:19
「セルが特定の値以外のとき、自分の行を削除」したい。
IFでセル内容を指定してから
Range.deleteでどうやって削除条件にすべきでしょうか。
468:デフォルトの名無しさん
08/01/22 20:22:56
な、何なんだこのスレは・・・
469:デフォルトの名無しさん
08/01/22 22:05:12
このスレは池沼のフリして教えたがりのうざいヲタを釣るスレですが、なにか?
470:デフォルトの名無しさん
08/01/22 22:13:25
ってことはこれは釣れたってことでFA?
471:デフォルトの名無しさん
08/01/22 22:49:21
>>470
お前がなw
472:デフォルトの名無しさん
08/01/22 23:03:33
やたー☆
473:デフォルトの名無しさん
08/01/23 11:53:11
やったー +1
474:デフォルトの名無しさん
08/01/23 18:41:55
ここで良いかどうか分かりませんが・・・
ビデオカードの現在の解像度(できればモニタのインチ数も)によって、
ActiveWindow.Zoomの値を変更するプログラムを考えているのですが、
vbaでビデオカードの現在の解像度を調べるのは不可能でしょうか?
475:デフォルトの名無しさん
08/01/23 21:16:04
>>474
vba api 解像度 でぐぐれば、2番目にあなたの望む回答が
476:デフォルトの名無しさん
08/01/24 08:57:54
良回答認定
477:デフォルトの名無しさん
08/01/24 09:11:24
>>475
ありがとうございます!
下調べはしてたつもりだったのですが、
甘かったです・・・orz
478:デフォルトの名無しさん
08/01/24 10:01:12
恥ずかしながら全く分かりません。
何卒お願い申し上げます。
次の選択肢より正しい記述をすべて選びなさい。
1:java.io.FileReaderはテキストファイルから文字を行単位で読み込むクラスである。
2:new File("bbs.txt")と記述すると、新しいファイルが作成される。
3:ファイルの操作を行う前には、Fileクラスのopenメソッドを必ず使用する。
4:BufferedReaderクラスのreadLineメソッドは、ファイルの終端までを読み込む。
5:FileクラスのisFileメソッドの戻り値がfalseだった場合は、そのファイルが無いか、またはその名がディレクトリである事を示している。
479:デフォルトの名無しさん
08/01/24 10:06:39
>>478です。
申し訳ありません、スレ違いでした。
失礼致しました。
480:デフォルトの名無しさん
08/01/24 10:33:36
アクセスのVBAのスレが見付からないのでここで質問します。
アクセスのVBAで、フォーム1
ユーザ登録画面
ユーザ名[ ]
パスワード[ ]
登録
があり、2つを入力し、登録を押したら登録できるのを教えてください
481:デフォルトの名無しさん
08/01/24 10:37:07
>>478です。
何度もすみません。もうこのスレに書いてしまったので、
ほかのスレに書いたら、マルチポストとか云うのに
なってしまいますので、もしよろしければこのスレで
教えて頂けないでしょうか?
482:デフォルトの名無しさん
08/01/24 11:04:47
>>481
誤爆はマルチにはならないと思うよ。
マルチポストだって言うヤツは居るかもしれんが、普通に教えて貰えると思う。
俺も多少は分かるけど、このスレで回答したくない。回答が違ってても突っ込みがなさそうだから。
483:デフォルトの名無しさん
08/01/24 11:06:44
>>482さん。
ありがとうございます。
助かりました。
484:デフォルトの名無しさん
08/01/24 12:07:30
AutoFilterが設定されたシートで選択されたセルの行数を知るには、下記の方法で
出来る事が分かったのですが、もっと簡単な方法がありますでしょうか?
Dim r As Range, rcnt As Long
rcnt = 0
For Each r in ActiveWindow.Selection.Rows
If Not r.Hidden Then
rcnt = rcnt + 1
End If
Next
485:デフォルトの名無しさん
08/01/24 17:23:24
すいません、VBA超初心者です。
"地域A"というシートから魚名前を検索して個数(魚の名前の2つ下のセル)と総量(個数のセルの1つ右)の数値を
台帳(以下の記述ではシート名”漁獲量”)シートの各魚の行に転記させたいのですが、
一生懸命ヘルプやネット検索しながら自己流で記述しましたが
「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
と出ます。
どなたか正しい記述をアドバイスしていただけませんでしょうか?
486:485
08/01/24 17:24:49
Private Sub CommandButton1_Click()
Dim fish As String
Dim i As Integer
Dim wrkA As Integer
Dim wrkC As Range
Dim wrkB As Range
With Sheets("地域A")
wrkA = .Cells(1, Columns.Count).End(xlToLeft).Column
wrkC = .Range("A1").Resize(1, wrkA)
wrkB = .Range("A3").Resize(1, wrkA)
End With
Dim wrkD As Integer
With Sheets("漁獲量")
wrkD = .Cells(Rows.Count, 1).End(xltoUP).Row
wrkE = .UsedRange
fish = .Range(wrkD, 1).Value
End With
487:485
08/01/24 17:25:54
つづきです
For i = 1 To wrkA
If fish = wrkC("wrkA,i") Then
fish = wrkB(1, i)
Cells(wrkD, 1).Offset(0, 1) = wrkB(1, i + 1)
Else
fish = " "
Cells(wrkD, 1).Offset(0, 1) = " "
Exit For
End If
Next i
End Sub
488:デフォルトの名無しさん
08/01/24 17:55:01
>>485
ちょっと突っ込みどころが多すぎるので、全部回答はできないんだけど、
まだ基本を分かりきってないみたい。
とりあえず、 With Sheets("地域A") With Sheets("漁獲量") のトコを
Dim ws As Worksheet ←もちろん最初(1箇所)だけ
Set ws = ThisWorkbook.Worksheets("地域A")
With ws
のような形に修正すれば、"."キーを押したときに入力補助が反応するから、
それを参考に修正するといいと思う。この入力補助が反応するようなコードってのは結構重要。
("."を押してもメソッドが出なければ、記述したところでほとんど実行時エラーになる)
あとは、.End(xltoUP) の定数は xlUp がいいのと、
fish = .Range(wrkD, 1).Value の行みたいに、Cells と Rangeの使い分けが混乱してるかな。
489:485
08/01/24 18:00:49
>>488
どうもありがとうございます!!
突っ込みどころ満載ですか…笑
ご指摘を元に再度勉強してがんばってみます!!
490:488
08/01/24 18:30:38
>>489
ゴメン、もっと重要なポイントがあった。
wrkC = .Range("A1").Resize(1, wrkA) は、オブジェクト型変数への代入になるので、
Set wrkC = .Range("A1").Resize(1, wrkA) という書式を必ずとること、です。
491:デフォルトの名無しさん
08/01/25 09:36:51
漁獲量・・・
492:デフォルトの名無しさん
08/01/25 23:56:11
すみません。vlookupのワークシート関数がうまく動きません。
普通のvlookupのようにvlookup(値、範囲、2、False)としましたが
エラーが出てしまいます。範囲がおかしそうですが
どう書き方が誤っているのかがよく判りません。
どなたか、御指摘願えませんでしょうか?
With Worksheets(2)
'Xは適当な自然数です。
For i = 1 To 100
Cells(i + 1, 2) = Application.VLookup(Cells(1, 1).Offset(i, 0).Value, .Range(Cells(2, 3), Cells(X, 4)).Address, 2, False)
Next i
493:デフォルトの名無しさん
08/01/26 01:11:11
すみません。色々試行錯誤していたら解決しました。有難うございました
494:デフォルトの名無しさん
08/01/26 17:35:21
かなり高度な質問です。
Me.Controls.Add("Forms.textbox.1","品名",True)
のFormsって一体何なのですか?
495:デフォルトの名無しさん
08/01/26 17:48:24
余りに低レベルなので泣けてきました。
496:デフォルトの名無しさん
08/01/26 17:52:19
OLEコントロールの名称でないの。
Microsoft Forms 2.0 TextboxのPROGID
497:デフォルトの名無しさん
08/01/27 13:51:07
VBAの中でソルバ関数を実行しようとしてます。
その目的セルの評価値を計算する際に、さらにソルバを実行したいです。
(つまりソルバの2重ループになる感じ)
が、これを実現できなくて困っています。
考えてたのは、内側のループのソルバ部分を関数にして
ワークシートから呼び出せるようにして、
それを外側ループのソルバの目的セルの数式に放り込んでやればいい、
という方法なんですけど、
VBAのFunctionの中でソルバをまわそうとすると
シート上の値を書き換えなければならないのでエラーになってしまいます。
かといってそれをサブプロシージャにしても
ワークシート上の数式として表せないので、
結局外側のループで使えません。
何とかこれを達成する妙案はないですかね…
達成したとしても重くて不安定にはなると思うんですが、
それは承知の上です。
環境はWinXP SP2+Excel2000です
498:デフォルトの名無しさん
08/01/27 13:57:52
↑根本的に何かを勘違いしてないか?
499:デフォルトの名無しさん
08/01/27 14:03:45
勘違い・・・っすか
どのへんがおかしいんでしょう?
それすらわからんです
500:デフォルトの名無しさん
08/01/27 18:11:32
ソルバ?
URLリンク(www.joy.hi-ho.ne.jp)
501:デフォルトの名無しさん
08/01/27 23:00:39
Excel2003です。
OnErrorでエラーメッセージの出力を指定しても、
エラーだとそのエラーで無事処理は終わるのですが、
本来エラーにならない場合でも、エラーメッセージ出力→正常処理 となるんですけど。
何か原因は考えられますか?
(プログラム持ち出せないのでここに書けないのです)
502:デフォルトの名無しさん
08/01/27 23:16:08
デバッグトレースシテクダサーイ
503:デフォルトの名無しさん
08/01/28 00:09:18
>>501
On Error で飛ぶタグの前に Exit Function を書いてなかった、とか言ったら頃すぞ?
504:デフォルトの名無しさん
08/01/28 00:49:26
Exit Function を書いてなかった位で殺されるんじゃタマッタもんじゃない。
505:デフォルトの名無しさん
08/01/28 01:15:06
マジレスのハズもないのに、
ネタや回答の一つも返さず、つまらんマジツッコミを入れるとは一体どういう了見か?
506:デフォルトの名無しさん
08/01/28 01:16:04
>>504
金払って許してもらおうぜ
507:デフォルトの名無しさん
08/01/28 10:02:19
うんこ出た
超きもちいい
508:501
08/01/28 12:59:32
マクロの最初に
On Error Msgbox
On Error exit Sub
で、以下正常時の処理を記述しているのだが。
Exit Function書くとエラーが出る。
509:デフォルトの名無しさん
08/01/28 13:09:09
>>508
そもそもそれコンパイル通るの?
↓なら問題ないと思うけど。
Privete Sub 処理()
On Error GoTo ラベル
(通常処理)
Exit Sub
ラベル:
(エラー処理)
End Sub
510:デフォルトの名無しさん
08/01/28 16:54:46
Sub abc
Dim rng As Range
Set rng = Selection
test rng
End Sub
Function test(r As Range)
Dim c As Range
For Each c Iin r
'cの処理
Next
End Sub
と選択範囲を引数にしてtestを呼び出しますが、testの引数rはByValにした方がいいんでしょうか?
きちんと動くには動くのですが、ちょっと不安になったもので教えてください。
511:デフォルトの名無しさん
08/01/28 17:48:36
>>510
その程度のものを分ける必要があるか知らんが、ByValは無意味。
そこはそのまんま参照渡しが正解。
それよりFunctionは気持ち悪くないかい?
Private Sub test(r As Range)
とするのが普通だろ?
Functionって戻り値を得るものに限定した方がいいと思うが。
512:デフォルトの名無しさん
08/01/28 17:52:07
なんだ、下はEnd Subになってるじゃん
513:510
08/01/28 19:47:40
>>511-512
すみません、実際は最後はEnd Functionとなってます。
Functionはおかしいんですかねぇ。
それはさておき、実は某所で引数が参照型の場合、ByValが速いとかByRefは気持ち悪いとかいう方がいるんですがどうなんでしょうか?
ご存知でしたらお願いします。
514:デフォルトの名無しさん
08/01/28 20:22:33
>>513
byrefだと参照の参照が渡されるから
確かに気持ち悪くて遅いわな。
大差ないけど。
515:デフォルトの名無しさん
08/01/28 20:32:01
ByRef の方が遅いのか・・・。 知らなかった。
値渡し=全引数を別アドレスにコピー ⇒ 少し余分に時間が掛かる と思ってた。
516:デフォルトの名無しさん
08/01/28 20:40:11
そのsubなりfunctionなりの内部で変更する場合のみbyrefで、
それ以外はbyvalでという方針にしておくのが良い。
(自分で定義したサイズが大きな型は別)
517:デフォルトの名無しさん
08/01/28 20:41:15
>>514
なんか勘違いしてない?
実際にやってみたらどうよ。
ByValが速いはずねーだろ?
>>510のおかしなコードじゃ分からないだろうが、なんか戻り値のあるFunctionで試したら?
518:デフォルトの名無しさん
08/01/28 20:42:00
>>515
やってみりゃわかるけど、byrefの方が速いよ
519:デフォルトの名無しさん
08/01/28 20:43:16
>>514
「参照の参照」という表記が、参照がわかってない証拠。
520:デフォルトの名無しさん
08/01/28 20:51:52
ポインタのポインタかよ
521:デフォルトの名無しさん
08/01/28 20:53:43
&*p ← キモチワルイ
522:デフォルトの名無しさん
08/01/28 21:06:45
俺もやってみたが何度やってもByRefが少し速いな。
Range型の引数でByValが速いケースってどういうケースだ?
523:デフォルトの名無しさん
08/01/28 21:27:27
測定誤差
524:デフォルトの名無しさん
08/01/28 21:33:15
うちではRangeの場合、ByRefの方がByValの2倍早かった@Excel 2007
525:デフォルトの名無しさん
08/01/28 22:28:34
試してみたけど全然違った(Excel 2003)
もちろん、Byrefの方がかなり速い
526:デフォルトの名無しさん
08/01/28 22:38:42
エロい方timeGetTimeで測定オナがいしますorz
527:デフォルトの名無しさん
08/01/28 22:41:48
軽くぐぐったら、ocamlには「参照の参照」という概念があるらしい。
528:デフォルトの名無しさん
08/01/28 22:53:34
>>526
timeGetTimeで計ったが参照私が速かった。
言っとくがtimeGetTimeだって1/1000秒の精度はないからな。
529:デフォルトの名無しさん
08/01/28 22:56:30
渡すのは参照の方が早い。実質ポインタ(4byte)だから。
ただその分使用時に一段間接参照のコストがかかるだけ。
530:デフォルトの名無しさん
08/01/28 22:57:51
えええ?
531:デフォルトの名無しさん
08/01/28 23:06:12
そう言えばExcel総合相談所だったか、それともここだったか忘れたが、Worksheet型の引数をByValにしろなんて
意味不明なこと言ってたやつが前にいたな。彼は勘違いしてるんだろうね。
532:デフォルトの名無しさん
08/01/28 23:06:27
基本的にオブジェクト型は参照渡しでいいんです
JAVAと一緒
533:デフォルトの名無しさん
08/01/28 23:07:39
なんか思いっきり勘違いしてる人がいない?
534:デフォルトの名無しさん
08/01/28 23:08:44
>>533
ちゃんとポイントして指摘しろ
535:デフォルトの名無しさん
08/01/28 23:10:19
いや彼にはそのままでいて欲しいからやめとく
536:デフォルトの名無しさん
08/01/28 23:25:40
なら最初から黙っとけよ
537:デフォルトの名無しさん
08/01/28 23:28:20
センセー、何で一段間接参照が入るのに速くなるんでつか?
538:デフォルトの名無しさん
08/01/28 23:32:10
ここVBAのスレだよなぁ?
539:デフォルトの名無しさん
08/01/28 23:37:01
ByValでRangeが渡されると、内部で「Set 仮引数 = 実引数(か、それと同等の処理)」
されてるんじゃないの?
だから、使用時に間接参照のコストなんかかからないんじゃ?
540:デフォルトの名無しさん
08/01/28 23:45:18
>>539
試せばわかる
541:デフォルトの名無しさん
08/01/28 23:47:58
ところで514とか516とか529は試したんだろうか?
542:デフォルトの名無しさん
08/01/28 23:54:37
ん、俺516だけど、今回は計測してないよ。
俺のは、多少遅くとも516のポリシーが良いという主張。
VB.NETも、デフォルトByValになったことだし。
543:デフォルトの名無しさん
08/01/28 23:59:10
>>542
そっか遅いのは認めるわけね。
ByRefが遅いと書いた514はどうだろう?
544:デフォルトの名無しさん
08/01/29 00:00:11
ここまで実計測データ無し。
Excelってベンチマークデータの公表禁止だったっけ?
545:デフォルトの名無しさん
08/01/29 00:05:23
>>544
別に禁止じゃねーだろ?
ただみんな自分で計測して分かってると思うけどな
計測してないやつが思い込みでおかしなこと言ってるだけ
546:デフォルトの名無しさん
08/01/29 00:08:17
>>518でFAなのに、いつまでやるつもりなんだろう・・・
547:デフォルトの名無しさん
08/01/29 00:10:57
>>546
だよな。それ以前に>>511で終わってるわな
548:デフォルトの名無しさん
08/01/29 01:56:18
VARIANTをC++から見ての想像。
オブジェクトをByValで渡すと、539の言う通り。オブジェクトへの参照(ポインタ)が渡される。
ByRefだとオブジェクトの変数への参照(ポインタ)が渡される。
いずれにせよ、渡されるのはポインタ値の4バイトだが、
ByValだと参照カウントの処理が要る分、コストがかかるように見える。
一方、ByRefでは2重に間接参照をしなければならないコストがあるはずなので、
測定条件によってどっちが速いかは変わってくるはず。
549:デフォルトの名無しさん
08/01/29 02:14:31
>>548
で、どんな時に変わるのよ? 変わる”かもしれん”から一概には言えないってか?
550:デフォルトの名無しさん
08/01/29 08:23:45
なんや、盛り上がってたんですねぇ。
乗り遅れたけど、実測データ書いとくね。
>>529が考えにより、ByValが有利になるように5回、引数のcにアクセスしてのr計測だからな。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo()
Dim t(2) As Long, i&, j&
Dim rng As Range
Dim c As Range
Set rng = Range("A:C")
t(0) = timeGetTime
For i = 1 To rng.Count
Set c = rng(i)
j = TEST1(c)
Next
t(1) = timeGetTime
For i = 1 To rng.Count
Set c = rng(i)
j = TEST2(c)
Next
t(2) = timeGetTime
Debug.Print "TEST1", t(1) - t(0); "ミリ秒"
Debug.Print "TEST2", t(2) - t(1); "ミリ秒"
End Sub
551:デフォルトの名無しさん
08/01/29 08:24:50
一般的に、ByRefの間接参照はメモリ読み込み1回が余計に掛かる。
しかし、ByValの内部コピーはメモリ読み書きがそれぞれサイズ(/4)回余計に掛かることになる。
従って、どちらが早いかは自明。
552:デフォルトの名無しさん
08/01/29 08:25:03
上の続き
Private Function TEST1(c As Range) As Long
Dim i&, j&
For i = 1 To 5
j = c.Row
Next
TEST1 = j
End Function
Private Function TEST2(ByVal c As Range) As Long
Dim i&, j&
For i = 1 To 5
j = c.Row
Next
TEST2 = j
End Function
実測値
TEST1 2448 ミリ秒
TEST2 2528 ミリ秒
5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。
だから>>529の言うことがまったくウソということではないが、通常このように何度もアクセスすることはないから参照渡しで問題なし。
ましてや1回のアクセスに値渡しは無駄もいいとこ。1回なら割合としては上の計測よりもっと差がつく。
553:デフォルトの名無しさん
08/01/29 08:27:03
モタモタしてるうちに>>551が間に入ったな。
554:デフォルトの名無しさん
08/01/29 10:10:38
Mougからきました。
勉強になりました。
555:デフォルトの名無しさん
08/01/29 10:51:23
URLリンク(www2.moug.net)
私もここからきますた。
ビヒネスソフト板以外にExcelのスレがあるとは知らんかった。
556:デフォルトの名無しさん
08/01/29 11:41:14
どうみても>>514はあの人だよなぁ。
他のオタクの人たちも既にいると見たがどうよ。
557:デフォルトの名無しさん
08/01/29 12:42:38
あまり詮索しないように
どうやら思い違いには気がついたらしいからよかったじゃないか
558:デフォルトの名無しさん
08/01/29 12:58:04
なんか気持ち悪い流れとコードだったので、自分で試してみた。(Excel 2000)
*ByRefとByValの違い
それぞれ1000万回呼び出すのを5回繰り返した場合の平均:
ByRef: 1654.8ms (A)
ByVal: 3558.2ms (B)
*「一段の間接参照」があるかどうか
呼び出した関数内で、次のコードを実行する。
dim s as string
s = arg.address (C)
時間がかかるので、100万回の呼び出しに変更し、それを5回繰り返した場合の平均:
ByRef: 4488ms
ByVal: 4660ms
100万回分の関数呼び出しのコスト(A,Bをそれぞれ10で割ったもの)を引くと、
(C)のコストが算出される。
ByRef: 4488-165.48 = 4322.52ms (D)
ByVal: 4660-355.82 = 4304.18ms (E)
結論:
・ByRefの方がByValの2倍以上速い
・「一段の間接参照」なるものの存在は確認できない(D,Eより)
559:550
08/01/29 13:07:28
気持ち悪いコードって俺の?
だったらすまんね。
560:558
08/01/29 13:11:53
オブジェクトをByValとByRefで渡したときの違いは何か?
プロパティNameを持った空のクラスClass1を作成し、次のコードを実行してみる。
[結果]
Initialized
abc
def
[考察]
ByValでもオブジェクトのコピーが発生するわけではない。
(barから戻ったときにbarで設定したNameが表示されているので)
--Class1
Public Name as String
Private Sub Class_Initialize()
Debug.Print "Initialized"
Name = "abc"
End Sub
--Module1
Sub foo()
Dim o As Class1
Set o = New Class1
bar o
Debug.Print o.Name
End Sub
Sub bar(ByVal o As Class1)
Debug.Print o.Name
Set o = Nothing
End Sub
561:558
08/01/29 13:15:54
続き。
ByValをByRefに変えて実行してみる。
[結果]
Initialized
abc
(ここで実行時エラーが発生する)
[考察]
実行時エラーが発生した行は、barから戻ってo.Nameを参照する行。
このことは、bar内でオブジェクトが破棄された、すなわちByRefは参照カウントを増やしていない
ことを意味する。
>>560の結果とあわせると、結論は、
オブジェクトをByRefで渡すと、それ自身が渡され、参照カウントも増えない。
オブジェクトをByValで渡すと、オブジェクトがコピーされるのではなく、参照カウントが増えるだけ。
562:デフォルトの名無しさん
08/01/29 13:16:06
>ByValでもオブジェクトのコピーが発生するわけではない。
これはみんな常識として知ってるだろうね。
もちろん考察には感謝する。
563:558
08/01/29 13:19:10
>>562のコードの訂正
Sub bar(ByVal o As Class1)
Debug.Print o.Name
o.Name = "def"
Set o = Nothing
End Sub
564:558
08/01/29 13:26:55
さて、それでは実際にオブジェクトのコピーを関数に渡したいときにはどうすればいいのだろう?
とふと思った。
Class1に次の関数を実装すれば良い。
が、VBAの機能だけで実現する方法があるかもしれない・・・。
Public Function Clone() As Class1
Set Clone = New Class1
Clone.Name = Me.Name
End Function
Sub foo()
Dim o As Class1
Set o = New Class1
bar o.Clone
Debug.Print o.Name
End Sub
Sub bar(ByRef o As Class1)
Debug.Print o.Name
o.Name = "def"
Set o = Nothing
End Sub
[一連の書き込み終了]
565:558
08/01/29 13:30:33
蛇足。
オブジェクトをByValで渡す場合は、前述のようにリファレンスカウントが増えるだけであり、
仮引数のconst性(不変性)を保障するものではまったくない。
その意味で、>>516のポリシーは間違っている。
566:デフォルトの名無しさん
08/01/29 13:42:59
しかし試しもしないで遅いとか気持ち悪いとか書くやつも相当だよな。
速度の計測なんてすぐできることだろうに。
567:デフォルトの名無しさん
08/01/29 13:49:29
>>565
組み込みオブジェクト(というのか?)だと、ByRefで渡したときは自作クラスのインスタンスとは
ちょっと違う挙動をする。
Sub foo()
Dim r As Range
Set r = Range("A1")
bar r
Debug.Print r.Address
End Sub
Sub bar(ByRef r As Range)
Set r = Range("A2")
End Sub
ByValだと$A$1と表示され、ByRefだと$A$2と表示される。
つまり、ByValは「参照のコピー」が渡ってると言える。(ここ、怪しい表現だが)
そういう意味では>>516は正しい。
あーややこしい。
568:デフォルトの名無しさん
08/01/29 13:51:25
いいかげんに許してやりなよ。
勘違いは誰でもあるし、反省してると思うよ。
569:デフォルトの名無しさん
08/01/29 13:53:00
あー、それが「参照の参照」という奴なのか・・・
570:デフォルトの名無しさん
08/01/29 14:00:29
>>555のリンク先ちらっと見たけど、とてもじゃないが読む気になれん
571:デフォルトの名無しさん
08/01/29 14:06:08
禿げ胴
572:デフォルトの名無しさん
08/01/29 14:18:49
なんだか混乱してきた。
ただ、byrefの方がbyvalより速いというのが事実だということは確かだよな。
573:デフォルトの名無しさん
08/01/29 14:23:25
誰かガンダムで表現してくれ
574:デフォルトの名無しさん
08/01/29 14:49:38
オブジェクト型はアドレス渡されるだけで
基本はLong型と同じ
byvalでも渡されるのが参照情報だからbyrefみたいに
感じちゃうってこと
575:デフォルトの名無しさん
08/01/29 15:02:19
>>567
それbarの中で新しいRangeオブジェクトを作り出してるから、根本的に565が書いたコードと違う
576:デフォルトの名無しさん
08/01/29 15:07:53
>>568
反省してるかねぇ。
すっとぼけてるけど、なんとかByValが遅いのは認めたらしい。
ただお行儀がどうのこうのとまだ言ってるよ。
別に参照渡しは行儀悪くねーだろ?
577:デフォルトの名無しさん
08/01/29 16:25:15
>>576
そもそも、VBAのデフォルトがbyrefなんだから、神経質ではない普通の人が
function foo(r as range)
と書くと、それはByRefになる。
これがお行儀が悪いということは、
function foo(byval r as range)
と書くのが「お行儀が良い」ということになる。
こんな書き方がデフォルトの奴は診たこと無いぞ。
578:デフォルトの名無しさん
08/01/29 16:54:08
右上の×(閉じるボタン)を無効にできますか?
579:デフォルトの名無しさん
08/01/29 17:09:17
ところで、516のいう「自分で定義したサイズが大きな型」というのが
Typeで定義した型のことなら、それに関しては同意と言おうと思ったら、
そもそもTypeのユーザ定義型は、値渡しできなかった。
580:550
08/01/29 17:26:39
>5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。
仕事から帰って再度試したら、もっと回しても逆転まはしてなかった。スマン
測定誤差だったみたいだな。
誰かが書いてたと思うが、結局ByValが速くなるケースってなさそうだな。
581:デフォルトの名無しさん
08/01/29 17:43:20
ChangeイベントやSelectio_ChangeイベントがByVal Target As Rangeとなってるのは何故?
エロイ人教えて
582:デフォルトの名無しさん
08/01/29 17:57:41
差を比べるならこうする
わかるのは差は大きいが全体でみると微々たる差ということ
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo()
Dim t(2) As Long, i&, j&
Dim rng As Range
Dim c As Range
Set rng = Range("A:Q")
t(0) = timeGetTime
For i = 1 To rng.Count
TEST1 c
Next
t(1) = timeGetTime
For i = 1 To rng.Count
TEST2 c
Next
t(2) = timeGetTime
Debug.Print "TEST1", t(1) - t(0); "ミリ秒"
Debug.Print "TEST2", t(2) - t(1); "ミリ秒"
End Sub
Private Sub TEST1(ByRef c As Range)
End Sub
Private Sub TEST2(ByVal c As Range)
End Sub
583:510
08/01/29 18:00:36
みなさん、大変参考になりました。
どうやら参照渡しで問題ないということがわかり一安心です。
ありがとうございました。
584:550
08/01/29 18:15:46
>>582
俺はcへのアクセス速度も調べたかったんだよ。
>>529が気になったものでね。
>>583
よかったな、まぁがんがれ
585:デフォルトの名無しさん
08/01/29 19:40:38
この流れを見て「Byrefなら速いんだ!」となんでもかんでもByrefの迷惑コーダーが量産されそうな
586:デフォルトの名無しさん
08/01/29 19:41:25
デフォルトbyrefなんでそ?
587:デフォルトの名無しさん
08/01/29 19:46:43
>>585
デフォルトがそうだし、仮に全部ByRef にしたトコで悪影響があるんだろうか?
要するに、関数にオブジェクト変数を渡せば、ByValにしたとこで内容の保護はできんわけだし。
588:デフォルトの名無しさん
08/01/29 20:56:04
>>585
それは言えるかも知らんね。ByValが速いケースもあるんだけどな。
オブジェクト型はないかも知らんが、他のケースでは確実にある。
589:デフォルトの名無しさん
08/01/29 21:32:15
>>588
だから、そのケースを示せっての。議論のネタにもならんわ。 自分がそう信じたいだけか?
590:デフォルトの名無しさん
08/01/29 21:37:50
>>589
おめー死ねよ。
自分で探すことも出来んのか?
591:デフォルトの名無しさん
08/01/29 21:54:54
おまえは間違ってる(でも正解を示さない)
↑ググってみて一番上ね
592:デフォルト知らず
08/01/29 21:59:20
折れ、今まで、全てにおいてByRefにせず、ByValできている。反省w
戻り値を親に返す必要がないから、ByValを当然に使うと考えていた。
戻り値を親に戻す必要があればByRefと、ただ単にプログラムテクニックぐらい。
で、スピードは全く気にしていなかった。
ベンチマークでなく、実用・実践のレベルでのものでも、書き換えた方が早いのだろうか? ex 与件を渡すinteger型変数5つぐらい
593:デフォルトの名無しさん
08/01/29 22:14:57
いいから>>589は死ね。
おれはここで散々>>510のケースはByRefが速いって書いてきたからな。
勘違いするなよ。
594:デフォルトの名無しさん
08/01/29 23:53:02
すみません
Cells(hoge, fuga).Value
で値を取り出したときに
元のセルが3だったとすると
値がそのまま3である場合と
3.0になっている場合があるようなんです
常に3であるように取り出すにはどうするのがよいでしょうか?
595:デフォルトの名無しさん
08/01/30 03:58:58
>>593
お前が死ね。
二度と来るな。
迷惑だ。
596:デフォルトの名無しさん
08/01/30 05:05:50
>>555
モーグは、大村なんとかが嫌いだったので見てなかったんだが、久しぶりに見に行ったら
井川はるきという気持ち悪い奴がのさばってた。
ぐぐったら、こいつ何冊も本出してるな。
掲示板で初心者相手に回答もしてるみたいだし、ほんときもちわりー
597:デフォルトの名無しさん
08/01/30 07:37:28
オラもモーグから来ますた。
ByRefとByValの話はもう終わり?
何かあるのかと思ったら、既出ネタの応酬とグダグダの展開に正直がっかりです。
598:デフォルトの名無しさん
08/01/30 09:35:53
もともと既出ネタなのに、何を期待してたんだ?
599:デフォルトの名無しさん
08/01/30 11:02:26
>>596
お前よりは役にたってるよ。
今回の引数の渡し方については、嘘をどうどうと書いたので叩かれてもしょうがないけどな。
600:デフォルトの名無しさん
08/01/30 11:13:05
しかし彼の本にオブジェクト型はByValで渡すべしなんて書かれてたりしたら、本を買った人がかわいそうだな。
601:デフォルトの名無しさん
08/01/30 11:19:17
>>594
そんなのありえないだろ?
元のセルが3.0という文字列なら別だが、もともと数値の3なら3だ。
どこかのセルにその値を代入すれば、表示形式によっては3だったり3.0だったりすることはあるがね。
602:デフォルトの名無しさん
08/01/30 12:31:31
>>599
役にたってるかなんかどうでもいい。
気持ち悪いかどうかって話だ。
603:デフォルトの名無しさん
08/01/30 12:49:20
確かにモーグは、今一番キモいコミュニティだな
604:デフォルトの名無しさん
08/01/30 13:05:20
漏れが一番Mougでウザイのは、あのしょっちゅうハンドル変えてるやつだな。
EFCを追放された名無しだろうけど。
605:デフォルトの名無しさん
08/01/30 13:38:13
>>514
参照の参照が渡されるから気持ち悪いというのを、もっと説明してください。
606:デフォルトの名無しさん
08/01/30 14:01:26
>>605
Mougが下がってるから、あそこで聞けば?
もう>>514はここ見てないかもよ。
607:デフォルトの名無しさん
08/01/30 14:48:27
「下がってる」の意味が良くわからないのですが、Mougは巡回対象ではないので、
ここで回答がなければあきらめます。
608:デフォルトの名無しさん
08/01/30 15:48:05
もともと組み込み屋なのに転職したら最初にVBAやる羽目になってます。
VBはある程度使ってましたが忘れかけ。
質問は
ユーザ定義クラスのインスタンス(の参照?)を渡して関数の先で値を入れてもらいたいのですが、
「型が一致しません」となります。何が原因でしょうか?
【Sheet1のpublicプロシージャ】
Public Sub GetData(idx As Long, ByRef item As clsUserA)
item.Id = Me.Cells(idx + 1, 1)
item.Name = Me.Cells(idx + 1, 2)
item.Remark = Me.Cells(idx + 1, 3)
item.Visible = Me.Cells(idx + 1, 4)
End Sub
【それを呼び出すModule1のプロシージャ】
Sub Test()
Dim tmpClass As clsUserA
Dim i As Long
Set tmpClass = new clsUserA
For i = 0 to 10
Call sheetClassList.GetData(i, tmpClass) '★ここでエラー発生
Next
End Sub
よろしくお願いします・・・。
609:608
08/01/30 15:52:10
簡単な名前にしようと思って書き換え忘れorz
Call Sheet1.GetData(i, tmpClass) '★ここでエラー発生
610:デフォルトの名無しさん
08/01/30 16:36:51
>>608
clsUserAのプロパティでInstancingをPublicNotCreatebleに設定しろ
611:デフォルトの名無しさん
08/01/30 16:56:42
>>610
それは違うエラーが出たので昨日の時点で直しました。
クラスをやめて構造体にしてみたら
パブリックオブジェクトモジュールで定義されてないと云々・・・
何この中途半端な言語・・・。
612:デフォルトの名無しさん
08/01/30 17:35:20
本当に解決してほしいのなら、エラーが発生する、検証可能な最低限のコードを「全て」書け
613:デフォルトの名無しさん
08/01/30 17:54:48
>>608
ところで、Sheet1クラスに定義したGetData( ) を
Worksheet型で宣言したオブジェクトから呼ぼうとしてるのだとしたら大笑いなんだが、
そこは大丈夫? (要するに sheetClassList の変数の型が分からないんだが)
614:608
08/01/30 17:55:22
そのものをうpしてみた。
URLリンク(up01.ayame.jp)
PASSは prog
開いたときの真ん前にあるCommand1を押すと問題のポイントでエラーになります。
成功すると正面の表が変化するはず。
615:608
08/01/30 17:57:44
>>613
シートにプロシージャを定義してあって、
標準モジュールから呼んでます。
もしかして大笑いコース??
616:608
08/01/30 18:02:44
さっき配置変更して別のシートから呼んでました。
紛らわしくてすみません。
どっちにしても動きは同じですが。
617:デフォルトの名無しさん
08/01/30 19:12:07
>>614
再現手順を書け、アホ
とりあえず
Public Sub GetData(idx As Long, item As clsGantClass)
にしたら、コンパイルエラー(呼び出せない)のは無くなった
618:デフォルトの名無しさん
08/01/30 19:13:35
>>608
ちょ、お前な。 ステップ実行で確認するくらいしろよ!
自分の意図してる場所のセルのデータが、ちゃんと取れてるかどうかと、
代入しようとしている構造体のメンバの変数型が合ってるかどうか。話はそれからだ。
ソース見る限りでは、Variantじゃなくて、クラスを指定しても動くと思うよ。
⇒ Public Sub GetData(idx As Long, item As clsGantClass)
619:617
08/01/30 19:15:01
すまん、再現手順は書いてあったな。
ただ、ボタンをクリックしてもエラーは発生しないぞ?
620:デフォルトの名無しさん
08/01/30 19:16:21
>>610が原因だったが、あれこれやってるうちに、何がなんだかわからなくなったと見た。
621:608
08/01/30 19:35:28
エラー出ないですか・・・。
sheetClassListはどこか書き換えたんでしょうか?
いまだ動きません。
ほかのマシンで動かしてみようかなぁ
622:デフォルトの名無しさん
08/01/30 19:42:38
Me.Cells(idx + 1, 1)がLongじゃない。
以上。
623:618
08/01/30 19:44:43
>>621
え? ちょっと待て。何が分からないの? うpしてくれた .xls でいいんだよな?
直さなきゃいけないトコ、普通に分かるだろ。
あと、気になるのは、1度動かすと、sheetClassList.Count の値がぶっ飛ぶ。(ゼロになる)
624:608
08/01/30 20:04:14
わかりました○| ̄|_
CellはRaw:2から読まないとだめでしたね・・・(0+1=1 "id"読んでました)
GetDataの内部の行ではなく、呼び出しの行がエラーになったために、その部分ばかりこだわってました。
ありがとうございました。精進します。
625:618
08/01/30 20:18:34
>>624
精進してください。 ちなみに、さっきザッと眺めた限りでは、あと変数型さえ直せば動くと思うよ。
626:デフォルトの名無しさん
08/01/30 20:21:01
おまいら釣られすぎ。
流れ変えようと>>514が質問を始めたな。
何が組み込み屋だよwww