すいません教えてください。 メニューバーに独自のメニューを追加する場合の, OnAction プロパティを使用して,引数のついたプロシージャを起動する方法がわかりません。 例えば,追加メニューに登録する実行プロシージャ「TEST」に,引数1を付けて登録したい場合, .OnAction="TEST(1)" としても上手く行きません。 ヘルプを参照したりいろいろなサイトも検索したのですが,よくわかりませんでした。 ここは詳しい方が多いので,どうかよろしくお願いします。
953 :
952 :2010/04/11(日) 21:25:58
952です。 書き忘れました。 開発環境は,WindowsXP,Excel2003です。
954 :
デフォルトの名無しさん :2010/04/11(日) 21:35:27
文字を入れ替えるのはどうすればいいですか? 例えばA1に"ねこ"、B1に"いぬ"とあったら、 A1に"いぬ"、B1に"ねこ"と出るようにしたいんです。
VBA関係ないね
よーしパパテキトーに答えちゃうぞー
>>951 多分無理。参照の追加でいけるかもしれない
それか
Dim wdReplaceAll As Long
wdReplaceAll = 2
とすれば?constの方がいいが、まぁテキトーに
>>954 Sub a()
Dim a, b
a = Cells(1, 1)
Cells(1, 1) = Cells(1, 2)
Cells(1, 2) = b
End Sub
入れ替えることはできない。一旦変数に入れる
957 :
951 :2010/04/11(日) 22:02:39
>>956 やっぱ無理すかねー
Wordオブジェクト作ってるから
APPWord.wdReplaceAll
とかでいけるかと思ったけどダメだったもんで
先の質問となったんです
素直にconst定義します
これなら出来るよーーっての
今後の為にも気長にまってます
(当然 自分でも いろいろググって みますが)
ありがとでした
>>954 x = Range("A1").Value
Range("A1").Value = Range("B1").Value
Range("B1").Value = x
>>957 wordのタイプライブラリ(オブジェクトライブラリ)を参照設定する。
これで
Sub foo()
Debug.Print wdReplaceAll
End Sub
が2と出力される。
>>956 テキトーすぎ
aが重複してるしbは空のままだし
961 :
951 :2010/04/11(日) 22:39:54
>>959 やった 出てきた!!!!
ありがとう御座います
感謝感謝です
2003 xpです 配列の値のmaxってどうやって調べればいいんですか? maxkensaku(1 to 100)と100個数値入れて、その中で最大値が入ってる変数(仮にmaxkensaku(30))とか出したいんですけど・・・
どうやって?ループして全部調べれば? そういう関数とかは無いよ
速度に目をつぶるなら、rangeに入れてしまうってのはあり
965 :
962 :2010/04/12(月) 02:19:16
色々調べながら半分自己解決してみました。 わかりにくいと思いますけど。こんな感じでmaxの入ってる配列番号は取得できるっぽいです Sub maxtest() kaisirow = 5003 Dim maxkensaku(1 To 10) As Double’小数点対策 For i = 1 To 10 '配列番号は順行だけど回すのは下からだから注意 maxkensaku(i) = Cells(kaisirow + 10 - i, 4) '5012〜5003に逆行しながら10セル取得 Next i = 0 Do i = i + 1 Loop Until maxkensaku(i) = WorksheetFunction.Max(maxkensaku()) msgbox i End Sub 値が文字列の時の判定もしないかんしメンドクサイ つうかDoubleだと多分エラーだなw variant使いたくねぇ。
Variant使うならこうか?あんまメリットないな Sub maxtext() Const kaisirow As Long = 5003 Dim X As Variant Dim MaxValue As Double With WorksheetFunction X = .Transpose(Cells(kaisirow, 1).Resize(10, 1).Value) MaxValue = .Max(X) End With Dim i As Long For i = 1 To UBound(X) If IsNumeric(i) Then If i = MaxValue Then MsgBox i End If Next End Sub
100個いっぺんに処理しろよ なんで10個ずつ分けるんだよ かえってめんどくさいし遅くなるだろ Variansの配列に入れてワークシートにコピー、MAX関数で最大値を求めてFIND関数でインデックス番号を求める まあ100個程度ならForで回しても大差ないけど
配列をWorksheetFunctionなんてまともに使えないよ。 使える1次元目の要素数は65536までだもんね。 バージョンによってはもっと少ないし。 Transposeなんて配列じゃなくセル範囲でも65536までしか使えないね。 配列ならループまわして十分だよ。 WorksheetFunctionと早さは変わらん。
>>965 そのように配列がセルから取り込んだものならそんなやり方は間違いだよ。
配列がなんでも速いと思ってるやつがいるが、WorksheetFunctionは配列は遅い。
>>966 そんなんじゃまるで駄目だな。
配列に取得しちゃいかんよ。
下と同じじゃないか。
set r = Range("d5003).resize(10)
with worksheetfunction
i=.Match(.Max(r),r,0)
End with
>>965 読む限り最大値の入ってる最後のセル位置を求めたいようだから、これじゃ駄目だろうけど。
970 :
デフォルトの名無しさん :2010/04/12(月) 13:45:20
>>928 ありがとうございます、できました!!
返事遅くなってすいません。
ブックを複製した先のマクロ、デバッグで調べたところとある一部のループ処理が無茶苦茶遅くなってたんだけど、そんなバグってあるの? 勿論コード自体はいじってないので全く同じです。 試しに、複製元のブックをもう一度別に新規に複製した先のマクロではそんな現象は起こりませんでした。
972 :
971 :2010/04/13(火) 14:36:10
どうやらそうではなく、ブックとか関係無く使ってくうちに処理が遅くなるみたいなんです。 対処が訳変わらんので違うコードに書き換えますが。使うごとに処理速度が劣化するなんてよっぽど変なコード組んでしまったみたいです。
使ってるうちに遅くなるのはWindowsの宿命
エクセルは新しいセルを使ったりすると内部にゴミデータが溜まる 多分それほど変なコードではないと思う
そのごみはどうすればリセットできるの?
新しくブックを作って必要なところだけこぴぺ
ファイルサイズが増えるやつ? 仕様だってMSのサイトにあったきがする。
2007からシートやオートシェイプ等の番号の振り方が変わったので ゴミが溜まりにくくなったと思う 2007自体の評価は知らんが
979 :
971 :2010/04/13(火) 23:00:09
御免なさい。2003のXPです。 しかも、使ってるうちっても一回使っただけで後半もうすでに息切れしてるんです。 特徴があって、とある一瞬から急激に速度が落ちてるみたいなんです。 (処理の合間にbeep入れて音の感覚で確認してます。) 確かに、大量の新品のセルにfor each駆使して数式打ち込むのがメインのマクロです。 "=average(〜〜" & 変数 & "〜" & 変数 & "〜" & 変数 & "〜〜〜〜〜〜〜)" 見たいな感じで。 不思議なのは、このコード終了して別のシートで同じマクロ使うと速度の低下が持ち越されるんですよ。 ちなみに標準モジュールで書いたマクロです。 長文失礼しました。
980 :
デフォルトの名無しさん :2010/04/13(火) 23:39:29
教えてください。 XP SP3 + Excel2000です。 セルに入力されたデータを、ワンタッチで消去するのを、 Range関数で、行っています。こんな感じです。 Range("A1:D10").ClearContents ボタンのワンタッチでサッと消えるのは便利なのですが、 実行後に「Ctrl+Z」でのUNDO (再度データ復活) ができないのです。 マウスだと矩形に囲ってdeleteした後に、Ctrl+Zで戻すことができるのですが、 Range()の後にでも、それがしたいのです。 何か良い方法はないでしょうか?
ありません
>>980 プログラムで処理する場合は、エクセルの保護を受けられません。
プログラマが自分で履歴機能を作る必要があります。
例えば、不可視のシートを用意しておいて、
消去ボタンクリック時にセルの内容をそのシートにコピーしてからClearContentsし、
戻すボタンでコピーした内容を書き戻す、など。
983 :
デフォルトの名無しさん :2010/04/14(水) 00:35:06
>>981 >>982 さっそく、ありがとうございました。
大変よくわかりました。
別シートへの待避と復元をやってみます。
どうもありがとうございました。
>>979 とりあえず、マクロの先頭に
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveWindow.DisplayGridlines = False
Application.DisplayPasteOptions = False
Application.DisplayInsertOptions = False
Application.AutoRecover.Enabled = False
Application.ErrorCheckingOptions.BackgroundChecking = False
マクロの最後に
Application.Calculation = xlCalculationAutomatic
ActiveWindow.DisplayGridlines = True
Application.DisplayPasteOptions = True
Application.DisplayInsertOptions = True
Application.AutoRecover.Enabled = True
Application.ErrorCheckingOptions.BackgroundChecking = True
というのを付け足してみ。もしかしたらちょっと速くなるかもよ。
>>980 そのマクロをこんなふうに書き換えて、
Sub 範囲消去()
Range("A1:D10").Select
SendKeys ("{DEL}")
End Sub
マクロのオプションでショートカットキーを定義してから使うようにすれば、Ctrl+Zで元に戻せるようになるよ。
>>985 >Ctrl+Zで元に戻せるようになるよ。
えっ、ホントですか? ありがとうございます。早速明日やってみます。ありがとうございます。
僕も不便に思っていましたが、まわりでやっている人のことを思うと、
ぜひ何とかしてあげたいと思っていました。
うまくいくと、みなさんに喜んでもらえそうです。
どうもありがとうございました。
987 :
971 :2010/04/14(水) 03:15:49
>>984 チョットどころか途中で鈍行する事無1m5sで完了しました。奇跡です。
一番上は当然として、ワークシート関数をセルに記載するのが大量にあるコードだったのでApplication.Calculation = xlCalculationManualが効いたみたいです。
ちなみに下5つの奴は全部つけても1sしか短縮出来ませんでしたw
皆様ありがとうございました。
988 :
デフォルトの名無しさん :2010/04/14(水) 16:56:02
すみません、教えてください。XP SP3, office2000です。 各関数が参照したい変数を、Publicで初期値付き宣言したいのですが、 うまくできません。記述の方法をご存じでしたら、教えてください。 やりたいことは、 Public Dim Const hoge(5) As Integer = { 1, 5, 9, 6, 4 } もちろん上の記述はめちゃくちゃなので、通りませんが、意味合いとしては、 ・Constのhogeという整数の変数を、配列で5個確保して、 ・初期値として右のような順番で数値を代入したい。 ・しかも それら全部を1行で書きたい。 です。 宜しくお願いします
>>988 1行でも何行でも、Constで配列を宣言するのは無理
できないよ 1行で書きたい理由がわかんないけど、似たようなのが数十行あって…とかであれば、 Public Const HOGE As String = "1,2,3,4,5" と宣言、使うときは Split(HOGE)(0) これじゃ文字列型配列になっちゃうから、Array関数とかも使えるかも
定数を大量に用意したいなら、作業用のワークシートにデータを並べてロックしておくという手もある
992 :
988 :2010/04/14(水) 20:53:30
みなさん、どうもありがとうございました。よくわかりました。 C言語だと、初期値付きの宣言ができるので、同じようにやってみたところ エラーばっかり出るので、質問しました。 VBAの作法がわかっていないので、変な質問ですみませんでした。また教えてください。 Public hoge(256) As String として宣言して、 Private Sub Workbook_Open()の中で、代入することにします。 しかしPrivate Sub Workbook_Open()だと、Excelを落として起動して、落として起動して を繰り返さなければならないので、デバッグに時間がかかります。トホホ ありがとうございました。
Private Sub Workbook_Openの中身を晒しな
動画見てないけど、作れないわけない
>>992 ならクラスでやってみたらどうかな?
適当だけどこんな感じで
' クラスモジュール Class1
Private m_Hoge As Variant
Public Sub Class_Initialize()
m_Hoge = Array(1, 5, 9, 6, 4)
End Sub
Public Property Get Hoge(idx As Integer)
Hoge = m_Hoge(idx)
End Property
' 標準モジュール Module1
Sub main()
Dim fuga
Set fuga = New Class1
MsgBox fuga.Hoge(3)
End Sub
>>994 チューリングマシン、要するに今出回ってる全てのPCやソフトは絶対に実現できる
CPU・メモリをエミュレートすればいいだけだからな。
ただしものすごく遅い(Pen4・オンボで最新のネトゲやるような感じ)という条件が加わる
ついでに言うとその質問のレベルだと実現は不可能だ。諦めとけ
そうですか 安心しました
そりゃできるわな
うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。