Excel VBA質問スレ Part5at TECH
Excel VBA質問スレ Part5 - 暇つぶし2ch446: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

627:デフォルトの名無しさん
08/01/30 20:24:29
それならそれで乗ってやりゃ済む話だろ。 どんだけ粘着なんだよ。キモイやつだな。


628:デフォルトの名無しさん
08/01/30 20:37:18
>>626
流れをぶった切って申し訳ないが無関係なんで・・・。
組み込み屋馬鹿にスンナヽ(`Д´)ノ

629:デフォルトの名無しさん
08/01/30 21:51:38
それよりzzって相当生意気な香具師だな


630:デフォルトの名無しさん
08/01/30 22:44:34
質問です。
配列を一気にboolean型のtrueで初期化する方法はありますか?
Dim hairetu As booleanです

631:デフォルトの名無しさん
08/01/30 23:06:31
OSはWindows XP、Excelは2002です。
エクセルに関しては、授業で習った程度の事しか出来ません。

エクセルのVBAでゲーム作成の課題が出て、マインスイーパを作ってみようと思ったんですが。
全てのボタンをトグルボタンで作ろうとすると、凄く重くなります。
更に一個一個のボタンにコードをいちいち打たなければならないので、
もし出来たとしてもやはり使い物にならなくなると思います。
コードをすっきりさせるやり方で、何か良い方法はありませんか?
お願いします。

632:デフォルトの名無しさん
08/01/30 23:45:53
>>630
APIでメモリ操作
>>631
セルをボタンにみたてたら?

633:デフォルトの名無しさん
08/01/31 00:11:47
632さん
ネットで調べたのがよくわかりませんでした。
どーいうことなのですか?


634:デフォルトの名無しさん
08/01/31 09:15:10
>>632
それも最初考えてみたんですが…。
マインスイーパでいう、ボタンをクリックすると文字が表示されるという動作と、
ボタンに爆弾の印を付けるという動作をさせるやり方が見つからなくて…。
セルの中の値を非表示にして、クリックなどの動作で其れを表示させるというやり方が
可能なのでしょうか?

635:デフォルトの名無しさん
08/01/31 09:50:20
>>634
workbookのsheetchangeでいちいち全セルのvalueを見回るようにするとか
どっちにしろ重くなるけど

636:デフォルトの名無しさん
08/01/31 10:03:14
コントロール配列とかでイベントプロシージャ共有じゃだめなん?
サブクラス化して変数持たせないと呼び出し元識別できないっけ?

637:デフォルトの名無しさん
08/01/31 14:24:13
>>635
>>636
コントロール配列が出来るなら…何とか出来るかもしれません。
どちらも自分には難しそうですが、またちょっと調べて作ってきます。
すいません、有難う御座います。

638:デフォルトの名無しさん
08/01/31 21:27:29
ワークシートにファイルからオブジェクトを挿入し
同時に同じファイルにハイパーリンクを設定するマクロを作っています。

ひとまずマクロの記録をして、それを元に作成しようと考えたのですが、
記録したものを実行すると2行目、3行目でエラーが出てしまいます。
(改変したものでもエラーが出ます)

2行目はオブジェクトを挿入すると"=EMBED("○○","")"という数式?が追加されるので
それを削除する工程です。

明日までには処理完了させねばならないのですが、何が問題なのか御教示下さい。

Sub Macro()

ActiveSheet.OLEObjects.Add(Filename:="C:\test.pdf", Link:=False, DisplayAsIcon:=False).Select
Selection.Formula = ""
ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="C:\test.pdf"

End Sub


639:デフォルトの名無しさん
08/02/01 11:16:45
複数あるフォームのひとつを変数扱いで表示することは可能でしょうか。
下のサンプルのようなことをやりたいのですが
「オブジェクトはこのメソッドをサポートしてません」と出てしまいしまいます。
(UserForm1は勿論つくってあります)
myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。

Sub sump()
Dim myForm As UserForm
Set myForm = New UserForm1
myForm.Show
End Sub


640:デフォルトの名無しさん
08/02/01 11:48:31
>>639
UserForm と UserForm1 はベツモノのクラスだよ。Control と Textbox みたいな親子関係。
変数の型を UserForm1 にしてやればおk。


641:デフォルトの名無しさん
08/02/01 12:07:20
>>640 できました
UserForm1型があるなんて知りませんでした。
親(userform)に子(userform1)を代入、みたいに考えてました・・
ありがとうございます。

642:デフォルトの名無しさん
08/02/01 12:26:35
>>641
フォーム型のクラスを継承するイメージかな。
当然、フォームの(オブジェクト名)を変更すると、クラス名(変数型)も変わるよ。

一旦、オブジェクトを作成してから、userform型に userform1を代入するのは間違いじゃない。
userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。
Control と Textbox、Label、Combobox・・・ の関係と似たようなもんだよね。


643:デフォルトの名無しさん
08/02/01 12:51:24
>>642
639=641です
userform1型を使うのはできましたが、これだと
myform変数にuserform2を代入できないことがわかりました。(型が違うため)
このような場合どうしたらよいでしょうか。
>userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。
このやり方を知りたいのですが。(繰り返しですみません)

644:デフォルトの名無しさん
08/02/01 13:00:34
643です
たびたびすみません、object型を使ったらできました!
これで合ってるでしょうか。

645:デフォルトの名無しさん
08/02/01 14:25:37
>>644
↓こういう作りになってれば、少なくともエラーにはならないと思うんだけど・・・?(Excel2000)
 Dim a As UserForm1,  Dim b As UserForm2,  Dim c As UserForm
 Set a = New UserForm1
 Set b = New UserForm2
 Set c = a
 Set c = b
Object型は、なるべく使わないに越した事はないよ。ダメだという意味じゃないけど。


646:デフォルトの名無しさん
08/02/01 15:32:34
>>645
やってみましたが、c.Showでエラーになってしまいます。
(メソッドをサポートしません)

647:デフォルトの名無しさん
08/02/01 16:08:12
>>646
あー、そういう意味か。
申し訳ない、代入した後は、代入した先の変数型の持ってるメンバしか使えないよ。
Control 型に、ラベルやチェックボックスを入れても.Caption を設定できないのと同じこと。

>myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。
仰るとおり、Userform 型は、.Show() をサポートしていない。
異なるクラスで、共通のメソッドを呼びたいなら、Objectを使うしかないです。
あるいは、インターフェイス用のクラスを作って Implements する方法があるけど、
フォームに使うのは怖いので、特に事情が無い限りはやめた方がいいと思います。


648:デフォルトの名無しさん
08/02/01 16:43:27
>>647
了解です、今回はobjct変数でやることにします。
(やりたいことはメッセージ代わりのフォームを打ち分けたいだけなので)
何度もお手数をとらせ申し訳ありませんでした。


649:デフォルトの名無しさん
08/02/01 23:54:14
VBってオブジェクトと初期インスタンスの名称が同じだって所が半端な感じだよね

650:デフォルトの名無しさん
08/02/03 16:39:17
os:xp
excel:2003

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と自分で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
長文失礼しました!



651:デフォルトの名無しさん
08/02/03 18:19:53
突っ込みどころが多すぎ
全部に突っ込むの面倒なので正解書いておく

Sub Search()
 Dim A As Range
 Set A = Worksheets("Sheet1").Columns("L").Find("A")
 If Not A Is Nothing Then
  A.Offset(0, 1).Value = 0
 End If
End Sub

うわ、プロシージャ宣言やEnd Ifなど、間違いようのない部分以外、全部間違ってるじゃんw

652:デフォルトの名無しさん
08/02/03 18:35:44
notつけろの一言だけで済む話を教えたがりはこうやるわけだ

653:デフォルトの名無しさん
08/02/03 20:53:17
>>652
not付けました

実行結果は以下の通りです┐(´ー`)┌


