可能
760 :
デフォルトの名無しさん :2011/05/07(土) 15:43:24.48
閉じずに隠せばいいんじゃね?
俺の環境だと子供がいない
762 :
758 :2011/05/07(土) 17:10:52.62
答えていただきありがとうございます。隠すのは考えたのですが、ここの方ならもっとスタイリッシュな方法があるかと思いまして。何かヒントあれば教えてください。
>>762 標準モジュールの変数に保持しておく方法と、
変数保持用のクラスを作ってそっちに保持しておく方法の2つを
いまパッと思いついたけど、どっちも似たようなもんだべさ。
どっちでもゲッタとセッタ作っとくと綺麗に見えるべさ。
標準モジュールを使う方法だと、たとえばUserForm1とUserForm2と言う二つのフォームを作ったとして、 UserForm1にはCommandButton1と言うボタン、UserForm2にはTextBox1と言うテキストボックスと、 CommandButton1と言うボタンを設置しましたと。ついでにModule1という標準モジュールを作っておいて ここで、UserForm1には Option Explicit Private Sub CommandButton1_Click() Call UserForm2.Show End Sub UserForm2には Option Explicit Private Sub UserForm_Initialize() Me.TextBox1 = Module1.GetTextVal End Sub Private Sub CommandButton1_Click() Call Module1.SetTextVal(Me.TextBox1) Call Unload(Me) End Sub と記述してやると。 続く
>>764 の続き
Module1には
Option Explicit
Dim M_sTextVal As String
Public Function GetTextVal() As String
GetTextVal = M_sTextVal
End Function
Public Sub SetTextVal(IN_sTextVal)
M_sTextVal = IN_sTextVal
End Sub
と記述しといてUserForm1から実行してCommandButton1を押下してUserForm2に遷移したあと、
TextBox1になんか書いて、UserForm2のCommandButton1を押下して閉じても、
UserForm1のCommandButton1を押下して再度開くと、UserForm2のTextBox1に
閉じる前の内容が設定されているでしょ?これが標準モジュールを使ったやり方ね。
おっと、Public Sub SetTextVal(IN_sTextVal)の所は引数がString型と言う事を 明示的に書いといた方がいいね。 Public Sub SetTextVal(IN_sTextVal As String)ね
質問させてください。 Set で変数にブックを指定したいのですが、エラーが出ます。 1つは Dim 転記元 As Workbook, 転記先 As Workbook OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.SLK") If OpenFileName <> "False" Then Set 転記先 = Workbooks.Open(OpenFileName) Else MsgBox "キャンセルされました", 16 Exit Sub End If として転記元に指定し、 2つ目は If Dir("C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls ") = "" Then MsgBox "本日のメッキSGCリストがありません" & vbCrLf & "SGCリストの作成を実行してください", 68, "エラー" Exit Sub Else Workbooks.Open Filename:="C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls " Set 転記元 = ActiveWorkbook End If としたのですが、 転記先.Worksheets("テスト").Active 転記元.worlsheets("リスト").Active 実行時エラー’438’: となります、どのように修正したらよろしいでしょうか?
>>767 先と元のブックごっちゃになってね?
どっちかのブックに「テスト」「リスト」の名前があるシートが無いんでしょ
>>767 まず、転記元.worlsheetsじゃでないべさ。
転記先.Worksheets("テスト").Activate
転記元.Worksheets("リスト").Activate
でやってみ。
それとActivateは何かしたら切り替わるから
あまり使わない方がいいと思うよ。
>>768 さん
シート名は確認しました。
>>769 さん
やってみましたが、
転記先.Worksheets("テスト").Active
でエラーとなります。
転記元を指定するいい方法はありますか??
>>770 おっちょこちょいさん。
「転記先.Worksheets("テスト").Active」じゃなくて
「転記先.Worksheets("テスト").Activate」だわさ。
Activeの部分をもう一度Activateに変えてやってみ?
それでダメならまた考えるわさ。
>>771 失礼しました!
ご指摘の通りActivateにしたら上手く動きました。
ありがとうございました!
773 :
772 :2011/05/07(土) 20:39:45.62
続けて質問させてください。 転記元のオートフィルタの結果を転記先にコピーしたいのですが、上手くいきません。 転記先.Worksheets("テスト").Activate For j = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 Cells(Rows.Count, 3).Value = myvalue Rows(j).Resize(2).Insert 転記元.Worksheets("リスト").Activate Selection.AutoFilter Field:=16, Criteria1:="=" & myvalue 転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) 転記先.Worksheets("テスト").Activate Next としているのですが、 Rows(j).Resize(2).Insert で2行ずつ挿入はできているのですが、オートフィルタの結果がコピーされません、 どこをどのように修正したらよろしいでしょうか?
>>773 まだろくすっぽコード見たわけじゃないんだけど、
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) の、
一番最後のCells(Rows.Count, d)の列に指定しているdってこのソースでは何を設定しているか
見えないんだけど、何を設定しているの?
>>774 dはあらかじめInputboxで指定しています。
>>776 色々ある。正直いって何がやりたいのかが良く見えない。
まず、myvalueはどこで設定しているのかな?いや、どこかで設定していたとして、
Cells(Rows.Count, 3).Value = myvalueを行った後に行挿入を行おうとすると、
最終行に書き込んだそのデータはどうするのと怒られる筈。
後、Selection.AutoFilter Field:=16, Criteria1:="=" & myvalueの
Selectionは何を選択しているのか。まずここで項目名を指しているセルの範囲を
設定しなくてはならないのでは?
それとループの中でまたオートフィルタの絞り込みを行っているけど、1回の絞り込みでいいのか、
再度絞り込みたいのか。再度絞り込みたいなら一度絞り込みを解除してから
行わないと怒られるんじゃない?
本来これらのエラーが出ると思うんだけど、実際に出てないとすればオートフィルタ―自体の
範囲がちゃんと設定されていない可能性もあるね。
取り敢えずその辺から見直して見るといいんじゃないかな?
おおぅ、自分にレスしてどーする。
>>776 は
>>775 へのレスね。
ちょっと疲れたべさ。暫く自分の方のAndroidの勉強するわ。
まぁ要するに良く見えない。
>>776 ,778
転記元のデータをオートフィルターで抽出して、転記先に張り付けていきたいのです。
いろいろ修正して
For j = Cells(Rows.Count, myCol).End(xlUp).Row To 2 Step -1
myvalue = Cells(j, 3)
Rows(j).Resize(2).Insert
r = j - 1
転記元.Worksheets("リスト").Activate
ActiveSheet.Range("A1").Select
Selection.AutoFilter Field:=16, Criteria1:="=" & myvalue
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d) -@
転記先.Worksheets("テスト").Activate
Next
となり、あと少しで完成しそうなのですが、
ただ、@の部分で可視セルを選択しないといけないのですが、
可視セルのある指定範囲の選択(3列目から6列目等)は
どうすればできるのでしょうか??
分かりにくい文章、見にくいコードで申し訳ありません。
本当に意地汚くて嫌いだ、自分。体も精神も恥ずかしい。
>>779 よく分からないけど
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d)の、
Range("W2:AD4")の部分をどうやって動的にコードで表現しようかなって事いってるのかな?
そうだとしたら、たとえば3列目から6列目の選択範囲をコピーしたいなら、
Range(Cells(2, 3), Cells(Cells(Rows.Count, 6).End(xlUp).Row, X))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)
とかに変えてあげればいいんじゃないかな。
おっと違うな。 Range(Cells(2, 3), Cells(Cells(Rows.Count, X).End(xlUp).Row, 6)) (※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)か。 なんか疲れてるみたいだわ。
783 :
779 :2011/05/08(日) 01:01:11.56
>>782 ありがとうございます。
なんとかなりそうです。
助かりました!
>>783 お役に立ててなによりだけど
もし自分の勉強の為じゃなくて仕事として作ってるなら、
転記先のシートに行を挿入する必要は本当にあるのか、
変数dはループの中で特にいじってないから貼られる先は常にいっしょじゃないのか、
なによりシートをアクティブにしてセル操作を行っているだけで、
どのブックのどのシートのどのセルを操作すると言う書き方をしてないから
操作的に非常に不安定じゃないかとか
まぁ色々あるからその辺を良く考えて作り直した方がいいと思う。
どうせ長いコードじゃないし。
>>784 仕事で使用するために試行錯誤しながら作っています。
変数dと行の挿入はこの前にデータの整理や不要行・列の削除を
行っているため必要となっています。
ご指摘のようにシートやセルの操作は改善の余地が大ありと
思っています。
また分からないことがあれば質問させていただくので
機会があればご教示の程よろしくお願いします。
>>773 あまり読んでないけど、
オートフィルタの結果のコピーは、
範囲.SpecialCells(xlCellTypeVisible).Copy
かな
でもVBAでオートフィルタ使うのは良くないと思う。
だから質問自体がナンセンス。
私なら転記元のデータを走査してヒットしたら、ひとつずつ転記先にコピー
していくか、collectionか何かに溜めてからまとめてコピーするかだな。
念のため、コピーと言ってもCopyメソッドを使うわけではないよ。
if ヒットしたら then
転記先.Cells(ヒットした分).Value=転記元.Cells(走査した分).Value
end if
787 :
758 :2011/05/08(日) 17:06:37.90
何度もすみません。 フォームを閉じた後も変数を保持しておく方法がまだ解決していません。 webをいろいろ見てみたのですが宣言セクションで宣言した変数はブックを閉じるまで値を保持し続ける と書いてありやってみましたが上手くいきません。 763さんが言っている「標準モジュールの変数に保持しておく方法」 というのも調べてみましたがよくわかりませんでした。 本当に申し訳ありませんが、このようなやり方が記載されているweb もしくは、コードを教えて頂けると助かります。 馬鹿な質問で申し訳ありません
>>787 一番簡単なのはワークシートのセルに保存しておくかな
標準モジュールの宣言セクションでPublic で宣言した変数を
フォームで使うようにしたらどうなの
>>787 要するに変数のスコープという基本的な知識が抜けているんだよ
他にもプログラミングの基本的な知識が抜けすぎ
このまま先へ進めても分からないことだらけになってしまう
VBAでプログラミングの勉強をするのは困難すぎる
素直にCやJavaなどメジャーな言語の入門書を読めば必ず書いてある
どうでもいいけどVBAの良著って悉く絶版だよね VBAに限った話じゃないかも知れないけど
>>790 そう思ってクラスモジュールを作ってやる方法を書かなかったんだけどなぁ。
プライベートとグローバルの宣言の違いさえ理解しててくれてればなぁ。
クラスとかまじわかんね。 前に進められたVBのエラーコーディングはとても参考になった。
C#のクラスは大体分かるが、VBAのはよく分からない不思議 MSも早く.NETに移行すればいいのに
EXCELのVBAやVB6.0は構造化言語とオブジェクト指向型言語の狭間にいる言語だから仕方ないと言えば仕方ない。 オブジェクト指向型言語から入った人から見れば、このスレで書いてるコードとか見た時、 あー、破綻してるなコレと思う事が多々あるだろうし、 低級言語から入った人とかが見れば、 ぐはぁ、メモリが、処理コストがぁ〜と思う事も多いと思う。 でもま、時代の流れから見てもオブジェクト指向を取り入れて損はないと思うべさ。
とにかく
>>787 の人にはまだちょっと
どんなクラスを作って、どこでインスタンスを生成して
どんな使い方をするのかを考えて組むのは
>>970 の人が言ってる通り多分まだ無理。
一度
>>764-765 に書いてある様に実際に打ち込んで走らせて流れを追ってほしいな。
それでも理解できなければカプセル化の概念が崩れるけど
>>788 の人が言ってるみたいに、
標準モジュールにPublicで宣言した変数に保持するのが手っ取り早いかな。
質問させて下さい for文中で、変数をnとしてセルを操作しています。 その変数を用いてあるセルに関数を入力して、その関数中の指定したいセルをnを用いて変化させたいのでうまくできません。 うまく伝えられないので、現状としてやりたいことは、 あるセル(ここではA1)に数字を入れて、その数だけfor文を繰り返させています。 A1セルに10と仮に入れて、その隣Bセルに、for文を用いて、Eセルを参照するVLOOKUP関数をA1に入れた数字の行数分繰り返させたいのです。 理想としては for n =1 to n Range("B"&n)="=VLOOKUP("E"&n,sheet2!A1:B100,2,FALSE)" (参照先のsheet2などは特に問題ありません) next のようにして、nが増えるにつれてVLOOKUPの部分を書き込んでいって欲しいのですが、直してもうまくいきません。(当然上記じゃ動かない) 参照HPなどで結構ですので、よろしければ教えて下さい。
>>797 はい
n = Cells(1, 1)
For n = 1 To n
Cells(n, 2).Formula = "=VLOOKUP(E" & n & ",sheet2!A1:B100,2,FALSE)"
Next
799 :
758 :2011/05/08(日) 21:10:27.32
皆さん親切に教えていただきありがとうございます。とりあえず788さんの方法でできました。764さん折角書いていただいたのに見逃してごめんなさい。これを見て勉強させていただきます。
800 :
デフォルトの名無しさん :2011/05/08(日) 21:30:29.26
Webクエリの機能で、VBAによって指定したURL(ワークシート上のセルから取得)を開くことは出来ませんか?
たとえばA1に"
http:yahoo.co.jp "と書いてあって、VBAでそのページを開く方法です。
Excel2003です、よろしくお願いします。
>>800 わざわざVBA使わんでも、ハイパーリンクじゃ駄目なの?
802 :
デフォルトの名無しさん :2011/05/08(日) 21:52:04.38
>>801 目的からして処理が速くないと意味無いのでハイパーリンクじゃ駄目です
804 :
デフォルトの名無しさん :2011/05/08(日) 21:54:43.51
>>803 Webクエリなのでブラウザは関係ないと思いますが
ワークシートに展開する テキストに流し込んでHTML作成 フォームのに描画する webbrowserコントロールでブラウザ作る 梳きなのどうぞ
>>799 なんか突貫工事っぽいけど、とりあえずは完成したのかな。
完成する前にとやかく言うのもアレだと思って言わなかったんだけど、
>>786 の人の意見はごもっともだからね。初期の設計そのものに問題があるよ。
例えば私だったら後々抽出条件が複雑になる様な改修が入る事を想定して、
転記元のシートにSQL投げてRecordsetに値を取得して、それを転記先のシートに
展開する様な方法を視野に入れたと思う。
まぁ、実際そのツールの事を知ってる訳じゃないから何とも言えないけどね。
頑張ってね。
>>804 マクロ記録でwebクエリ挿入したのを見るといいよ
808 :
797 :2011/05/08(日) 22:26:51.53
>>798 できました!
ありがとうございます。とても助かりました。
>>800 こんなんでどう?適当だけど。
Option Explicit
Sub ChangeWebQueryRefer()
With ActiveSheet.QueryTables(1)
.Connection = "URL;" & Cells(1, 1)
.Refresh
End With
End Sub
ああごめん、
>>809 は既になんかWebクエリが設定されていた後でA1に変更したい
URLを設定した場合ね。
811 :
デフォルトの名無しさん :2011/05/08(日) 23:19:23.35
812 :
797 :2011/05/08(日) 23:21:47.69
たびたびごめんなさい・・・
>>798 で、関数中のEを変数nにしたがって移動させるにはどうしたらいいのでしょうか?
n=3のとき関数中のEをGにしたいのですができますでしょうか?
よろしくお願いします。
>>812 よくわからんがifで条件分岐させるのじゃダメなの?
>>812 はい
n = Cells(1, 1)
For o = 1 To n
p = "E"
If o = 3 Then
p = "G"
End If
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
816 :
797 :2011/05/08(日) 23:40:54.19
>>814 ありがとうございます。しかし私の書き方が悪かったようで、nがいかなる数字の場合でもそれを加えた数だけ列を移動させたいのですが無理でしょうか?
なんで1が先にWakeUpすんだ・・・ 放物線の話しじゃないの。
818 :
797 :2011/05/08(日) 23:50:48.36
>>815 OFFSETでできました!
ありがとうございました。
>>816 はい
n = Cells(1, 1)
For o = 1 To n
p = Cells(1, o).Address
p = Replace(Left(p, InStrRev(p, "$") - 1), "$", vbNullString)
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
RO浄水器をつければいいだけやろ
822 :
デフォルトの名無しさん :2011/05/09(月) 15:02:27.04
テキストボックスが60個あって 入力する度に文字をチェックするプロシージャを作ってるんですけど、 PrivateSub TextBox1_Change (略 PrivateSub TextBox2_Change (略 ・ ・ ・ と60個も並べたくなく、 一発で済む方法ないですか?
TextBox(0) コントロール配列ってVBAじゃ使えなかったっけ?
VBAでコントロール配列は使えない .Textプロパティに代入とかならControlsでも出来るけど イベント取りたいとなるとコレクションとクラス使った疑似コントロール配列だな
>>822 この手の質問定期的にきてうざいな
クラスモジュールを使えばできるから
自分で調べてみろ
826 :
822 :2011/05/09(月) 21:57:30.59
>>823-825 サンクス、「擬似コントロール配列」で検索してみたら出てきた。
ホントはChangeじゃなくAfterUpdateだからそんなに難しくなさそう。
頑張ってみるよ!
朝鮮人に関わると こうなる見本w
828 :
デフォルトの名無しさん :2011/05/10(火) 13:58:47.10
失礼します。vista/2007(2003互換mode) ボタンコントロールクリック、以下の処理内で実行時エラー32809が発生します。 Dim data As Dai Dim sheet As ISheetFormat While Removal.HasNext Set data = Removal.NextDai If data.IsP Then Set sheet = Sheet2 ☆ ElseIf data.IsBunri Then Set sheet = Sheet11 ☆ Else Set sheet = Sheet10 ☆ End If sheet.SetValue data, dt sheet.CopyBefore ActiveWorkbook.Sheets("Sheet1") Wend ---------------------------------- 以下の手順を踏むと実行時エラーが発生します。 @ブックを起動 Aなにもせずとりあえずブックを上書き保存→excel終了 Bブックを起動 C上の処理を実行 ちなみに@の後にCを行うと正常に動作します(ここ大事)。 また、一度エラーが発生すると上記処理内に限らず ☆マークのシートを参照しようとするとエラーが発生します。 ☆マークのワークシートはそれぞれISheetFormatをimplementsしていますが、 一度エラーが発生するとimplementsしようがしまいがとにかく参照しようとすると32809…。 原因につながるヒントを頂けると助かります。
829 :
デフォルトの名無しさん :2011/05/10(火) 14:03:17.25
シート全体をvalueに換えるうまい方法をおしえてくれ。 cells.copy cells(1,1).pastespecial paste:=xlpastevalue 以外
>>829 釣りだな。ほらよ。
Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) = Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
間違えた。ケツに.Valueでもくっ付けとけ。
> Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) なんでわざわざこんな書き方してるの?釣り?
お前ならどう書くっていいたいんだ?
>>832 は逃げたか。
釣り用のヘボいコードだと言う事までは分かったらしいが、
この程度のコードのどこがヘボいかまでは指摘できる脳みそを持ち合わせていなかったようだな。
またアフォが暴れてるなw Range(Cells(1,1),Cells(Rows.Count,Columns.Count))ってCellsと同じだわな
質問です。 実は今マリオみたいなゲームを作ろうとしていますが、セルをドットの様に使って 横スクロールをした時、すぐに右端へたどり着いてしまいます。 擬似的に左右で永久にスクロール出来る様に見せかけたいのですが、どんな方法が有りますか? 又、その方法を使った時、最少のセルの横ピクセル数は何ピクセルくらいになりますか? 環境はWinXPのEXCEL2003です。
>>836 右端に来たら下の方の行とか別のワークシートに移動させる
>>839 なるほど、そうすると最低のセル横幅は256セルで2画面分になる様に設定すればいい訳ですね。
何となく目処が立ちました。ありがとうございます。
>>830 =
>>833 =
>>834 は、マジで
>>835 に気付いてなかったようだなw
この程度終わる話に「指摘できる脳みそ」なんて発想は出てこないから
Cells以外の何かを発想してたんだろうね。恥ずかしすぎるw
VBAゲーム博物館にエクセルマリオがあるぜ
やはり
>>829 は釣りだったな。
そして
>>829 ,
>>832 ,
>>835 ,
>>841 は全て同一人物。
>>829 で質問を投げといて、しょぼい答えが返って来るのを待って、返って来たらぶっ叩く。
それを楽しみにこのスレに来ている訳だ。
今回は煽りをくれてやって初めて反応したが、
やっぱりこいつがいつもスレが荒れる原因を作ってる奴だったんだな。
どうでもいい荒らすな
>>836 マシンスペックによって動作速度が違うゲームが出来上がりそうだなw
>>845 その辺はAPIを使ってwaitかけて統一するつもり。
余りにマシンスペックが低いのは見捨てる方向で。
>>843 残念、その中に俺が一つ入ってるので全て同一人物ってのはハズレ
他3つが同一人物でも、少なくとも2人だ
俺の予想では質問者は別で、残り2つが同一人物で、計3人だな
>>1 からここまで全て俺の自演なんだ
>>484 は気付いてないかも知れないが、君は俺の自演から生まれた人格なんだよ
さあ俺の元へ還れ
俺は一つ書いてるんだが、まったくつまらん
計算や抽出検索、転記などの機能ごとにモジュール分割したいのですが UserFormの CommandButton1_Click() のようなものはユーザーフォームに直接記述して、 実行するものをcallするといった感じでしょうか? それともUserFormには一切記述しないのでしょうか? いまいち質問が分かりにくいかもしれませんが、よろしくお願いします。
イベントは標準モジュールには丸ごと移動することは出来ないのでCallすることになるけど クラスモジュールにならイベントごと移動することも可能 どちらを使うかは852も言うとおり「好きにしろ」で
changeイベントの中でイベントの起因に なったセルが、 ペーストされたのか、手入力されたのか、 分かる方法ない?
>854 Target の個数が複数だとペースト1択だけど、1個だと・・・どうでしょうねえ
>>855 ありがとう。
解決の方向性は見えました。
857 :
デフォルトの名無しさん :2011/05/12(木) 13:09:51.16
行を一個飛ばしで選択する方法を教えてください 1、3、5、7、9、 といった感じです
CTRLを押しながら選択する
まず素数判定プログラムを作ります セルにセットします 素数を一つ飛ばしで一致させるプログラムを作ります 配列にランダムソートで格納します APIから時刻を取得し、データが枝と一致したら、シートから正規表現で該当セルを抜き出します 抜き出したセル番地を配列にセットします IDEをインポートして、自コードを行を一つ飛ばしで選択出来るよう書き換えます 保存せずに終了させます
ワークシートに配置したシェープから親オブジェクト(ワークシートオブジェクト)を取得しているプログラムがあるのですが、 別のパソコンでデバッグした場合、「Shapes」が取得される場合があります。 同じプログラムソースコードから取得した型の結果が違うのですが、 原因が掴めないです。 Debug.Print Typename(ActiveSheet.Shapes(0).Parent) 当パソコン→Worksheetが返されます。(正常結果) 別パソコン→Shapesが返されます。(異常結果) 何が違うのか教えていただけませんか。すみません。
862 :
861 :2011/05/13(金) 23:16:31.18
すいません。 両端末とも、 OS: Windows XP オフィス:Excel 2007 です。
>>862 当ててあるサービスパックが違うんじゃないの?
864 :
861 :2011/05/14(土) 00:13:20.35
>>863 ありがとうございます。
なるほど。
元々、シートのシェープの親を取ってくる事になるので、
はじめから、ワークシートオブジェクトのみを取得してきたほうが安定しますね。
大変助かりました。
865 :
デフォルトの名無しさん :2011/05/14(土) 01:26:51.28
Excel2003から2007に移行したのですが、 Auto_Openを動作させずにマクロを開きたい時に、Excel2007ではShiftキーを押したまま Excelを起動した時でもAuto_Open処理が動いてしまいます。 また、マクロ設定を無効にしている場合はマクロの編集ボタンが無効になっており プログラム編集ができません。 Auto_Openを動作させずにマクロを編集する方法をご教授願います。
2007でも出来たと思うが
Win XP + Office 2007で試してみた たしかにShift押しながら起動でもAutoOpenは起動するね 回避方法は知らん
>>865 直接フォルダからEXCELを開くんじゃ無くて、一度EXCELのアプリケーションを立ち上げてから
「ファイルタブ」の「開く」で開きたいブックを選択して、シフト押しながら「開く」ボタン押下で出来るわさ。多分。
ついでに質問させて頂くわさ。 テーブルジャンプを行いたいです。 具体的には2つの動的な配列変数を用意して、一つの配列に処理順、もう一つの配列に 実行する関数のアドレスを設定して その配列に設定された順序に関数を実行する処理を作りたいのです。 方法としては、スタックポインタが指しているアドレスの 関数戻りアドレス情報を次の呼び出し関数の呼び出しアドレス情報に書き換えてEnd Functionなり End subなりを実行して行うか、または なんらかしらのAPIでコールバックして行う方法を考えているんですけど、 取り敢えず配列に処理順序と関数の開始アドレスを設定する所までは上手くいったものの、 その後のいい方法がなかなか無いんです。 かといって適当に繰り返し処理や分岐でただの関数呼び出しを行ったんでは 処理コストが掛かり過ぎるのと、管理し辛いといった面から避けたい訳です。 特に今作っているのがゲームだから、処理コストは出来るだけ掛からない様にしたいのです。 何かいい方法はありませんか?
>>870 別にAPIを使う方法じゃ無くても実現出来れば方法にこだわらないわさ。
何ですれ違いになるのかな?
>>872 まず★2を読んで欲しい。
それと、全体から見てVB6のUIでは遅すぎて考えた通りのゲームを作れ無いので、
EXCELのシートを使ってゲームを作成している。
その辺の処理速度を考慮しての話だからすれ違いでは無いよね。
だから処理コスト、処理速度を考慮していくと、Excelは描写手段として使うだけで その前の処理は全てExcel関係ない処理になるんだってば それにVBAと比べれば、処理も描写もVB6の方が速いぞ 間違った方法取ってなければな
まぁ余りダダを捏ねていてもスレが荒れそうなので引っ込むわさ。 でもいい方法が有ったら教えて欲しいなぁ。
まあ、知ったか教えたがりは2chには多いから スレ違いでも教えて貰える可能性は0ではないからな
877 :
デフォルトの名無しさん :2011/05/14(土) 10:40:19.28
関数呼んだら、番号によってSelect-Caseした後、ジャンプすれば ジャンプテーブルになるんじゃないかな。
>>877 ありがとう。
その方法は一番最初に考えたんだけどやっぱり条件分岐なもんで
キャラクターの属性と動作ごとに処理分けを行うと相当数になるから
出来れば条件分岐ではなく、インデックスを与えてそれを実行する様な方法を取りたかったんですわ。
でも最悪、その方法を使う事にさせて頂きますわ。
本当にありがとうございます。
ただ、この話題はすれ違いらしいのでこの辺で。
最悪の方法ならスレ違いじゃないなw
880 :
865 :2011/05/14(土) 12:14:03.44
エクセルならシートに配列書き出してワークシートソートすれば早かろう これならスレ違いにもならぬ
えっ?
ワークシートソートの方が速いって 余程ヘボいソートアルゴリズム使ってるんですねw
>>883 がワークシートのソートやクイックソートより超っ速いコードを公開してくれるそうなので楽しみに待ちましょう
嫌味のつもりで言ってるのだろうけど、その辺に転がってる物を 「公開してくれるそうなので楽しみに待ちましょう」とか、バカっぽすぎて吹いた。
そのうち気付くだろう その言葉は自分にこそ相応しかったと
このスレで語尾に草生やす奴は総じて口だけのヘタレだよね
草1つの場合はそうでもなかったな。 草複数生やす奴は総じて口だけのヘタレだったけど。
単芝死ね
悔しかったんだね
悔しいです(`皿´)
単芝が糞かどうかは
>>883 がコード晒せるかどうかにかかっているのか。
責任重大だな。
>>894 なるほど、クイックソートより超っ速いのがその辺に転がっているとか言ってる時点で
察しろよ、言わせんな恥ずかしいって事か。やっぱり語尾に草生やす奴は総じて駄目か。
896 :
デフォルトの名無しさん :2011/05/14(土) 18:08:30.38
関数を指定したセルに文字を設定しつつ、 着色もしたいのですが、下記のユーザ定義関数では #VALUE!になってしまいます。 Public Function hoge() ActiveCell.Interior.colorIndex = 3 hoge = "aaa" End Function どのようにすれば実現できますか? Windows7、Excel2010です
>>896 ユーザー定義関数内で着色しようとしてるからじゃない?
条件付き書式で代用すれば?
>>897 どういった意味でしょうか?
>>898 実際には複雑な条件チェックをして
その結果によって着色するかしないか
を決めたいので条件付き書式では難しいんです。
>>895 なんか曲解してるな
言い負かされて悔しいからわざとねじ曲げて解釈して憎まれ口叩いてるのか?
ワークシートソート(並べ替え機能)との比較が いつのまにかクイックソートとの比較になってる 悔しさのあまり顔真っ赤にして必死になってると、 こうやって話が明後日の方向に飛んでいってしまうのかな?
もうやめて! あたしのためにこれ以上争わないで!
>>903 プッ
今頃何言ってるのかな。逃げに入っちゃったかな?
>>884 の発言の後で
>>885 でその辺に転がっているって言ってるよな。
ほら、その辺に転がっているならとっとと挙げてみれば?
人の言ってる事オウム返しにしか言えない奴にはちょっと厳しい?
セルに自作関数を使って制御したいんだろうけど
あらら、勘違いを突かれて壊れちゃった? 本当に逃げてるなら、逃げてると言われるのは痛いところだろうが 逃げに入ったとか、ちょっと厳しいとか言われたところで 根本を勘違いしてる奴の言葉じゃ滑稽なだけで煽りにもなってないもんな
>>907 あーあ、完全に逃げたな。
結局根本とか何とかウダウダ言ってその辺に
転がっているって自分で言ってたコードも晒せないんだもんな。
やっぱり草生やす奴は総じて糞と言うことが確定したな。
今どういう話なのか三行で
ワークシートソート(並べ替え機能)より速いソートがあるとしか言ってないんだから ワークシートソート(並べ替え機能)より速いソートを晒せば納得するのか?
>>896 ひょっとして文字を設定するという部分は
hoge = "aaa"
の部分?
>>909 ワークシートソート(並べ替え機能)より速いソートがあると言ったら
>>883 クイックソートより超っ速いコードを公開してくれる
>>884 といきなり一言も出してないクイックソートにすげ替えたバカが粘着中
>>910 ハァ?
それじゃ
>>884 に対する
>>885 の発言の解になってないだろ。
ちゃんと自分でクイックソートより速い奴がその辺に転がっているって
言ってるんだからそれを晒せばいいだけじゃないか。何か問題でもあるのか?
君たち!頭悪そうだからやめておきなさい(^^;
worksheet chengeを使ってターゲットを自動で変更すりゃいいかなと思ったけど これうまくいかねえな
917 :
896 :2011/05/14(土) 19:29:19.59
>>912 そうです。
セルに =hoge() と入れたら、そのセルに"aaa"と設定した上で着色したいんです。
>>917 Public Function hoge(str As String)
ActiveCell.Interior.colorIndex = 3
ActiveCell=str
End Function
そもそもVBAエディタに書いたコードをワークシートから呼べるの?
>>914 自分の発言には責任持つけど、バカの曲解にまでは責任持てませんぜ
俺が書いたのは
「ワークシートソート(並べ替え機能)より速いソートがある」
と、それに対して公開しろ的なレスがあったので
「(自分があると書いたワークシートソートより速いソートは)その辺に転がってる」
だけだ
「クイックソートより超っ速いコードがあると言ってるなんて曲解してるバカがいるが
それについてもその辺に転がってるぜ」
なんてことは書いた覚えは無い
>>917 ワークシートにこれを書けば
Const ConstTargetStr = "=hoge()"
Private Sub Worksheet_Change(ByVal Target As Range)
'シート上のどっかが書き換わったらConstTargetStrを探し出す
'探し出したセルに"aaa"を代入して色を変更するプログラム
End Sub
>>918 なんだ、僅差でクイックソートよりワークシートのソートメソッド使った方が速いのか。
これは
>>921 はどう言い訳するんだろうな。
じゃあ「ワークシートソート(並べ替え機能)より速いソートがある」のを晒してくれればいいや。
ちょっと楽しみ。
俺から見ればどっちも 「ワークシートソートなんてクソ」 って言ってるように見えたが
>>923 うわーこんな事できるの知らなかったわ><
928 :
896 :2011/05/14(土) 19:43:58.95
>>919 やってみましたが、#VALUE!になってしまいます。
>>920 呼べます。
それをユーザ定義関数と呼ぶらしいです。たぶん。
>>922 これでも要件を満たせますが、
実際にやりたい処理はもっと複雑なので、
シート上の変更のたびに呼び出されてしまうのは、
避けたいです。
>>928 こちらの Win2000, Excel2000 では
以下のコードでおkだった
Public Function hoge()
ActiveCell.Interior.ColorIndex = 7
hoge = "aaa"
End Function
932 :
896 :2011/05/14(土) 20:05:01.64
>>931 色も変わりました?
WinXP、Excel2003もあるので、それで試してみました。
#VALUE!にはならないですが、色がかわりませんでした。
そのhogeはちゃんと標準モジュールに書いてる?
935 :
896 :2011/05/14(土) 20:10:22.32
>>933 そうですか。
excel2003から仕様が変わったということですかね。
>>934 はい。書いています。
XP,Excel2000だと色はかわらんな
>>935 何回かやってたら色が変わらなくなった。
VBエディタの実行ボタンを押すと変わるんだけど・・・
938 :
896 :2011/05/14(土) 20:15:49.05
>>937 あ、そういうことですか。
VBAエディタから実行させるとExcel2003でも、2010でも正常に動きます。
ワークシートから=hoge()ではどのバージョンでもダメみたいですね。。。
今北産業だが、なんかアフォがファビョってるなw なんかソートでおかしな比較論を展開してるやつなんなの? まず配列ありきなら配列をワークシートに書き出してソートするより、配列上でソートする方が速いわなぁ。 なぜなら配列のワークシートへの書き出しはコストがゼロじゃないからな。
とにかくワークシートのソートとクイックソート云々を言いだしたやつはアフォということで 糸冬了
そもそも配列のソートじゃなくて、
>>869 に対するExcelを使用した方法の提示なんだけども
>>938 関数は(あれば)引数を受け取って値を返すだけの機能
書式の変更等はできない仕様
Subのほうに書くしかない
943 :
896 :2011/05/14(土) 23:03:54.96
>>942 functionから書式変更するsubを別途呼んでもダメだったので、
そういう仕様なのかと疑っていましたが、やっぱり仕様だったんですね。
諦めてボタン等から起動して、チェックと書式変更する処理を流すようにでもしてみます。
レスくれた方々、ありがとうございました。
>>943 もう見てないかな?
これはたしかユーザー定義型の制約で仕方ない事だったと思ったべさ。
>>922 の人のが殆ど自分の考えと一緒だったけどちょっと違うのが、
変更された特定値をサーチするんじゃなくて、値の書き込み元の範囲を
最初に特定してしまって、その範囲外ならすぐに処理を抜けてしまえば
シート上の変更のたびに呼び出されても負担が少ないわさ。
たとえばシートのセル範囲にRng_TgtFromと言う名前を切って、これを
計算が反映される入力元の範囲とした場合、次の様にVBEのシートに書くべさ。
>>944 の続き
Private Sub Worksheet_Change(ByVal Target As Range)
Dim oRngTgtFrom As Range
Dim oRngTgtTo As Range
Dim oRngMono As Range
Set oRngTgtFrom = Range("Rng_TgtFrom")
If oRngTgtFrom.Row > Target.Row + Target.Rows.Count - 1 Or _
oRngTgtFrom.Row + oRngTgtFrom.Rows.Count - 1 < Target.Row Or _
oRngTgtFrom.Column > Target.Column + Target.Columns.Count - 1 Or _
oRngTgtFrom.Column + oRngTgtFrom.Columns.Count - 1 < Target.Column Then
Exit Sub
End If
Set oRngTgtTo = Range(Cells(Target.Row + Target.Rows.Count - 1, _
Target.Column + Target.Columns.Count - 1), _
Cells(oRngTgtFrom.Row, _
oRngTgtFrom.Column))
>>945 の続き
For Each oRngMono In oRngTgtTo
If oRngMono <> "" Then
oRngMono.Offset(0, 2).Value = "AAA"
oRngMono.Offset(0, 2).Interior.ColorIndex = 7
Else
oRngMono.Offset(0, 2).Value = ""
oRngMono.Offset(0, 2).Interior.ColorIndex = 0
End If
Next
End Sub
>>945 の続き
まず入力したセルが指定範囲内かチェックしてるわさ。
次に入力したセルが範囲内だった場合、指定範囲と入力された範囲の
被った部分を処理対象にするわさ。
で、処理対象範囲の中のセルを一個づつガラガラまわして値と色を設定してるわさ。
値の"AAA"と結果出力位置は適当に後で直して欲しいわさ。
インデントが取れたからかなり見辛くなったから
コピッてはっつけてインデント補正してから見てほしいわさ。
ぐはぁ、
>>944 でユーザー定義型とか言っちゃってるよ。
ユーザー定義関数の間違いね。ユーザー定義型って言ったら構造体のことになっちゃうわさ。
ユーザ定義関数の引数にRangeをとって、その関数を使うときに 色を変えるセルを引数に指定すれば良いんじゃねえかと思うんだが
えっ?
952 :
896 :2011/05/15(日) 11:54:30.92
>>947 改良案ありがとうございます。
たしかに範囲指定内でのみ処理が流れるようにすれば負荷を抑えられますね。
書いてもらったコードですが、名前付きセル内のセルの
値と書式を設定した場合は、設定時に再びworksheet_changeイベントが
発生しループするようだったので、私のほうでも方針は同じで、やり方を少し変えてみました。
Private Sub Worksheet_Change(ByVal Target As Range)
' "Rng_TgtFrom"セル内のみを処理対象とする
If Not Application.Intersect(Target, Range("Rng_TgtFrom")) Is Nothing Then
' "Rng_TgtFrom"セル内を書き換えたとき
' 再びWorksheet_Changeイベントが
' 発生しないようにイベント無効化
Application.EnableEvents = False
' 書式と値設定
Target.Interior.ColorIndex = 3
Target.Value = "aaa"
'イベント有効化
Application.EnableEvents = True
End If
End Sub
これなら私がやりたかったことにだいぶ近づきました。
ありがとうございます。
>>952 ちょっと待って、
今更だけどもうちょい考える余地がある事に気付いたべさ。
>>952 今更だけど条件付き書式を使ってやる方法も思いついたわさ。
複雑な条件で着色しなければいけないって話だったから、これもユーザー定義関数に
してしまって、出来るなら処理元を一緒にしてしまえば楽になるかな。こんな感じ。
Public Function hoge1(IN_str As String) As String
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge1 = IN_str
End Function
Public Function hoge2(IN_str As String) As Boolean
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge2 = bBool
End Function
Private Function hoge3(IN_str As String, IN_bool As Boolean)
IN_bool = False
If IN_str <> "" Then
IN_str = "aaa"
IN_bool = True
End If
End Function
シートのセルの数式からhoge1を呼び出す様にして、
同じセルの条件付き書式から数式でhoge2を呼び出す様に設定しとけば、
最初の1セルの設定は面倒だけど後はコピペで展開すれば
わざわざイベントの事を気にしないでも済むわさ。
まぁ、後は好みで使い分けるわさ。
955 :
896 :2011/05/15(日) 13:06:05.15
>>954 おお、条件付き書式にユーザ定義関数指定すれば確かにいけますね。
もしかし
>>898 の方はそういう意味で言ってくれていたのかも・・・^^;
これのほうが考え方としてはシンプルかもしれませんね。
この方法も検討してみます。どうもです。
956 :
949 :2011/05/15(日) 19:04:06.15
>>951 すまん。やってみたらできなかった
ユーザ定義関数でRangeさわると、どうもその段階で循環参照するっぽい
ということで代替案を考えた
まずクラスモジュール(updateclass)つくる
Public WithEvents App As Application
Public RangeToUpdate As Range
Public ColorToUpdate As Variant
Private Sub App_AfterCalculate()
If Not RangeToUpdate Is Nothing Then
RangeToUpdate.Interior.ColorIndex = ColorToUpdate
Set RangeToUpdate = Nothing
End If
End Sub
Private Sub Class_Initialize()
Set App = Application
End Sub
やってることはApplicationのAfterCalculateで色を設定する
設定する範囲をRangeToUpdateで
設定する色をColorToUpdateで指定する
つづく
957 :
949 :2011/05/15(日) 19:04:27.17
んで標準モジュール Dim upd As New updateclass Public Function hoge(color) Set upd.RangeToUpdate = Application.ThisCell upd.ColorToUpdate = color hoge = "aaa" End Function 必要なのはupdateclassのインスタンス作ること ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので 引数にRangeとる必要はなさそう hogeの引数に色指定できるようにしてるから ワークシートで=hoge(7)とか指定する
というかそこまで苦労してプログラム作るのって なんかVBAの本来の目的から外れてる気がしないでもない 本当に必要な要件なのか、その辺から見直しオススメw
>>957 >ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので
>引数にRangeとる必要はなさそう
その方法だと再計算後のイベントで拾って来て1セルしか処理していないから
一度計算式を入れたセルを、違う色に着色して複数セル選択してコピペしても
一つのセルしか色が変わらないんじゃないか?
つか関数でやるとセルをクリアしたとき塗りつぶし残ったままじゃん あと条件をチェックする前に塗りつぶしをクリアしないと
>>958 これが正論であるがゆえ、Word VBAは隆盛をみないんだよなw
Access VBAはともかく
>>959 複数セルコピペは試したけどちゃんと動いてる
ユーザ関数はセル単位で呼ばれてるはずだけど、そのたびに再計算してる模様
再計算方法を手動にしたらどうなるかって今ふと気になったがそこは知らん
>>963 Aftercalculateがどう言うイベントか知っていればそんな返事は返って来ないと思うんだが。
一度ヘルプで確認してからトレースでも確認しろ。
背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけじゃないのか?
これが業務なら、指摘されても気付かないでそのまま通して本番環境で発覚したりする訳だ。
それに要件的には差程難しい要件ではないと思うが。
自分でトリッキーに作って難易度を上げておいて要件のせいにするのはどうかと思うぞ。
>>964 >背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけ
これはその通りのようだ
で、何を要件のせいにしてるってんだ?
素直に作るとしてお前ならどう作るんだ?
いまだに「がなにか?」とかいう書き方するやつがいた
別にいいだろ
いまだに「がなにか?」とかいう書き方を普通にしますがなにか?
970 :
デフォルトの名無しさん :2011/05/16(月) 21:41:20.69
なんかきもい
971 :
デフォルトの名無しさん :2011/05/16(月) 22:42:01.64
きもすぎる
いまだに「きもい」とかいう書き方するやつがいた
はずい
しょすい
いまだに「いまだに」っていういまだにがいまだに
そうだに
なんだに
にーにー、にににーにー!
979 :
デフォルトの名無しさん :2011/05/18(水) 01:18:37.22
VBAでExcelの記載をHTMLに置き換える自動生成するプログラムを作っているのですが for文で処理ごとにcountを追加してそれが7になったら改行(=<tr>タグで囲む)と言う事をしたいのですが for文〜 'カウントが7の場合 If count = 7 Then txt = txt & "<tr>" End If txt = txt & "<td>" & Cells(i, 1) & "</td>" & count = count + 1 'カウントが7の場合 If count = 7 Then txt = txt & "</tr>" & vbNewLine count = 0 End If next 〜 If count = 7を2回書いて非常に不細工な記載になっているのですが もっと簡単な方法ってあるのでしょうか?
それをそのまま使うと If Count = 7 Then txt = txt & "<tr>" & "<td>" & Cells(i, 1) & "</td>" & "</tr>" & vbNewLine Count = 0 else txt = txt & "<td>" & Cells(i, 1) & "</td>" count = count + 1 End if
>>979 それおかしくない?TDがTRの外に出ちゃうよ?
こうだと思うんだけど
txt = txt & "<td>" & Cells(i, 1) & "</td>"
count = count + 1
If count = 7 Then
txt = "<tr>" & txt & "</tr>" & vbNewLine
count = 0
End If
おしえたがり大ハッスル
そして教えられないゴミが大嫉妬w
おれの場合はあらかじめ、 txt = "<table><tr>" 'としておいて For文〜 txt = txt & "<td>" & Cells(i, 1) & "</td>" If Count = 7 Then txt = txt & "</tr>" & vbNewLine & "<tr>" Count = 0 End if Next txt = txt & "</tr></table>" だな。
Do 【 until/while condition】←条件式? 【statements】←A ? 【exit do】 ←B ? 【statements】 loop 参考書に載ってるモデル図ですがAとBの個所が何を表わしてるのか わかりません(´・ω・。)教えてくださいです
do オプション なんか処理 loop これで条件達成するまでなんか処理を続ける 条件が不達だといわゆる無限ループ do オプション なんか処理1 ループ抜ける なんか処理2 loop これで無限ループからも抜けられる
もっと分かりやすい説明が必要だったか……
解りやすい解りにくい以前に間が抜けすぎだ その記述は無限ループを回避する為の手法じゃないしな ということは「バカ?」ではなく「マヌケ?」と言うべきだったかな?
何が言いたいのかは理解した が、どうでもいい 次スレまだー?
これは苦しいw
レスも読めないのに揚げ足とりして勝手に自爆するような方に中途半端に煽られても別に……
反応するってことは自覚はあったようだ
>>993 草生やすクズを一々相手にしてたら自分が嫌な気分になるから止めといた方がいいよ。
自分にレs(ry
ここまでお兄ちゃんの自演なの 新スレ欲しいなっ
やったね!
1000ならみんなが幸せに
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。