---------------------------
Microsoft Visual Basic
---------------------------
コンパイル エラー:

オブジェクトが必要です。
---------------------------
OK ヘルプ
---------------------------


654:デフォルトの名無しさん
08/02/04 00:44:54
For n = 1 to 3 step 1
msgbox ("n

nを表示したい場合はmsgbox ("n
このあと何するのか分かる人いたら教えて下さい

655:デフォルトの名無しさん
08/02/04 00:57:25
msgbox ("n")


656:デフォルトの名無しさん
08/02/04 02:52:03
msgbox n


657:デフォルトの名無しさん
08/02/04 03:34:18
("n")バーカ

658:デフォルトの名無しさん
08/02/04 13:38:43
>>657
スレリンク(tech板:276番)

659:デフォルトの名無しさん
08/02/05 10:49:33
標準モジュールから、ユーザーフォームのテキストボックスに、
文字を表示させるにはどうすればいいでしょうか
以下では、ダメでした。

Sub test()
If Range("A1").Value = 1 Then TextBox1.Value = "ぼぼぼぼぼぼ"
End Sub

660:デフォルトの名無しさん
08/02/05 11:22:30
だから、どうダメだったか位書こうぜ。
つーか、エラーメッセージくらい自力で理解しろよ。

661:659
08/02/05 11:39:17
それが分かったら来ませんがな・・(´・ω・)

モジュール間で値渡し?しなければならないというのは
何となく分かるのですが、textbox1の「change」とか「enter」とか
どこに記述すればいいのかも分からず、現在に至っております。

662:デフォルトの名無しさん
08/02/05 11:49:56
>>661
エラーメッセージは出ませんでしたか?
恐らく、>653のようなダイアログが出たと思うのですが。
それを見ても何も理解できないようなら人間やめた方が宜しいかと。

663:659
08/02/05 11:55:57
>>662
textbox1 の変数が定義されていません と出ますね。
いちおう、フォームでtextbox1は作っているんですよ。

664:デフォルトの名無しさん
08/02/05 12:41:37
>>663
標準モジュールに記述してるんだったら、
Range("A1").Value にしろ TextBox1.Value にしろ、未定義扱いになると思うが?
(どこに属するオブジェクトか判断できない。明示的に指定されていない。)


665:デフォルトの名無しさん
08/02/05 12:48:53
シートから実行してしまうと、Rangeの方は未定義にならない罠。

666:664
08/02/05 12:55:45
>>665
うを、ホントだ。素で知らんかった。Activesheetを拾うっぽいね。 どうもありが㌧。


667:デフォルトの名無しさん
08/02/05 13:56:32
>>664
その定義方法がですね、textboxから、プロシージャをcallする場合は
分かるのですが、この逆になると、textboxのchangeなのかenterなのか
keydownなのかどこで定義したらいいのか・・・そもそも不可能なのか・・

668:デフォルトの名無しさん
08/02/05 14:10:50
>>667
イベントプロシージャを使うつもりなら、どのイベントで処理するか決めるだけじゃないの?
つか、どういう動きをさせたいの?


669:デフォルトの名無しさん
08/02/05 14:11:31
>>667
もしかして、フォームのプロシージャから標準モジュールをサブルーチンとして使いたいのか?
だとしたら、フォーム自身なりテキストボックス自身をそのtest()に渡してやればいい。
やりたいこととやっていることの説明くらいできないようじゃ、先が思いやられるけどね。

670:デフォルトの名無しさん
08/02/05 15:14:50
お付き合い頂き感謝します。
標準モジュールから、ユーザーフォームのテキストボックスを呼び出して、
なおかつそのテキストボックスに任意の文字列を表示させたいです。

テキストボックスのプロシージャから、標準モジュールを呼び出すのは
何とかできるのですが、逆がどうしても出来ません・・

671:デフォルトの名無しさん
08/02/05 15:18:49
面倒だから、全ての自作オブジェクトの一覧と全てのプロシージャの一覧出しちゃえよ。
状況説明できない馬鹿にいくら聞いても説明しても無駄だって判ったからさ。

672:デフォルトの名無しさん
08/02/05 15:21:08
>>670
いや、だから・・・
何かしらの処理が実現できない、っていう相談じゃなくて、コードの書き方が分からんってこと?

標準モジュールに記述したプロシージャは、どこかから呼ばれるまでは処理が走らない。
その前提の上で、特定のフォームの部品を扱いたいなら、○○(Userform名).Textbox1
例えば、デフォルトのオブジェクト名であれば、Userform1.Textbox1.Value でアクセスできる。
TextBox1.Value だけでは対象が分からんからエラーになる。 単にValue とだけ書くようなもん。


673:デフォルトの名無しさん
08/02/05 15:24:36
うぜーーーー

Sub foo()
  UserForm1.TextBox1.Text = "abc"
  UserForm1.Show
End Sub

674:672
08/02/05 15:29:26
>>670
あー、ごめん、よく考えたら 672の書き方じゃ絶対に分からんな。
まずはフォームの実体を取得しなきゃならんので、どこかから呼び出されるのを前提で、
”基本的には”標準モジュールのプロシージャに引数として処理対象のオブジェクトを渡すか、
フォームのインスタンスを作るトコから全て標準モジュールの処理で書かないといけない。


675:デフォルトの名無しさん
08/02/05 15:39:12
>>972-974
でけた^^
コードの書き方の問題なのかも分かりませんでした・・orz
ありがとうございました!

676:デフォルトの名無しさん
08/02/05 15:40:29
感謝まで明後日の方向向いているよ。どうしようもねぇな。

677:672
08/02/05 15:42:12
ワロタw


678:デフォルトの名無しさん
08/02/05 15:44:13
>>674
なんか勘違いしてない?
インスタンス化はアクセスされると自動的に行われるよ?

679:672
08/02/05 15:55:59
>>678
勘違い、つか、VBが特殊な使い方ができるだけで、
インスタンスを作ってから使うのが基本だと俺は思ってるから、自然とそういう書き方になった。
複数のインスタンスが持てないわけでもなし、何故突っ込まれるのかが分からんが。


680:672
08/02/05 16:00:40
>>678
あ、スマン、書き込んでから言いたい事が分かった・・・。確かに、勘違いしてるように見える。
申し訳ない。


681:デフォルトの名無しさん
08/02/05 16:04:15
少なくとも、VBA/VB6では、規定のインスタンス(暗黙のインスタンス化)を使うのが、
まぁデフォですので・・・。

682:デフォルトの名無しさん
08/02/05 16:16:38
Windows XP + Excel 2000SP3です。

MouseWheel Fixをアドインマネージャに起動時/ロードで設定すると、VBEを開こうとすると
「インストールの準備中」のダイアログが出て先に進みません。

ただ、なぜだかその状態で一度Excelを終了させてすぐに起動すると、そのダイアログが
終了してVBEが立ち上がるようになります。

「起動時/ロード」を設定せずに、Excel起動後にロードしようとしても、やはり最初の一回は
「インストールの準備中」から先に進みません。

何か、解決法はあるでしょうか?




683:デフォルトの名無しさん
08/02/05 16:40:58
自作のDLLをDeclareで参照して使うと、Excelを終了させないとDLLがアンロードされないみたいなんですが、
強制的にDLLをアンロードするにはどうすればいいですか?

684:デフォルトの名無しさん
08/02/05 16:57:04
>>683
日本語訳はヘンテコなんでこっちで。

PRB: Loading and Unloading DLLs in the Design Environment
URLリンク(support.microsoft.com)

685:≠683
08/02/05 17:17:18
つまり、Declare宣言を編集しようと試みると強制的にアンロードされるってことでいいのかな?

686:デフォルトの名無しさん
08/02/05 17:36:25
>>685
Declareの"r"を削除して行を離れると、強制コンパイルされてDLLがアンロードされるから、
その行に戻って"r"をタイプして元通りにしろってことね。

687:デフォルトの名無しさん
08/02/05 23:14:50
i = 3

Do While Cells(i, 1) = "東京"
If Range(i, 10) = 1 Then
Range("i" & Columns.Count).End(xlUp).Value = st4 & st5
st1 = Range(i, 8)
st2 = Range(i, 9)

With ws2.Range("A" & Rows.Count).End(xlUp)
.Offset(0.1) = st1
.Offset(0.2) = st2

End With

i = i + 1
Loop

恐れ入ります。
A列3行目から”東京”となっている間ずっと、
もしその行の10列目が”1”であるなら”1”の一つ右の行を確認、
空白だったらST4とST5の文字列を貼り付ける。空欄でなかったらさらに一つ右の行を確認・・・(ループ)
さらにST1、ST2の文字列を貼り付け・・・
というのをループさせたいのですが、

”1”の一つ右の行を確認、空白だったらST4とST5の文字列を貼り付ける。空欄でなかったらさらに一つ右の行を確認・・・(ループ)
の部分がよく分かりません。また、実行してみてもLOOPに対するDOが無いとのエラーになってしまいます。

おばかな質問で恐縮ですが、よろしくお願いします。



688:デフォルトの名無しさん
08/02/05 23:33:09
i=i+1の前に end ifがいる。

689:デフォルトの名無しさん
08/02/06 06:52:49
>>682
そんな現象なったことないが、原因分かんないならVectorとかで同種のソフト拾ってきて使えば?
もしくはExcelを再インストールして様子見るとか

690:デフォルトの名無しさん
08/02/06 09:48:27
>>682
他のアドイン機能はちゃんと動作するのか確認して、異常がないようなら
MouseWheel Fix を一旦登録解除(クラスライブラリ)してから、再登録してみたら?


691:682
08/02/06 10:50:25
>>689,690
コメントありがとうございます。

他のアドインは正しく動きました。また、MouseWheel Fixをregsvr32 /uして再登録してみたんですが
状況が改善しませんでした。

いろいろと検索していると、同種のアドインが見つかりましたので、それを試してみたらうまく
動作しているようなので、とりあえずはこちらを使うことにします。

AddAutoScroll for VB6/VBE6
URLリンク(homepage1.nifty.com)

692:デフォルトの名無しさん
08/02/06 11:30:49
OS vista
excel 2007

Dim i As Integer
Dim x(10), y(10) As Single
For i = 1 To 10
x(i) = i
y(i) = i
Next
Cells(1, 1).Value = Application.WorksheetFunction.LinEst(y, x)

linest関数を使いたいのですが、試しに上記のようなプログラムを作成したところ
肝心のlinest関数のところで「linestプロパティが取得できません」とエラーがでます
基礎的な間違いをしてる気がするのですが、どうかアドバイスをお願いします


693:デフォルトの名無しさん
08/02/06 11:53:18
  'テキストファイルを開きます。
  Workbooks.OpenText Filename:=strFileName, _
    Origin:=xlWindows, _
    StartRow:=2, _
    DataType:=xlDelimited, _
    TextQualifier:=xlNone, _
    ConsecutiveDelimiter:=False, _
    Tab:=False, Semicolon:=False, Space:=False, Other:=False, _
    Comma:=True, _
    FieldInfo:=Array( _
      Array(1, 2), Array(2, 1), Array(3, 2), Array(4, 2), Array(5, 2), _
      Array(6, 2), Array(7, 2), Array(8, 2), Array(9, 2), Array(10, 2), _
      Array(11, 2), Array(12, 2), Array(13, 2), Array(14, 1), Array(15, 1), _
      Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 2), Array(20, 2), _
      Array(21, 2), Array(22, 2), Array(23, 2), Array(24, 2), Array(25, 2), _
      Array(26, 1), Array(27, 2), Array(28, 2), Array(29, 2), Array(30, 2), _
      Array(31, 2), Array(32, 2), Array(33, 2), Array(34, 2), Array(35, 2), _
      Array(36, 2), Array(37, 2), Array(38, 2), Array(39, 2), Array(40, 2) _
    )


上記処理にてWinXP SP2 Office2003 SP3環境では問題なくシート表示するのですが、
WinXP SP2 OfficeXP (SP状態は不明です)の環境では文字化けして表示されます。
化けるフィールドとしては2バイト文字のところで、
テキストファイルとしては半角カナも全角漢字も混在のCSVで
改行コード、文字コードはCRLFのSjisです。

原因と対策がよくわからなくて困っております。
何かご存知でしたら教えていただければ、と思います。
よろしく頼みます。



694:デフォルトの名無しさん
08/02/06 12:28:21
>>692
xの配列を渡さずに ~.LinEst(y) と書いたら動くから、パラメータの与え方が違うのかな?
スマンが使った事が無いので、識者を待つか、ヘルプを見れ。
URLリンク(office.microsoft.com)


695:692
08/02/07 07:29:16
すみません。
ただの宣言ミスでした。

Dim x(10) as single, y(10) As Single
としたら動きました。
>>694
どうもありがとうございます。
聞く時はもっと気を付けてからにしようと思います。


696:デフォルトの名無しさん
08/02/07 12:10:10

激しくスレ違いかもしれませんが、質問です。

PCゲームを多重起動しようと試みたのですがダメでした。
大抵のゲームはWindowsのアカウントを2つ作成し、別々のアカウントで起動すれば問題ありません。

現在、Vistaを使っているのでXPではどうなるかはわかりませんが(XPは右クリックから別ユーザーで起動が可能)、
Vistaでその手法をとる場合、runasコマンドを使用することになります。
しかしこのコマンドで別々に起動しても、後から起動したほうが無効になってしまいました。

で、ここからがわけわかめなのですが、同一のデスクトップからの起動はダメでも、
Windowメニュー→ユーザー切り替えをし、別々に起動すればうまくいきました。

この違いはいったいなんなのでしょうか?
 

697:デフォルトの名無しさん
08/02/07 13:28:40
RMTでもやんのか?

どちらにしても激しくスレ違いだから帰れ。

698:デフォルトの名無しさん
08/02/07 13:43:46
激しくスレ違いまで読んだ

699:デフォルトの名無しさん
08/02/08 10:06:37
激しくまで読んだ

700:デフォルトの名無しさん
08/02/08 22:02:52
sageがないので読んでない

701:デフォルトの名無しさん
08/02/09 15:17:19
Base64でファイル添付してメールを送りたいのですが、その方法があれば教えてください
CDO.Messageを使ってQuotedPrintableでの送信はできています

702:デフォルトの名無しさん
08/02/09 15:29:15
本文に追加すればいいことじゃないの

703:デフォルトの名無しさん
08/02/09 15:36:00
某エクセルスレで、以前に聞いたが全く回答の反応なしだったので、
ここでも、あまり、適切な話題ではないかもしれないが教えてくれ。
2002 + XP VBAマクロ、ドロップダウンリスト入力セル、関数式埋め込みセルが
あり、各ブックの大きさは700K~2M程度の5つの同種類のブックを作ったのだが、
ブックによって、左下のステータスバーに(通常コマンドと表示されているところ)
が、セル移動で「再計算」が表示されるものと、「再計算」は表示されないものとの
2通りあるようになった。selection_changeイベント等求めている機能はいずれも
正常に動いている。

皆、コマンド、入力の表示のみで、再計算表示がされないようにしたいのだが、
どうしたらいいですか。


704:701
08/02/09 16:03:05
>>702
Excelでソケット通信も含めて自作しろといってるようにしか聞こえないが

705:デフォルトの名無しさん
08/02/09 16:32:41
某エクセルスレで、以前に聞いたが全く回答の反応なしだったので、
ここでも、あまり、適切な話題ではないかもしれないが教えてくれ。
2002 + XP VBAマクロ、ドロップダウンリスト入力セル、関数式埋め込みセルが
あり、各ブックの大きさは700K~2M程度の5つの同種類のブックを作ったのだが、
ブックによって、左下のステータスバーに(通常コマンドと表示されているところ)
が、セル移動で「再計算」が表示されるものと、「再計算」は表示されないものとの
2通りあるようになった。selection_changeイベント等求めている機能はいずれも
正常に動いている。

皆、コマンド、入力の表示のみで、再計算表示がされないようにしたいのだが、
どうしたらいいですか。


706:デフォルトの名無しさん
08/02/09 16:34:13
>>704
最近のメーラは添付ファイルがアイコンなんかで表示されたりして隠蔽されて
いるけど,昔は送りたいバイナリをテキストにエンコードして文字通りメール
本文の下に貼り付けてましたよ。
↓こんなイメージ

-------ここから------------------------
encoded by なんちゃらかんちゃら
risdgfniefngoenogfaenogengopenoanongoneogneoagnoengea
fbwhibfiwbfiwbfiwbfiwbfibwibfiwbfiwbfiwbifbiwfbiwbfiw



707:デフォルトの名無しさん
08/02/10 03:48:29
OS XP、Offce 2003
A1には半角英数字のみが入ってるとします。
このファイルには複数シートがあり、全シートにA1には違う文字列があります。
各A1の文字や文字数はシート毎にバラバラですが、半角英数字は変わりません。

質問としては、各シートのA1内に入っている半角大文字のみ
それぞれのシートB2に出力するのは可能?可能ならばヒントをお願いしたい
です。

708:デフォルトの名無しさん
08/02/10 08:19:57
>>707
・セルA1内の文字列を取得する
・大文字があるか検索する
・文字列を組み立てる
・セルB2に設定する
・それらを全てのシートについて行なう

709:デフォルトの名無しさん
08/02/10 15:33:57
リテラルの中に、"(ダブルクォテーション)を含めるには、
どう書けば良いのでしょうか?



710:デフォルトの名無しさん
08/02/10 15:50:51
””

711:デフォルトの名無しさん
08/02/10 16:07:26
すいません。

A1からA4まで文章があります。

A2の横のセル(B2)にA4をカットペースト(A1A2A3は何もしない)をしたいのです。

For X = 1 TO 100 で
A 4*X+2の横のセル(B 4*X+2)にA 4*X+4をカットペースト
4*X+3 : 4*X+5 行を削除
Next i

というのをやりたいのですが、、初心者で分かりません。
特にセルのところをどうすればいいのか分かりません。教えてください。
どなたかお願いします。

712:デフォルトの名無しさん
08/02/10 16:11:50
Cells(r, c).Value

713:デフォルトの名無しさん
08/02/10 16:23:57
>>704
補聴器買ったほうがいいと思うよw

714:デフォルトの名無しさん
08/02/10 16:36:38
音は出てないから補聴器買ったところで聞こえようが無い

715:デフォルトの名無しさん
08/02/10 16:38:40
>>713

>>704 には幻聴が聴こえるようだから精神科を薦めた方が良いのでは?

716:デフォルトの名無しさん
08/02/10 16:56:47
そんなにいぢめてやらんでも・・・

717:デフォルトの名無しさん
08/02/10 17:02:23
わかんねーから教習所に通ってんのに、お前らはなんにも教えてくれない自動車教習所の教官。
へたっぴな運転を見てからかってる。

718:デフォルトの名無しさん
08/02/10 18:29:04
>>717
ウェ~

719:デフォルトの名無しさん
08/02/10 18:47:18
違うな、教習場に行けばいいのにこんな場末の練習場に来ている阿呆を見に来ている暇人だな。

720:>711
08/02/10 20:01:51
やりたい事と合ってるかわ解らんが参考にしとくれ
行を削った後座標がズレるけど良いのか?

Sub TEST()
For I = 0 To 99
Cells(I + 4, 1).Cut Destination:=Cells(I + 2, 2)
Range(Rows(I + 3), Rows(I + 5)).Delete
Next I
End Sub

721:デフォルトの名無しさん
08/02/10 21:12:35
質問です。

例えば、Aの列にはデータを10~20個入れたとして、
B1にデータ一個を入れます。
このとき、Cの列にはC1=A1-B1、C2=A2-B1・・・というように、
AのデータとB1の差を代入したいと思うのですが、簡単なやり方がわかりません。
確かコピペですいすいいけたと思うのですが・・・
ご教授お願いします。
使ってるのはXPsp1のexcel2002です。

722:デフォルトの名無しさん
08/02/10 21:28:24
>>721
減算で。

Sub test001()
Range("A1").Resize(20).Copy Range("C1").Resize(20)
Range("B1").Copy
Range("C1").Resize(20).PasteSpecial Paste:=xlPasteAll, Operation:=xlSubtract, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub

723:デフォルトの名無しさん
08/02/10 21:29:34
For i=startRow To endRow
Cells(i,3).Value=Cells(i,1).Value-Cells(1,2).Value
Next

つかVBAの質問なの???

724:デフォルトの名無しさん
08/02/10 21:34:29
>>721
C1に=A1-$B$1
C1の右下つかんで下方向にびろ~んとする

725:デフォルトの名無しさん
08/02/10 21:54:21
>>722>>723
すいません、理解できませんwww
>>724
ありがとうございます~

726:デフォルトの名無しさん
08/02/10 22:09:59
>>720
ありがとうございます。。
というか自分、何やってんだorz

727:デフォルトの名無しさん
08/02/11 20:33:25
プログラミングは詳しくないのですが、どなかたご助力下さい。
(質問内容)
フォルダ内で「読取パスワードが設定されいてるEXCELファイルを検索する」

どなかた該当の命令文をおしえていただけないでしょうか。

728:デフォルトの名無しさん
08/02/12 03:00:10
DOS窓を表示させないまま、DOS窓のコマンド使って標準出力の内容が欲しい場合ってどうすればいいですか?
Execだとウィンドウ非表示にできないし、Runだと標準出力につなげないんですが

729:デフォルトの名無しさん
08/02/12 03:19:36
>>728
FAQ

730:デフォルトの名無しさん
08/02/12 03:55:12
ぐぐれ
コンソール プロセスを生成して標準ハンドルをリダイレクトする方法

731:デフォルトの名無しさん
08/02/12 04:04:03
KB173085

732:デフォルトの名無しさん
08/02/12 07:47:07
いまだにDOS窓とか使ってるやつおるんかねぇ

733:デフォルトの名無しさん
08/02/12 09:13:59
>>732
GUIがないソフトがあるんで使ってる。

734:デフォルトの名無しさん
08/02/12 12:20:00
DOS窓とコマンドプロンプトは別物

735:デフォルトの名無しさん
08/02/12 12:20:53
と言うか、WinXPにDOS窓って存在するの?

736:デフォルトの名無しさん
08/02/12 12:53:06
>>735
アレを、ほとんどの人はDOS窓と呼ぶのだ。

737:デフォルトの名無しさん
08/02/12 13:12:58
二つのテキストファイルABを読み取り比較した結果を表示するマクロを作りたい。
Aに行が挿入されてBになっている場合、Aにも挿入した分だけ空白行を入れて表示したいが、いい例はないものか。

738:デフォルトの名無しさん
08/02/12 13:21:08
つ[/usr/bin/diff]

739:デフォルトの名無しさん
08/02/12 13:25:56
Excel VBAスレでその回答はどうだろう

740:デフォルトの名無しさん
08/02/12 13:33:00
抽象的な質問には抽象的な回答を。

741:デフォルトの名無しさん
08/02/12 14:05:52
W9x Wme の DOS 窓は文字通り DOS 窓って言って良いんだけど
コマンドプロンプトは DOS とは互換性がないからなぁ

742:デフォルトの名無しさん
08/02/12 14:08:38
コマンドプロンプトってDOSのエミュレートじゃないの?
DOSプログラムは、コマンドプロンプトでは動かないの?

743:デフォルトの名無しさん
08/02/12 14:12:13
DOSプログラムも動くからDOS窓でいいじゃん

744:デフォルトの名無しさん
08/02/12 14:12:41
>>271
本尊乙

745:デフォルトの名無しさん
08/02/12 18:44:34
質問です。
以下のが「スタック領域が不足しています」で通りません。
多分再帰が問題なんだろうけど、よくわかりません。
VistaのExcel2007です
If文以降に問題があると思うんですけど…

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Ein As Integer
Dim Fin As Integer
Dim Year As Integer
Dim Month As Integer

Year = Range("C2").Value
Month = Range("E2").Value

Ein = Weekday(Year & Month & "1", 1)

Cells(5, 1 + Ein) = ("1")

If Month = 2 Then
Fin = 28
Else
Fin = 31
End If

Cells(10, 10).Value = Fin
End Sub

746:デフォルトの名無しさん
08/02/12 18:50:08
>>745
Application.EnableEvents = False
Cells(5, 1 + Ein) = ("1")

If Month = 2 Then
Fin = 28
Else
Fin = 31
End If

Cells(10, 10).Value = Fin
Application.EnableEvents = True


747:デフォルトの名無しさん
08/02/12 19:01:08
>>746
ありがとうございますm(_ _)m
おかげさまで解決しました

748:デフォルトの名無しさん
08/02/12 19:04:58
>>742
コマンドプロンプトは純粋なWin32プログラム。
仕様面でDOSの流れを大きく受け継いでいるけど。

コマンドプロンプトの中でDOSプログラムを動かすときには、
NTVDM (NT仮想DOSマシン)でDOS環境をこさえて、
その中でcommand.comを起動し、それから目的のプログラムを実行する。

それ以外だと直接NTVDMから始まるが後は同じ。

749:デフォルトの名無しさん
08/02/12 22:45:34
コマンドプロンプトとDOS窓の区別が付いてないやつはVBAとマクロの区別も付いていない

間違いない

750:デフォルトの名無しさん
08/02/12 23:45:26
>>727
無理せずテンポラリファイルにリダイレクトして読め

751:デフォルトの名無しさん
08/02/12 23:45:31
んなもん、どーでもいい。

752:デフォルトの名無しさん
08/02/13 10:24:27
>>738
それをEXCEL VBAでやりたい。
(UNIXでやれよ、というのは不可)

753:デフォルトの名無しさん
08/02/13 10:43:48
>>752
行が挿入されたものか、一部改変されたものかの判断って、どうやるつもり?
判別の難しさと、それに伴う処理速度考えたら現実的じゃないと思うが。
前後データまで絡める判別はVBでは実用的じゃないし、ロジックの問題なら他スレ行け。


754:デフォルトの名無しさん
08/02/13 11:22:17
>>752
私だったらピボットテーブル使う。
それぞれのテキストをA列に、B列にはどっちのテキストなのかわかる記号を入力しとく。後はわかるでしょ。

755:デフォルトの名無しさん
08/02/13 11:34:02
diffのソース読めばいいよ

756:デフォルトの名無しさん
08/02/13 12:21:30
アドバイス多謝。

>>753
>行が挿入されたものか、一部改変されたものかの判断って、どうやるつもり?

一部改変については、次の行を比較して、一致なら改変、そうじゃなければ挿入と考えるつもり。
(二行改変は考慮しない)

問題は、挿入か削除か。
そのセルを上方検索し、見つかれば削除、でなければ挿入って判断かな。

ロジックってこの板?

757:デフォルトの名無しさん
08/02/13 12:47:07
他人を巻き込んでダラダラやらずに、diffのソース読んだほうが早いって

758:デフォルトの名無しさん
08/02/13 13:14:21
shell c:\windows\windiff.exe

759:デフォルトの名無しさん
08/02/13 16:50:59
つfc.exe

760:デフォルトの名無しさん
08/02/13 16:52:35
"c:\program files\support tools\windiff.exe" /?

761:デフォルトの名無しさん
08/02/13 23:07:24
良回答認定>>760

だがスレ違い

762:デフォルトの名無しさん
08/02/14 09:57:51
>>758-760
神認定


と思って報告したら、
「入ってるPCと入ってないPCがある」と言われたorz

763:デフォルトの名無しさん
08/02/14 23:26:24
winmerge

764:デフォルトの名無しさん
08/02/15 23:36:29
cdiff.vbs

765:デフォルトの名無しさん
08/02/16 12:41:39
2つのExcelファイルをdiffするのをVBAでやりたいのですが?

766:デフォルトの名無しさん
08/02/16 12:47:32
やればぁ?

767:デフォルトの名無しさん
08/02/16 13:34:31
やってくださいよ

768:デフォルトの名無しさん
08/02/16 17:25:09
つc:\program files\support tools\bdiff.exe

769:デフォルトの名無しさん
08/02/16 18:52:16
エクセルの機能にある、「Webページとして保存」ではなく

1.htmlを記述してあるシートをコピー
2.メモ帳に貼り付け、test.txtとして保存。
3.2のtest.txtをtext.htmlに名前を変更。

というような動作をVBAで自動化できるでしょうか。
もし、似たようなことが可能であれば教えてください。

770:デフォルトの名無しさん
08/02/16 18:58:33
できるけどエクセルでやるようなこと?

771:デフォルトの名無しさん
08/02/16 19:05:58
メモ帳を自動化するのはむずかしい

772:デフォルトの名無しさん
08/02/16 19:12:24
セルの内容をそのままファイルに出力すればいいんじゃ?

773:デフォルトの名無しさん
08/02/16 19:16:09
>>769
シートの内容をプレーンテキストに出力して拡張子を.htmlにしたいなら
メモ帳なんて使うまでもないが、770も言ってるとおりExcelの仕事じゃない
>>2★3,4

>>771
vbsとかで自動化するのは難しいけど
VBAというかVB言語ではSendMessage使えるから簡単だよ

774:769
08/02/16 19:51:14
ありがとうございます。
具体的な目的を言うと、複数の条件でhtml記述を変化させている
シートがありまして、そのhtmlをブラウザでプレビューするのを
先ほどの手順でやっていたのですが、それを簡素ができないものか
と思っていたのです。
もう少し考えて見ます。


775:デフォルトの名無しさん
08/02/16 23:19:25
>>772じゃ駄目な理由をまず聞こうか。

776:デフォルトの名無しさん
08/02/17 00:02:38
簡単なSendMessageを使ってもらおうか

777:デフォルトの名無しさん
08/02/17 13:24:27
教えてください!
Excel2007のOfficeボタンを非表示にする方法ってあるのでしょうか?
マイクロソフトのライブラリを見てもまだ情報がなくて……。どなたかご存知の方ご教授いただけませんでしょうか。

778:デフォルトの名無しさん
08/02/17 15:37:44
Officeボタンとは何かというところから解説してください

779:デフォルトの名無しさん
08/02/17 15:39:09
OS:XP、Excel2000でワークシート関数を使用したいと思います。
引数にシート範囲ではなくVBAの配列を指定したいのですが
そのままでは出来ません。
引数に配列を指定する方法があれば、ご教授願います。

dim a(10) as long
dim b as long

b = WorksheetFunction.Max(a)

780:デフォルトの名無しさん
08/02/17 16:09:12
>>778
「Officeボタン」とはExcel2007から追加された、いままでで言う「ファイル」メニューのようなGUIになります。
新しく追加されたGUIのため、Officeボタンのオブジェクトライブラリを操作すれば非表示にすれば良いのか、xmlを編集すれば操作できるのかどうしても判らないんです。
ご存知でしたらご教授戴けると幸いです。


>>779
動的配列のサマリを計算するメソッドのようなものがあればそれを代用すれば良いのかもしれませんが、
自分には以下のような方法でいつも計算させてしまっています。

Sub subTEST()
Dim a(10) As Long
Dim b As Long

For inCnt = LBound(a) To UBound(a)
b = WorksheetFunction.Max(a(inCnt))
Next a
End Sub




781:デフォルトの名無しさん
08/02/17 19:13:16
>>780
ご回答ありがとう御座います。
ただ、そのコードだとa(10)の値がbに入るだけではないでしょうか?

782:デフォルトの名無しさん
08/02/17 20:41:33
>>780
なるほど
あいにく2003なので力にはなれません
でもApplicationクラスのどっかにCommandBarsみたいにあると思うから、
地道に探してみるしかないんじゃ

783:デフォルトの名無しさん
08/02/18 14:43:42
zzって何者?
ヴァッカじゃねーのwww
氏ねよwww

チラシの裏でスマソ

784:デフォルトの名無しさん
08/02/18 15:39:11
>>781
たまたま>780がmax()の仕様を知らなかっただけだろ。
どうしてもワークシート関数を使いたいなら配列を1要素ずつ処理すればいいと言う点では同意。
max()の場合なら、b = worksheetFunction.max(a(inCnt), b)とでもすれば使える。
# average()なんかはそうはいかないけど。

785:デフォルトの名無しさん
08/02/20 07:04:05
関数の引数にセル位置を「A1」の形式で入れたいとき、
行を変数にはできないんでしょうか?
たとえば変数xをSUM関数につかう場合、=SUM(A1:Ax)としてもエラーになりますよね・・

786:デフォルトの名無しさん
08/02/20 08:08:49
このすれ頭から読み直せ


787:デフォルトの名無しさん
08/02/20 11:53:43
HYPERLINK関数で質問です。
HYPERLINK関数では、特定の文字を含むリンクは張れないのでしょうか?

現在、HYPERLINK関数を用いたシートの目次を、
マクロで作成しております。
ですが、シート名に記号を含むと参照できないようです。
(@や#などほとんどの記号は駄目ですが、
 アンダーバーだけは大丈夫なようです・・・。)

しかし、マクロではなく、編集メニューの
[挿入]→[ハイパーリンク]から同じシートを指定した場合は、
参照できるようですorz
これら2つの操作は全く別物なのかもしれませんが・・・orz

---------------------------------------------
<参照できる例>
=HYPERLINK("#シート名!A1", "シート名")

<参照できない例>
=HYPERLINK("#@シート名!A1", "@シート名")

Excelのバージョン:2002(10.2614.3311)
---------------------------------------------

参照できない例のようなシート名で、
HYPERLINK関数で参照する方法はありますでしょうか?

何かわかる方がおられましたら、ご助言ください。
よろしくお願いします。

788:デフォルトの名無しさん
08/02/21 12:29:39
Officeボタンも知らないヤツが、質問スレで回答側に回ろうとするなよw

789:デフォルトの名無しさん
08/02/21 13:27:23
目先の問題の回答は出来なくても質問の仕方を教えるのはできるだろ

790:デフォルトの名無しさん
08/02/21 19:44:50
エクセルで計算した数値は少数桁何桁精度なのでしょうか?

791:デフォルトの名無しさん
08/02/21 19:59:12
3桁

792:デフォルトの名無しさん
08/02/21 20:11:40
>>790
IEEE 754倍精度はある。

793:デフォルトの名無しさん
08/02/21 23:07:20
Perlについての質問箱スレから誘導されて来ました。
Excel VBAからDOSコマンドを実行することはできますか?
具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って
表示するまでを1クリックで行いたいと思っています。
環境はWindowsXP Home Edition、Excel 2003 です。
よろしくお願いします。

794:デフォルトの名無しさん
08/02/21 23:51:57
>>793
>Excel VBAからDOSコマンドを実行することはできますか?
ちょいと命令忘れたができる。
VBAからPing送ったりbatを呼び出したりしたりもできるから間違いない。

>具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って
>表示するまでを1クリックで行いたいと思っています。
上の内容を具体的にしたつもりだろうが、上ができたとしてもこちらは関係ないだろ?
PerlからExcelにイベントでも起こさせられれば可能。

795:デフォルトの名無しさん
08/02/22 00:06:30
XPにDOSは載ってません

796:793
08/02/22 01:09:30
>>794
ありがとうございます。では情報があることを信じて
再びgoogleの海へと漕ぎ出すことにします。
>上ができたとしてもこちらは関係ない
言われてみたらその通りでした。
いつPerlの処理が終わったかExcel側で知る必要がありますもんね。

>>795
すみません、XPではコマンドプロンプトでしたか。

797:デフォルトの名無しさん
08/02/22 01:46:04
>>793
>>728-731

798:デフォルトの名無しさん
08/02/22 02:00:35
active perlはどう?

799:デフォルトの名無しさん
08/02/22 12:22:22
>>792
つまり何桁ですか?

800:デフォルトの名無しさん
08/02/22 20:07:05
>>792
倍精度の前のIEEE 754って、何を規定した規格の番号ですか?

801:デフォルトの名無しさん
08/02/22 21:39:25
>>800
ググれ
浮動小数点数の規格だ

802:デフォルトの名無しさん
08/02/22 23:55:17
>>800
Excel2000辺りは倍精度だけど、2003辺りからは拡張倍精度になっているから要注意。
前者は10進数で概ね15桁、後者は10進数で概ね19桁の精度があることになる。

803:693
08/02/23 16:40:39
解決したよ。

Origin句を定数xlWindowsから、
Shift-Jisのコードページである"932"へ変更してみたところ
文字化けなく開くことができたのでご報告。

その辺の細かな挙動の違いにだいぶ時間使いました・・・。
今後の何かの参考になれば、ということで、ひとつ。

804:デフォルトの名無しさん
08/02/23 16:45:14
VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。
精度をあげる方法がありましたら教えてください。

805:デフォルトの名無しさん
08/02/23 18:30:23
寡聞にしてEWCELなるものは存じ上げませんが、VBAでやってみたということでしたら
ソースをご提示願えませんでしょうか。

806:デフォルトの名無しさん
08/02/23 18:44:19
EXCELの前身のアプリじゃね

807:デフォルトの名無しさん
08/02/23 20:11:53
WinXP+Office 2k7です。
ワークシート上部のいくつかのセルに任意の数値を入力するとそれに基づいて全体が計算されるシートを作りました。
B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか、というのを探すためにLoopを使ったのですが、

Dim x As Integer
x=0.1
Do
x=x+0.0001
Range("B8").Value=x
Loop Until Range("I818").Value=0

とやってもI818が0になっても普通に通り過ぎてしまいますorz
ひょっとしてワークシート上でI818が計算されるのを待たずにLoopが続いてしまうんでしょうか。。?
お知恵をお貸しください

808:デフォルトの名無しさん
08/02/23 20:23:28
お前、小卒か?
整数って意味を知ってるか?

809:デフォルトの名無しさん
08/02/23 20:28:32
あ、integerじゃなくてdoubleでした。
こっちに書くとき間違えた\(^o^)/

810:デフォルトの名無しさん
08/02/23 20:33:09
> B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか
自分でマクロ書かなくても、それはExcelのゴールシークを使えばいいのではないかと思う。

811:デフォルトの名無しさん
08/02/23 20:36:45
>>810
うは・・・全然知りませんでした('A`)
お手数おかけしました。ありがとうございます

812:デフォルトの名無しさん
08/02/24 11:00:13
すれ違いでしたら誘導お願いします。
「マクロを有効化する」を出さずfor文相当の機能を実現しようと思ってます。
直接forは使えないので、富豪的にセルのマスを記憶装置にする方針です。

やりたいことは、以下の状況で
「列Bが「新」の行の数値を抜き出して
それをコンマで連結して指定のセル(例えばD100)に入れる」です。
 列A 数値(1ずつ増えていく)
 列B 「新」「旧」のどちらかの文字

一旦、以下の式をC列に入れて、ドラッグでオートフィルします。
=if(B1="新",A1,"")
これはうまく行き、C列には「新規」の行のみに数値が表示されます。
次に、D列の先頭にC1の値を入れます(forの初期条件)
次に「同じ行のC列に値があれば、一つ上のD列の値をコンマで連結」
  「同じ行のC列に値がなければ、一つ上のD列の値をそのまま表示」
をforのステップ条件としてD2にかき、D100へオートフィルしようとしたのですが
=CStr(D1) & "," & CStr(C2)やCStr(val(D1)) & ..といった式ではうまくいきません。
アドバイス頂けないでしょうか

以上長文失礼しました。

813:812
08/02/24 11:03:55
↑訂正「新規」ではなく「新」ですね

814:デフォルトの名無しさん
08/02/24 11:37:49
Vlookupじゃね?

815:デフォルトの名無しさん
08/02/24 12:12:23
>>804

> VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。
log関数は数値が小さいと精度は悪くなる。
少し値が変わると急激に値がかわるからな。    
自分で精度のよい関数を作るのがよい。
級数展開とかやれば作れる。

>>805-806
おまえら厨房だな。

816:デフォルトの名無しさん
08/02/24 13:44:03
質問なのですが適当な大きさのユーザーフォームを作成してフォームの中にラベルや
ボタンを設置します。設置したラベルやボタンが常にフォーム幅の真ん中に設置
させる方法はありますでしょうか?フォームの大きさを後で変更しても真中に自動で
なるようにしたいです。

817:812
08/02/24 15:25:46
>>814
それだとコンマをくっつけることができませんでした。
しかし、結局、こんな感じで解決しました
if(C2<>"",concatenate(D1,",",text(C2,"#")),D1)


818:デフォルトの名無しさん
08/02/24 21:05:38
>>816
算数レベルで処理


819:800
08/02/24 22:00:00
>>802
Thanks。概ねという留保付けは、このせいですか?
Excel で浮動小数点演算の結果が正しくない場合がある 2007年3月19日
URLリンク(support.microsoft.com)

820:デフォルトの名無しさん
08/02/24 22:38:32
816さんどーゆうことですか?


821:802
08/02/24 22:49:22
あーそうそう、そこの精度の欄にある、暗黙と仮数を足した53ビットを10進で表わすと概ね15桁ってこと。
つまり、log2(2^53)≒15.95=15~16桁。

822:デフォルトの名無しさん
08/02/25 10:04:55
教えていただきたいのですが、エクセルで、Aの列に任意のセルのカーソルが
ある場合のみ(B列やC列ではプログラム自体が稼動しなくしたいのですが)
FANCTIONを実行したいのですが、うまくいきません。
どうしたらうまくうごくのでしょか?


823:デフォルトの名無しさん
08/02/25 11:18:34
>>822
もうちょっと分かるように説明しる。あと、どんなFUNCTIONよ?
ボタン押したときに、カーソルが特定の列にある場合にのみ処理を有効にしたいってことか?


824:デフォルトの名無しさん
08/02/25 11:38:48
822です。
>カーソルが特定の列にある場合にのみ処理
まさにこの事です。エクセルの行列のデーター
をVBで計算させてるのですが、キーの列をA列にして
そこからActiveCell.Offset(0, x)とActiveCell.Offset(0, x+1)
を足してActiveCell.Offset(0, x+2)へ答えを出しなさいとしてるのですが、
いかんせん、キーにしているA列以外にセルがある場合も実行していまうので
ActiveCell.Offset(0, x+2)の書き込みたいところデーターのあるActiveCell.Offset(0, x+3)
とかに上書きしていまうので、何とかしたいのです。FANCTIONは
ActiveCell.Offset(0, x+3)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+2)
を変数にしたものです。


825:デフォルトの名無しさん
08/02/25 11:42:10
すいません。間違いました。FANCTIONは
ActiveCell.Offset(0, x+2)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+1)
を変数にしたものです。
です。




826:デフォルトの名無しさん
08/02/25 12:17:05
>>825
単にFANCTIONとやらの先頭で、ActiveCellがA列じゃなければ終わればいいだけじゃね?

827:825
08/02/25 12:58:53
ActiveCellがA列じゃなければが、
書けないのです・・・


828:デフォルトの名無しさん
08/02/25 13:12:22
そもそも>824のxはどこから出てきたのか知らんが、
offsetプロパティに辿り着けるくらいならcolumnプロパティくらい見つけられるだろ。
試しにmsgbox activecell.columnして味噌。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch