Excel VBA 質問スレ Part18

このエントリーをはてなブックマークに追加
759デフォルトの名無しさん
可能
760デフォルトの名無しさん:2011/05/07(土) 15:43:24.48
閉じずに隠せばいいんじゃね?
761デフォルトの名無しさん:2011/05/07(土) 17:02:35.28
俺の環境だと子供がいない
762758:2011/05/07(土) 17:10:52.62
答えていただきありがとうございます。隠すのは考えたのですが、ここの方ならもっとスタイリッシュな方法があるかと思いまして。何かヒントあれば教えてください。
763デフォルトの名無しさん:2011/05/07(土) 17:52:51.85
>>762
標準モジュールの変数に保持しておく方法と、
変数保持用のクラスを作ってそっちに保持しておく方法の2つを
いまパッと思いついたけど、どっちも似たようなもんだべさ。
どっちでもゲッタとセッタ作っとくと綺麗に見えるべさ。
764デフォルトの名無しさん:2011/05/07(土) 18:39:39.63
標準モジュールを使う方法だと、たとえば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

と記述してやると。

続く
765デフォルトの名無しさん:2011/05/07(土) 18:41:15.85
>>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に
閉じる前の内容が設定されているでしょ?これが標準モジュールを使ったやり方ね。
766デフォルトの名無しさん:2011/05/07(土) 18:49:46.46
おっと、Public Sub SetTextVal(IN_sTextVal)の所は引数がString型と言う事を
明示的に書いといた方がいいね。
Public Sub SetTextVal(IN_sTextVal As String)ね
767デフォルトの名無しさん:2011/05/07(土) 18:50:49.83
質問させてください。
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’: となります、どのように修正したらよろしいでしょうか?
768デフォルトの名無しさん:2011/05/07(土) 19:17:24.85
>>767
先と元のブックごっちゃになってね?
どっちかのブックに「テスト」「リスト」の名前があるシートが無いんでしょ
769デフォルトの名無しさん:2011/05/07(土) 19:25:33.14
>>767
まず、転記元.worlsheetsじゃでないべさ。

転記先.Worksheets("テスト").Activate
転記元.Worksheets("リスト").Activate

でやってみ。

それとActivateは何かしたら切り替わるから
あまり使わない方がいいと思うよ。
770デフォルトの名無しさん:2011/05/07(土) 19:41:31.12
>>768さん
シート名は確認しました。

>>769さん
やってみましたが、
転記先.Worksheets("テスト").Active
でエラーとなります。
転記元を指定するいい方法はありますか??
771デフォルトの名無しさん:2011/05/07(土) 19:44:53.95
>>770
おっちょこちょいさん。

「転記先.Worksheets("テスト").Active」じゃなくて
「転記先.Worksheets("テスト").Activate」だわさ。

Activeの部分をもう一度Activateに変えてやってみ?

それでダメならまた考えるわさ。
772デフォルトの名無しさん:2011/05/07(土) 19:56:12.09
>>771
失礼しました!
ご指摘の通りActivateにしたら上手く動きました。
ありがとうございました!
773772: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行ずつ挿入はできているのですが、オートフィルタの結果がコピーされません、
どこをどのように修正したらよろしいでしょうか?
774デフォルトの名無しさん:2011/05/07(土) 21:00:28.61
>>773
まだろくすっぽコード見たわけじゃないんだけど、
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) の、
一番最後のCells(Rows.Count, d)の列に指定しているdってこのソースでは何を設定しているか
見えないんだけど、何を設定しているの?
775デフォルトの名無しさん:2011/05/07(土) 21:12:56.29
>>774
dはあらかじめInputboxで指定しています。
776デフォルトの名無しさん:2011/05/07(土) 22:41:24.55
>>776
色々ある。正直いって何がやりたいのかが良く見えない。
まず、myvalueはどこで設定しているのかな?いや、どこかで設定していたとして、
Cells(Rows.Count, 3).Value = myvalueを行った後に行挿入を行おうとすると、
最終行に書き込んだそのデータはどうするのと怒られる筈。
後、Selection.AutoFilter Field:=16, Criteria1:="=" & myvalueの
Selectionは何を選択しているのか。まずここで項目名を指しているセルの範囲を
設定しなくてはならないのでは?
それとループの中でまたオートフィルタの絞り込みを行っているけど、1回の絞り込みでいいのか、
再度絞り込みたいのか。再度絞り込みたいなら一度絞り込みを解除してから
行わないと怒られるんじゃない?
本来これらのエラーが出ると思うんだけど、実際に出てないとすればオートフィルタ―自体の
範囲がちゃんと設定されていない可能性もあるね。
取り敢えずその辺から見直して見るといいんじゃないかな?


777デフォルトの名無しさん:2011/05/07(土) 22:46:53.56
おおぅ、自分にレスしてどーする。
>>776>>775へのレスね。
ちょっと疲れたべさ。暫く自分の方のAndroidの勉強するわ。
778デフォルトの名無しさん:2011/05/07(土) 23:04:10.79
まぁ要するに良く見えない。
779デフォルトの名無しさん:2011/05/07(土) 23:39:09.19
>>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列目等)は
どうすればできるのでしょうか??

分かりにくい文章、見にくいコードで申し訳ありません。
780デフォルトの名無しさん:2011/05/08(日) 00:02:10.73
本当に意地汚くて嫌いだ、自分。体も精神も恥ずかしい。
781デフォルトの名無しさん:2011/05/08(日) 00:28:12.81
>>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はオートフィルタ―で絞り込みの対象としてる列の横位置)
とかに変えてあげればいいんじゃないかな。
782デフォルトの名無しさん:2011/05/08(日) 00:32:09.70
おっと違うな。
Range(Cells(2, 3), Cells(Cells(Rows.Count, X).End(xlUp).Row, 6))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)か。
なんか疲れてるみたいだわ。
783779:2011/05/08(日) 01:01:11.56
>>782
ありがとうございます。
なんとかなりそうです。
助かりました!
784デフォルトの名無しさん:2011/05/08(日) 01:33:53.25
>>783
お役に立ててなによりだけど
もし自分の勉強の為じゃなくて仕事として作ってるなら、
転記先のシートに行を挿入する必要は本当にあるのか、
変数dはループの中で特にいじってないから貼られる先は常にいっしょじゃないのか、
なによりシートをアクティブにしてセル操作を行っているだけで、
どのブックのどのシートのどのセルを操作すると言う書き方をしてないから
操作的に非常に不安定じゃないかとか
まぁ色々あるからその辺を良く考えて作り直した方がいいと思う。
どうせ長いコードじゃないし。
785デフォルトの名無しさん:2011/05/08(日) 01:55:02.53
>>784
仕事で使用するために試行錯誤しながら作っています。
変数dと行の挿入はこの前にデータの整理や不要行・列の削除を
行っているため必要となっています。

ご指摘のようにシートやセルの操作は改善の余地が大ありと
思っています。

また分からないことがあれば質問させていただくので
機会があればご教示の程よろしくお願いします。
786デフォルトの名無しさん:2011/05/08(日) 16:12:04.37
>>773
あまり読んでないけど、
オートフィルタの結果のコピーは、
範囲.SpecialCells(xlCellTypeVisible).Copy
かな

でもVBAでオートフィルタ使うのは良くないと思う。
だから質問自体がナンセンス。

私なら転記元のデータを走査してヒットしたら、ひとつずつ転記先にコピー
していくか、collectionか何かに溜めてからまとめてコピーするかだな。
念のため、コピーと言ってもCopyメソッドを使うわけではないよ。
if ヒットしたら then
転記先.Cells(ヒットした分).Value=転記元.Cells(走査した分).Value
end if
787758:2011/05/08(日) 17:06:37.90

何度もすみません。
フォームを閉じた後も変数を保持しておく方法がまだ解決していません。
webをいろいろ見てみたのですが宣言セクションで宣言した変数はブックを閉じるまで値を保持し続ける
と書いてありやってみましたが上手くいきません。
763さんが言っている「標準モジュールの変数に保持しておく方法」
というのも調べてみましたがよくわかりませんでした。
本当に申し訳ありませんが、このようなやり方が記載されているweb
もしくは、コードを教えて頂けると助かります。
馬鹿な質問で申し訳ありません
788デフォルトの名無しさん:2011/05/08(日) 17:25:14.24
>>787
一番簡単なのはワークシートのセルに保存しておくかな

標準モジュールの宣言セクションでPublic で宣言した変数を
フォームで使うようにしたらどうなの
789デフォルトの名無しさん:2011/05/08(日) 17:33:07.26
790デフォルトの名無しさん:2011/05/08(日) 17:40:20.88
>>787
要するに変数のスコープという基本的な知識が抜けているんだよ
他にもプログラミングの基本的な知識が抜けすぎ

このまま先へ進めても分からないことだらけになってしまう
VBAでプログラミングの勉強をするのは困難すぎる
素直にCやJavaなどメジャーな言語の入門書を読めば必ず書いてある
791デフォルトの名無しさん:2011/05/08(日) 17:45:52.34
どうでもいいけどVBAの良著って悉く絶版だよね
VBAに限った話じゃないかも知れないけど
792デフォルトの名無しさん:2011/05/08(日) 17:54:57.33
>>790
そう思ってクラスモジュールを作ってやる方法を書かなかったんだけどなぁ。
プライベートとグローバルの宣言の違いさえ理解しててくれてればなぁ。
793デフォルトの名無しさん:2011/05/08(日) 18:00:15.50
クラスとかまじわかんね。


前に進められたVBのエラーコーディングはとても参考になった。
794デフォルトの名無しさん:2011/05/08(日) 18:13:33.03
C#のクラスは大体分かるが、VBAのはよく分からない不思議
MSも早く.NETに移行すればいいのに
795デフォルトの名無しさん:2011/05/08(日) 18:36:05.82
EXCELのVBAやVB6.0は構造化言語とオブジェクト指向型言語の狭間にいる言語だから仕方ないと言えば仕方ない。

オブジェクト指向型言語から入った人から見れば、このスレで書いてるコードとか見た時、
あー、破綻してるなコレと思う事が多々あるだろうし、
低級言語から入った人とかが見れば、
ぐはぁ、メモリが、処理コストがぁ〜と思う事も多いと思う。
でもま、時代の流れから見てもオブジェクト指向を取り入れて損はないと思うべさ。
796デフォルトの名無しさん:2011/05/08(日) 20:13:20.88
とにかく>>787の人にはまだちょっと
どんなクラスを作って、どこでインスタンスを生成して
どんな使い方をするのかを考えて組むのは>>970の人が言ってる通り多分まだ無理。
一度>>764-765に書いてある様に実際に打ち込んで走らせて流れを追ってほしいな。
それでも理解できなければカプセル化の概念が崩れるけど>>788の人が言ってるみたいに、
標準モジュールにPublicで宣言した変数に保持するのが手っ取り早いかな。
797デフォルトの名無しさん:2011/05/08(日) 20:26:45.17
質問させて下さい
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などで結構ですので、よろしければ教えて下さい。
798デフォルトの名無しさん:2011/05/08(日) 21:02:42.47
>>797

はい

n = Cells(1, 1)
For n = 1 To n
Cells(n, 2).Formula = "=VLOOKUP(E" & n & ",sheet2!A1:B100,2,FALSE)"
Next
799758: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です、よろしくお願いします。
801デフォルトの名無しさん:2011/05/08(日) 21:42:17.79
>>800
わざわざVBA使わんでも、ハイパーリンクじゃ駄目なの?
802デフォルトの名無しさん:2011/05/08(日) 21:52:04.38
>>801
目的からして処理が速くないと意味無いのでハイパーリンクじゃ駄目です
803デフォルトの名無しさん:2011/05/08(日) 21:53:26.35
>>802
開くってブラウザでか?
804デフォルトの名無しさん:2011/05/08(日) 21:54:43.51
>>803
Webクエリなのでブラウザは関係ないと思いますが
805デフォルトの名無しさん:2011/05/08(日) 21:55:56.30
ワークシートに展開する
テキストに流し込んでHTML作成
フォームのに描画する
webbrowserコントロールでブラウザ作る

梳きなのどうぞ
806デフォルトの名無しさん:2011/05/08(日) 22:01:03.81
>>799
なんか突貫工事っぽいけど、とりあえずは完成したのかな。
完成する前にとやかく言うのもアレだと思って言わなかったんだけど、
>>786の人の意見はごもっともだからね。初期の設計そのものに問題があるよ。
例えば私だったら後々抽出条件が複雑になる様な改修が入る事を想定して、
転記元のシートにSQL投げてRecordsetに値を取得して、それを転記先のシートに
展開する様な方法を視野に入れたと思う。
まぁ、実際そのツールの事を知ってる訳じゃないから何とも言えないけどね。
頑張ってね。
807デフォルトの名無しさん:2011/05/08(日) 22:16:21.38
>>804
マクロ記録でwebクエリ挿入したのを見るといいよ
808797:2011/05/08(日) 22:26:51.53
>>798
できました!
ありがとうございます。とても助かりました。
809デフォルトの名無しさん:2011/05/08(日) 22:52:47.00
>>800
こんなんでどう?適当だけど。

Option Explicit
Sub ChangeWebQueryRefer()
With ActiveSheet.QueryTables(1)
.Connection = "URL;" & Cells(1, 1)
.Refresh
End With
End Sub
810デフォルトの名無しさん:2011/05/08(日) 23:01:41.16
ああごめん、>>809は既になんかWebクエリが設定されていた後でA1に変更したい
URLを設定した場合ね。
811デフォルトの名無しさん:2011/05/08(日) 23:19:23.35
>>809
ありがとうございます,できました。
812797:2011/05/08(日) 23:21:47.69
たびたびごめんなさい・・・
>>798
で、関数中のEを変数nにしたがって移動させるにはどうしたらいいのでしょうか?
n=3のとき関数中のEをGにしたいのですができますでしょうか?
よろしくお願いします。
813デフォルトの名無しさん:2011/05/08(日) 23:28:24.23
>>812
よくわからんがifで条件分岐させるのじゃダメなの?
814デフォルトの名無しさん:2011/05/08(日) 23:38:17.20
>>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
815デフォルトの名無しさん:2011/05/08(日) 23:39:49.79
>>812
E列のアドレスから n-2 ぶんだけ下にOffsetしろ

ttp://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.offset(v=office.11).aspx
816797:2011/05/08(日) 23:40:54.19
>>814
ありがとうございます。しかし私の書き方が悪かったようで、nがいかなる数字の場合でもそれを加えた数だけ列を移動させたいのですが無理でしょうか?
817デフォルトの名無しさん:2011/05/08(日) 23:42:38.17
なんで1が先にWakeUpすんだ・・・
放物線の話しじゃないの。
818797:2011/05/08(日) 23:50:48.36
>>815
OFFSETでできました!
ありがとうございました。
819デフォルトの名無しさん:2011/05/09(月) 00:06:30.53
>>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
820デフォルトの名無しさん:2011/05/09(月) 00:08:04.09
>>818
なんだ、もう片付いちゃってたのね。
821デフォルトの名無しさん:2011/05/09(月) 04:55:51.31
RO浄水器をつければいいだけやろ
822デフォルトの名無しさん:2011/05/09(月) 15:02:27.04
テキストボックスが60個あって
入力する度に文字をチェックするプロシージャを作ってるんですけど、

PrivateSub TextBox1_Change
(略
PrivateSub TextBox2_Change
(略



と60個も並べたくなく、
一発で済む方法ないですか?
823デフォルトの名無しさん:2011/05/09(月) 16:34:09.59
TextBox(0)
コントロール配列ってVBAじゃ使えなかったっけ?
824デフォルトの名無しさん:2011/05/09(月) 16:37:06.78
VBAでコントロール配列は使えない

.Textプロパティに代入とかならControlsでも出来るけど
イベント取りたいとなるとコレクションとクラス使った疑似コントロール配列だな
825デフォルトの名無しさん:2011/05/09(月) 20:57:43.19
>>822
この手の質問定期的にきてうざいな

クラスモジュールを使えばできるから
自分で調べてみろ
826822:2011/05/09(月) 21:57:30.59
>>823-825
サンクス、「擬似コントロール配列」で検索してみたら出てきた。

ホントはChangeじゃなくAfterUpdateだからそんなに難しくなさそう。
頑張ってみるよ!
827デフォルトの名無しさん:2011/05/09(月) 22:08:54.50
朝鮮人に関わると こうなる見本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 以外
830デフォルトの名無しさん:2011/05/10(火) 14:53:04.75
>>829
釣りだな。ほらよ。

Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) = Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
831デフォルトの名無しさん:2011/05/10(火) 15:01:57.89
間違えた。ケツに.Valueでもくっ付けとけ。
832デフォルトの名無しさん:2011/05/10(火) 15:25:50.92

> Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
なんでわざわざこんな書き方してるの?釣り?
833デフォルトの名無しさん:2011/05/10(火) 16:01:43.67
お前ならどう書くっていいたいんだ?
834デフォルトの名無しさん:2011/05/10(火) 19:16:22.55
>>832は逃げたか。
釣り用のヘボいコードだと言う事までは分かったらしいが、
この程度のコードのどこがヘボいかまでは指摘できる脳みそを持ち合わせていなかったようだな。
835デフォルトの名無しさん:2011/05/10(火) 20:00:52.48
またアフォが暴れてるなw
Range(Cells(1,1),Cells(Rows.Count,Columns.Count))ってCellsと同じだわな
836デフォルトの名無しさん:2011/05/10(火) 21:44:45.24
質問です。
実は今マリオみたいなゲームを作ろうとしていますが、セルをドットの様に使って
横スクロールをした時、すぐに右端へたどり着いてしまいます。
擬似的に左右で永久にスクロール出来る様に見せかけたいのですが、どんな方法が有りますか?
又、その方法を使った時、最少のセルの横ピクセル数は何ピクセルくらいになりますか?
環境はWinXPのEXCEL2003です。
837デフォルトの名無しさん:2011/05/10(火) 21:49:42.97
>>836
セルを変化させる
838デフォルトの名無しさん:2011/05/10(火) 21:53:44.59
>>837
どの様にでしょうか
839デフォルトの名無しさん:2011/05/10(火) 21:59:49.19
>>836
右端に来たら下の方の行とか別のワークシートに移動させる
840デフォルトの名無しさん:2011/05/10(火) 22:15:16.95
>>839
なるほど、そうすると最低のセル横幅は256セルで2画面分になる様に設定すればいい訳ですね。
何となく目処が立ちました。ありがとうございます。
841デフォルトの名無しさん:2011/05/11(水) 00:09:22.41
>>830=>>833=>>834は、マジで>>835に気付いてなかったようだなw
この程度終わる話に「指摘できる脳みそ」なんて発想は出てこないから
Cells以外の何かを発想してたんだろうね。恥ずかしすぎるw
842デフォルトの名無しさん:2011/05/11(水) 03:29:31.49
VBAゲーム博物館にエクセルマリオがあるぜ
843デフォルトの名無しさん:2011/05/11(水) 08:05:41.61
やはり>>829は釣りだったな。
そして>>829,>>832,>>835,>>841は全て同一人物。
>>829で質問を投げといて、しょぼい答えが返って来るのを待って、返って来たらぶっ叩く。
それを楽しみにこのスレに来ている訳だ。
今回は煽りをくれてやって初めて反応したが、
やっぱりこいつがいつもスレが荒れる原因を作ってる奴だったんだな。
844デフォルトの名無しさん:2011/05/11(水) 08:42:56.73
どうでもいい荒らすな
845デフォルトの名無しさん:2011/05/11(水) 08:47:06.69
>>836
マシンスペックによって動作速度が違うゲームが出来上がりそうだなw
846デフォルトの名無しさん:2011/05/11(水) 09:05:15.88
>>843
相当悔しかったようだねw
847デフォルトの名無しさん:2011/05/11(水) 09:58:31.83
>>845
その辺はAPIを使ってwaitかけて統一するつもり。
余りにマシンスペックが低いのは見捨てる方向で。
848デフォルトの名無しさん:2011/05/11(水) 11:12:24.40
>>843
残念、その中に俺が一つ入ってるので全て同一人物ってのはハズレ
他3つが同一人物でも、少なくとも2人だ
俺の予想では質問者は別で、残り2つが同一人物で、計3人だな
849デフォルトの名無しさん:2011/05/11(水) 12:01:31.70
>>1からここまで全て俺の自演なんだ
>>484は気付いてないかも知れないが、君は俺の自演から生まれた人格なんだよ
さあ俺の元へ還れ
850デフォルトの名無しさん:2011/05/11(水) 13:21:31.46
俺は一つ書いてるんだが、まったくつまらん
851デフォルトの名無しさん:2011/05/11(水) 14:27:29.93
計算や抽出検索、転記などの機能ごとにモジュール分割したいのですが
UserFormの
CommandButton1_Click()
のようなものはユーザーフォームに直接記述して、
実行するものをcallするといった感じでしょうか?

それともUserFormには一切記述しないのでしょうか?

いまいち質問が分かりにくいかもしれませんが、よろしくお願いします。
852デフォルトの名無しさん:2011/05/11(水) 14:48:04.50
>>851
好きにしろ
マクロの実行からも選べる
853デフォルトの名無しさん:2011/05/11(水) 15:09:21.13
イベントは標準モジュールには丸ごと移動することは出来ないのでCallすることになるけど
クラスモジュールにならイベントごと移動することも可能

どちらを使うかは852も言うとおり「好きにしろ」で
854デフォルトの名無しさん:2011/05/11(水) 22:49:20.82
changeイベントの中でイベントの起因に
なったセルが、
ペーストされたのか、手入力されたのか、
分かる方法ない?
855デフォルトの名無しさん:2011/05/11(水) 22:53:07.59
>854
Target の個数が複数だとペースト1択だけど、1個だと・・・どうでしょうねえ
856デフォルトの名無しさん:2011/05/11(水) 23:10:56.00
>>855
ありがとう。
解決の方向性は見えました。
857デフォルトの名無しさん:2011/05/12(木) 13:09:51.16
行を一個飛ばしで選択する方法を教えてください
1、3、5、7、9、
といった感じです
858デフォルトの名無しさん:2011/05/12(木) 14:28:48.31
CTRLを押しながら選択する
859デフォルトの名無しさん:2011/05/12(木) 15:43:55.99
まず素数判定プログラムを作ります
セルにセットします
素数を一つ飛ばしで一致させるプログラムを作ります
配列にランダムソートで格納します
APIから時刻を取得し、データが枝と一致したら、シートから正規表現で該当セルを抜き出します
抜き出したセル番地を配列にセットします
IDEをインポートして、自コードを行を一つ飛ばしで選択出来るよう書き換えます
保存せずに終了させます
860デフォルトの名無しさん:2011/05/12(木) 16:18:03.69
>>858
>>859
お前ら優しいな
861デフォルトの名無しさん:2011/05/13(金) 23:15:03.00
ワークシートに配置したシェープから親オブジェクト(ワークシートオブジェクト)を取得しているプログラムがあるのですが、
別のパソコンでデバッグした場合、「Shapes」が取得される場合があります。

同じプログラムソースコードから取得した型の結果が違うのですが、
原因が掴めないです。

Debug.Print Typename(ActiveSheet.Shapes(0).Parent)

当パソコン→Worksheetが返されます。(正常結果)
別パソコン→Shapesが返されます。(異常結果)

何が違うのか教えていただけませんか。すみません。
862861:2011/05/13(金) 23:16:31.18
すいません。
両端末とも、
OS: Windows XP
オフィス:Excel 2007
です。
863デフォルトの名無しさん:2011/05/13(金) 23:57:24.55
>>862
当ててあるサービスパックが違うんじゃないの?
864861: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を動作させずにマクロを編集する方法をご教授願います。
866デフォルトの名無しさん:2011/05/14(土) 01:33:35.99
2007でも出来たと思うが
867デフォルトの名無しさん:2011/05/14(土) 02:21:46.89
Win XP + Office 2007で試してみた
たしかにShift押しながら起動でもAutoOpenは起動するね
回避方法は知らん
868デフォルトの名無しさん:2011/05/14(土) 02:29:29.19
>>865
直接フォルダからEXCELを開くんじゃ無くて、一度EXCELのアプリケーションを立ち上げてから
「ファイルタブ」の「開く」で開きたいブックを選択して、シフト押しながら「開く」ボタン押下で出来るわさ。多分。
869デフォルトの名無しさん:2011/05/14(土) 09:07:32.82
ついでに質問させて頂くわさ。

テーブルジャンプを行いたいです。

具体的には2つの動的な配列変数を用意して、一つの配列に処理順、もう一つの配列に
実行する関数のアドレスを設定して
その配列に設定された順序に関数を実行する処理を作りたいのです。

方法としては、スタックポインタが指しているアドレスの
関数戻りアドレス情報を次の呼び出し関数の呼び出しアドレス情報に書き換えてEnd Functionなり
End subなりを実行して行うか、または
なんらかしらのAPIでコールバックして行う方法を考えているんですけど、
取り敢えず配列に処理順序と関数の開始アドレスを設定する所までは上手くいったものの、
その後のいい方法がなかなか無いんです。

かといって適当に繰り返し処理や分岐でただの関数呼び出しを行ったんでは
処理コストが掛かり過ぎるのと、管理し辛いといった面から避けたい訳です。
特に今作っているのがゲームだから、処理コストは出来るだけ掛からない様にしたいのです。

何かいい方法はありませんか?
870デフォルトの名無しさん:2011/05/14(土) 09:19:24.42
>>869
スレ違い >>3★3,4
871デフォルトの名無しさん:2011/05/14(土) 09:27:50.00
>>870
別にAPIを使う方法じゃ無くても実現出来れば方法にこだわらないわさ。
何ですれ違いになるのかな?
872デフォルトの名無しさん:2011/05/14(土) 09:35:31.75
>>3の★3と★4読め
873デフォルトの名無しさん:2011/05/14(土) 09:41:37.13
>>872
まず★2を読んで欲しい。
それと、全体から見てVB6のUIでは遅すぎて考えた通りのゲームを作れ無いので、
EXCELのシートを使ってゲームを作成している。
その辺の処理速度を考慮しての話だからすれ違いでは無いよね。
874デフォルトの名無しさん:2011/05/14(土) 09:56:00.41
だから処理コスト、処理速度を考慮していくと、Excelは描写手段として使うだけで
その前の処理は全てExcel関係ない処理になるんだってば

それにVBAと比べれば、処理も描写もVB6の方が速いぞ
間違った方法取ってなければな
875デフォルトの名無しさん:2011/05/14(土) 10:03:13.88
まぁ余りダダを捏ねていてもスレが荒れそうなので引っ込むわさ。
でもいい方法が有ったら教えて欲しいなぁ。
876デフォルトの名無しさん:2011/05/14(土) 10:13:03.31
まあ、知ったか教えたがりは2chには多いから
スレ違いでも教えて貰える可能性は0ではないからな
877デフォルトの名無しさん:2011/05/14(土) 10:40:19.28
関数呼んだら、番号によってSelect-Caseした後、ジャンプすれば
ジャンプテーブルになるんじゃないかな。
878デフォルトの名無しさん:2011/05/14(土) 11:01:40.10
>>877
ありがとう。
その方法は一番最初に考えたんだけどやっぱり条件分岐なもんで
キャラクターの属性と動作ごとに処理分けを行うと相当数になるから
出来れば条件分岐ではなく、インデックスを与えてそれを実行する様な方法を取りたかったんですわ。
でも最悪、その方法を使う事にさせて頂きますわ。
本当にありがとうございます。

ただ、この話題はすれ違いらしいのでこの辺で。
879デフォルトの名無しさん:2011/05/14(土) 11:39:22.03
最悪の方法ならスレ違いじゃないなw
880865:2011/05/14(土) 12:14:03.44
>>866
>>867
>>868
回答ありがとうございます。
868さんの方法で試してみます。
881デフォルトの名無しさん:2011/05/14(土) 13:11:25.33
エクセルならシートに配列書き出してワークシートソートすれば早かろう
これならスレ違いにもならぬ
882デフォルトの名無しさん:2011/05/14(土) 13:33:22.78
えっ?
883デフォルトの名無しさん:2011/05/14(土) 13:47:20.50
ワークシートソートの方が速いって
余程ヘボいソートアルゴリズム使ってるんですねw
884デフォルトの名無しさん:2011/05/14(土) 15:07:03.41
>>883がワークシートのソートやクイックソートより超っ速いコードを公開してくれるそうなので楽しみに待ちましょう
885デフォルトの名無しさん:2011/05/14(土) 15:22:00.68
嫌味のつもりで言ってるのだろうけど、その辺に転がってる物を
「公開してくれるそうなので楽しみに待ちましょう」とか、バカっぽすぎて吹いた。
886デフォルトの名無しさん:2011/05/14(土) 15:31:45.02
>>885
自分が馬鹿なんだと気づいてね
887デフォルトの名無しさん:2011/05/14(土) 15:38:19.03
そのうち気付くだろう
その言葉は自分にこそ相応しかったと
888デフォルトの名無しさん:2011/05/14(土) 16:04:11.35
このスレで語尾に草生やす奴は総じて口だけのヘタレだよね
889デフォルトの名無しさん:2011/05/14(土) 16:21:48.50
草1つの場合はそうでもなかったな。
草複数生やす奴は総じて口だけのヘタレだったけど。
890デフォルトの名無しさん:2011/05/14(土) 16:23:03.39
単芝死ね
891デフォルトの名無しさん:2011/05/14(土) 16:34:18.94
悔しかったんだね
892デフォルトの名無しさん:2011/05/14(土) 16:39:24.58
悔しいです(`皿´)
893デフォルトの名無しさん:2011/05/14(土) 17:35:13.84
単芝が糞かどうかは>>883がコード晒せるかどうかにかかっているのか。
責任重大だな。
894デフォルトの名無しさん:2011/05/14(土) 17:51:56.85
>>893
ヒント:>>885
895デフォルトの名無しさん:2011/05/14(土) 18:08:06.89
>>894
なるほど、クイックソートより超っ速いのがその辺に転がっているとか言ってる時点で
察しろよ、言わせんな恥ずかしいって事か。やっぱり語尾に草生やす奴は総じて駄目か。
896デフォルトの名無しさん:2011/05/14(土) 18:08:30.38
関数を指定したセルに文字を設定しつつ、
着色もしたいのですが、下記のユーザ定義関数では
#VALUE!になってしまいます。

Public Function hoge()

ActiveCell.Interior.colorIndex = 3
hoge = "aaa"

End Function

どのようにすれば実現できますか?

Windows7、Excel2010です
897デフォルトの名無しさん:2011/05/14(土) 18:10:48.62
>>896
うーんそれ関数?
898デフォルトの名無しさん:2011/05/14(土) 18:25:13.42
>>896
ユーザー定義関数内で着色しようとしてるからじゃない?
条件付き書式で代用すれば?
899デフォルトの名無しさん:2011/05/14(土) 18:28:26.26
>>897
どういった意味でしょうか?

>>898
実際には複雑な条件チェックをして
その結果によって着色するかしないか
を決めたいので条件付き書式では難しいんです。
900デフォルトの名無しさん:2011/05/14(土) 18:35:25.45
>>895
なんか曲解してるな
言い負かされて悔しいからわざとねじ曲げて解釈して憎まれ口叩いてるのか?
901デフォルトの名無しさん:2011/05/14(土) 18:47:14.93
>>900
俺からして見ればコード挙げられずに顔真っ赤にして必死に書き込んでいる
お前の方がよっぽど悔しそうに見える訳だが。

Wikipediaのソートに関して
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88

どのソートが一般的に一番早いと言われているか
自分で確認してからコード晒してくれな。
902デフォルトの名無しさん:2011/05/14(土) 18:52:54.87
>>899
関数にしてどうしたいの?
903デフォルトの名無しさん:2011/05/14(土) 18:54:43.96
ワークシートソート(並べ替え機能)との比較が
いつのまにかクイックソートとの比較になってる

悔しさのあまり顔真っ赤にして必死になってると、
こうやって話が明後日の方向に飛んでいってしまうのかな?
904デフォルトの名無しさん:2011/05/14(土) 18:58:07.42
もうやめて!
あたしのためにこれ以上争わないで!
905デフォルトの名無しさん:2011/05/14(土) 19:02:45.04
>>903
プッ
今頃何言ってるのかな。逃げに入っちゃったかな?
>>884の発言の後で>>885でその辺に転がっているって言ってるよな。
ほら、その辺に転がっているならとっとと挙げてみれば?
人の言ってる事オウム返しにしか言えない奴にはちょっと厳しい?
906デフォルトの名無しさん:2011/05/14(土) 19:07:05.93
セルに自作関数を使って制御したいんだろうけど
907デフォルトの名無しさん:2011/05/14(土) 19:08:59.36
あらら、勘違いを突かれて壊れちゃった?

本当に逃げてるなら、逃げてると言われるのは痛いところだろうが
逃げに入ったとか、ちょっと厳しいとか言われたところで
根本を勘違いしてる奴の言葉じゃ滑稽なだけで煽りにもなってないもんな
908デフォルトの名無しさん:2011/05/14(土) 19:16:53.09
>>907
あーあ、完全に逃げたな。
結局根本とか何とかウダウダ言ってその辺に
転がっているって自分で言ってたコードも晒せないんだもんな。
やっぱり草生やす奴は総じて糞と言うことが確定したな。
909デフォルトの名無しさん:2011/05/14(土) 19:17:36.04
今どういう話なのか三行で
910デフォルトの名無しさん:2011/05/14(土) 19:19:14.58
ワークシートソート(並べ替え機能)より速いソートがあるとしか言ってないんだから
ワークシートソート(並べ替え機能)より速いソートを晒せば納得するのか?
911デフォルトの名無しさん:2011/05/14(土) 19:20:42.42
912デフォルトの名無しさん:2011/05/14(土) 19:23:40.28
>>896
ひょっとして文字を設定するという部分は
hoge = "aaa"
の部分?
913デフォルトの名無しさん:2011/05/14(土) 19:23:56.05
>>909
ワークシートソート(並べ替え機能)より速いソートがあると言ったら>>883
クイックソートより超っ速いコードを公開してくれる>>884
といきなり一言も出してないクイックソートにすげ替えたバカが粘着中
914デフォルトの名無しさん:2011/05/14(土) 19:26:25.56
>>910
ハァ?
それじゃ>>884に対する>>885の発言の解になってないだろ。
ちゃんと自分でクイックソートより速い奴がその辺に転がっているって
言ってるんだからそれを晒せばいいだけじゃないか。何か問題でもあるのか?
915デフォルトの名無しさん:2011/05/14(土) 19:27:15.72
君たち!頭悪そうだからやめておきなさい(^^;
916デフォルトの名無しさん:2011/05/14(土) 19:27:32.07
worksheet chengeを使ってターゲットを自動で変更すりゃいいかなと思ったけど
これうまくいかねえな
917896:2011/05/14(土) 19:29:19.59
>>912
そうです。

セルに =hoge() と入れたら、そのセルに"aaa"と設定した上で着色したいんです。
918デフォルトの名無しさん:2011/05/14(土) 19:30:11.40
速さが知りたいだけならこことか
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800.html
919デフォルトの名無しさん:2011/05/14(土) 19:34:01.38
>>917
Public Function hoge(str As String)

ActiveCell.Interior.colorIndex = 3
ActiveCell=str

End Function
920デフォルトの名無しさん:2011/05/14(土) 19:34:21.01
そもそもVBAエディタに書いたコードをワークシートから呼べるの?
921デフォルトの名無しさん:2011/05/14(土) 19:36:08.83
>>914
自分の発言には責任持つけど、バカの曲解にまでは責任持てませんぜ

俺が書いたのは
「ワークシートソート(並べ替え機能)より速いソートがある」
と、それに対して公開しろ的なレスがあったので
「(自分があると書いたワークシートソートより速いソートは)その辺に転がってる」
だけだ

「クイックソートより超っ速いコードがあると言ってるなんて曲解してるバカがいるが
それについてもその辺に転がってるぜ」
なんてことは書いた覚えは無い
922デフォルトの名無しさん:2011/05/14(土) 19:36:37.53
>>917
ワークシートにこれを書けば

Const ConstTargetStr = "=hoge()"

Private Sub Worksheet_Change(ByVal Target As Range)
'シート上のどっかが書き換わったらConstTargetStrを探し出す
'探し出したセルに"aaa"を代入して色を変更するプログラム
End Sub
923デフォルトの名無しさん:2011/05/14(土) 19:38:19.66
>>920
は?
924デフォルトの名無しさん:2011/05/14(土) 19:38:35.39
>>918
なんだ、僅差でクイックソートよりワークシートのソートメソッド使った方が速いのか。
これは>>921はどう言い訳するんだろうな。
じゃあ「ワークシートソート(並べ替え機能)より速いソートがある」のを晒してくれればいいや。
ちょっと楽しみ。
925デフォルトの名無しさん:2011/05/14(土) 19:41:42.44
俺から見ればどっちも
「ワークシートソートなんてクソ」
って言ってるように見えたが
926デフォルトの名無しさん:2011/05/14(土) 19:42:44.73
>>925
どのレスを見て?
927デフォルトの名無しさん:2011/05/14(土) 19:43:18.73
>>923
うわーこんな事できるの知らなかったわ><
928896:2011/05/14(土) 19:43:58.95
>>919
やってみましたが、#VALUE!になってしまいます。

>>920
呼べます。
それをユーザ定義関数と呼ぶらしいです。たぶん。

>>922
これでも要件を満たせますが、
実際にやりたい処理はもっと複雑なので、
シート上の変更のたびに呼び出されてしまうのは、
避けたいです。
929デフォルトの名無しさん:2011/05/14(土) 19:48:14.19
>>924
ほれ http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006081601.htm:0.737s
ワークシートソート:0.861s
930デフォルトの名無しさん:2011/05/14(土) 19:49:18.22
>>926
>>882以降全部

>>928
あはい
自作関数も呼び出しで言えばおんなじようなもんだけどご自由に
931デフォルトの名無しさん:2011/05/14(土) 19:56:28.46
>>928
こちらの Win2000, Excel2000 では
以下のコードでおkだった

Public Function hoge()
ActiveCell.Interior.ColorIndex = 7
hoge = "aaa"
End Function
932896:2011/05/14(土) 20:05:01.64
>>931
色も変わりました?
WinXP、Excel2003もあるので、それで試してみました。
#VALUE!にはならないですが、色がかわりませんでした。
933デフォルトの名無しさん:2011/05/14(土) 20:06:30.47
>>932
色も変わりますよ。
934デフォルトの名無しさん:2011/05/14(土) 20:06:52.89
そのhogeはちゃんと標準モジュールに書いてる?
935896:2011/05/14(土) 20:10:22.32
>>933
そうですか。
excel2003から仕様が変わったということですかね。

>>934
はい。書いています。
936デフォルトの名無しさん:2011/05/14(土) 20:11:21.43
XP,Excel2000だと色はかわらんな
937デフォルトの名無しさん:2011/05/14(土) 20:12:52.55
>>935
何回かやってたら色が変わらなくなった。
VBエディタの実行ボタンを押すと変わるんだけど・・・
938896:2011/05/14(土) 20:15:49.05
>>937
あ、そういうことですか。
VBAエディタから実行させるとExcel2003でも、2010でも正常に動きます。
ワークシートから=hoge()ではどのバージョンでもダメみたいですね。。。
939デフォルトの名無しさん:2011/05/14(土) 20:27:17.11
今北産業だが、なんかアフォがファビョってるなw
なんかソートでおかしな比較論を展開してるやつなんなの?
まず配列ありきなら配列をワークシートに書き出してソートするより、配列上でソートする方が速いわなぁ。
なぜなら配列のワークシートへの書き出しはコストがゼロじゃないからな。
940デフォルトの名無しさん:2011/05/14(土) 20:43:17.75
とにかくワークシートのソートとクイックソート云々を言いだしたやつはアフォということで
糸冬了
941デフォルトの名無しさん:2011/05/14(土) 20:46:10.74
そもそも配列のソートじゃなくて、
>>869に対するExcelを使用した方法の提示なんだけども
942デフォルトの名無しさん:2011/05/14(土) 22:07:24.26
>>938
関数は(あれば)引数を受け取って値を返すだけの機能
書式の変更等はできない仕様
Subのほうに書くしかない
943896:2011/05/14(土) 23:03:54.96
>>942
functionから書式変更するsubを別途呼んでもダメだったので、
そういう仕様なのかと疑っていましたが、やっぱり仕様だったんですね。


諦めてボタン等から起動して、チェックと書式変更する処理を流すようにでもしてみます。
レスくれた方々、ありがとうございました。
944デフォルトの名無しさん:2011/05/14(土) 23:44:07.49
>>943
もう見てないかな?
これはたしかユーザー定義型の制約で仕方ない事だったと思ったべさ。
>>922の人のが殆ど自分の考えと一緒だったけどちょっと違うのが、
変更された特定値をサーチするんじゃなくて、値の書き込み元の範囲を
最初に特定してしまって、その範囲外ならすぐに処理を抜けてしまえば
シート上の変更のたびに呼び出されても負担が少ないわさ。

たとえばシートのセル範囲にRng_TgtFromと言う名前を切って、これを
計算が反映される入力元の範囲とした場合、次の様にVBEのシートに書くべさ。
945デフォルトの名無しさん:2011/05/14(土) 23:46:29.37
>>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))
946デフォルトの名無しさん:2011/05/14(土) 23:47:57.42
>>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
947デフォルトの名無しさん:2011/05/14(土) 23:59:48.52
>>945の続き

まず入力したセルが指定範囲内かチェックしてるわさ。

次に入力したセルが範囲内だった場合、指定範囲と入力された範囲の
被った部分を処理対象にするわさ。

で、処理対象範囲の中のセルを一個づつガラガラまわして値と色を設定してるわさ。

値の"AAA"と結果出力位置は適当に後で直して欲しいわさ。

インデントが取れたからかなり見辛くなったから
コピッてはっつけてインデント補正してから見てほしいわさ。
948デフォルトの名無しさん:2011/05/15(日) 00:24:17.64
ぐはぁ、>>944でユーザー定義型とか言っちゃってるよ。
ユーザー定義関数の間違いね。ユーザー定義型って言ったら構造体のことになっちゃうわさ。
949デフォルトの名無しさん:2011/05/15(日) 04:36:24.95
ユーザ定義関数の引数にRangeをとって、その関数を使うときに
色を変えるセルを引数に指定すれば良いんじゃねえかと思うんだが
950デフォルトの名無しさん:2011/05/15(日) 08:02:20.85
えっ?
951デフォルトの名無しさん:2011/05/15(日) 10:36:16.75
>>949
やってみてから言えば?
952896: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

これなら私がやりたかったことにだいぶ近づきました。
ありがとうございます。
953デフォルトの名無しさん:2011/05/15(日) 12:08:15.55
>>952
ちょっと待って、
今更だけどもうちょい考える余地がある事に気付いたべさ。
954デフォルトの名無しさん:2011/05/15(日) 12:26:43.23
>>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セルの設定は面倒だけど後はコピペで展開すれば
わざわざイベントの事を気にしないでも済むわさ。
まぁ、後は好みで使い分けるわさ。
955896:2011/05/15(日) 13:06:05.15
>>954
おお、条件付き書式にユーザ定義関数指定すれば確かにいけますね。
もしかし>>898の方はそういう意味で言ってくれていたのかも・・・^^;

これのほうが考え方としてはシンプルかもしれませんね。

この方法も検討してみます。どうもです。
956949: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で指定する

つづく
957949: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)とか指定する
958デフォルトの名無しさん:2011/05/15(日) 20:18:50.35
というかそこまで苦労してプログラム作るのって
なんかVBAの本来の目的から外れてる気がしないでもない

本当に必要な要件なのか、その辺から見直しオススメw
959デフォルトの名無しさん:2011/05/15(日) 20:31:17.58
>>957
>ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので
>引数にRangeとる必要はなさそう

その方法だと再計算後のイベントで拾って来て1セルしか処理していないから
一度計算式を入れたセルを、違う色に着色して複数セル選択してコピペしても
一つのセルしか色が変わらないんじゃないか?
960デフォルトの名無しさん:2011/05/15(日) 20:37:16.18
つか関数でやるとセルをクリアしたとき塗りつぶし残ったままじゃん
あと条件をチェックする前に塗りつぶしをクリアしないと
961デフォルトの名無しさん:2011/05/15(日) 20:51:45.22
ま、>>958が正解だな
962デフォルトの名無しさん:2011/05/15(日) 22:09:09.26
>>958
これが正論であるがゆえ、Word VBAは隆盛をみないんだよなw
Access VBAはともかく
963デフォルトの名無しさん:2011/05/16(月) 03:55:56.12
>>959
複数セルコピペは試したけどちゃんと動いてる
ユーザ関数はセル単位で呼ばれてるはずだけど、そのたびに再計算してる模様
再計算方法を手動にしたらどうなるかって今ふと気になったがそこは知らん
964デフォルトの名無しさん:2011/05/16(月) 12:52:35.59
>>963
Aftercalculateがどう言うイベントか知っていればそんな返事は返って来ないと思うんだが。
一度ヘルプで確認してからトレースでも確認しろ。
背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけじゃないのか?
これが業務なら、指摘されても気付かないでそのまま通して本番環境で発覚したりする訳だ。
それに要件的には差程難しい要件ではないと思うが。
自分でトリッキーに作って難易度を上げておいて要件のせいにするのはどうかと思うぞ。
965デフォルトの名無しさん:2011/05/16(月) 16:59:57.44
>>964
>背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけ
これはその通りのようだ
で、何を要件のせいにしてるってんだ?
素直に作るとしてお前ならどう作るんだ?
966デフォルトの名無しさん:2011/05/16(月) 18:00:13.48
>>965
俺の意見は>>898で既に述べているが何か?
967デフォルトの名無しさん:2011/05/16(月) 20:57:41.99
いまだに「がなにか?」とかいう書き方するやつがいた
968デフォルトの名無しさん:2011/05/16(月) 21:00:34.43
別にいいだろ
969デフォルトの名無しさん:2011/05/16(月) 21:23:29.60
いまだに「がなにか?」とかいう書き方を普通にしますがなにか?
970デフォルトの名無しさん:2011/05/16(月) 21:41:20.69
なんかきもい
971デフォルトの名無しさん:2011/05/16(月) 22:42:01.64
きもすぎる
972デフォルトの名無しさん:2011/05/16(月) 23:09:53.99
いまだに「きもい」とかいう書き方するやつがいた
973デフォルトの名無しさん:2011/05/16(月) 23:11:10.78
はずい
974デフォルトの名無しさん:2011/05/16(月) 23:19:28.81
しょすい
975デフォルトの名無しさん:2011/05/16(月) 23:59:33.76
いまだに「いまだに」っていういまだにがいまだに
976デフォルトの名無しさん:2011/05/17(火) 17:10:44.71
そうだに
977デフォルトの名無しさん:2011/05/17(火) 23:16:49.04
なんだに
978デフォルトの名無しさん:2011/05/17(火) 23:19:14.42
にーにー、にににーにー!
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回書いて非常に不細工な記載になっているのですが
もっと簡単な方法ってあるのでしょうか?
980デフォルトの名無しさん:2011/05/18(水) 01:35:08.37
それをそのまま使うと

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

981デフォルトの名無しさん:2011/05/18(水) 03:42:36.32
>>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
982デフォルトの名無しさん:2011/05/18(水) 07:32:17.40
おしえたがり大ハッスル
983デフォルトの名無しさん:2011/05/18(水) 07:55:23.67
そして教えられないゴミが大嫉妬w
984デフォルトの名無しさん:2011/05/18(水) 08:25:17.55
おれの場合はあらかじめ、

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>"

だな。
985デフォルトの名無しさん:2011/05/18(水) 10:26:36.03
Do 【 until/while condition】←条件式?

【statements】←A ?
【exit do】  ←B ?
【statements】

loop

参考書に載ってるモデル図ですがAとBの個所が何を表わしてるのか
わかりません(´・ω・。)教えてくださいです

986デフォルトの名無しさん:2011/05/18(水) 10:45:59.19
>>985
つヘルプ
987デフォルトの名無しさん:2011/05/18(水) 10:56:21.08
do オプション
なんか処理
loop

これで条件達成するまでなんか処理を続ける
条件が不達だといわゆる無限ループ

do オプション
なんか処理1
ループ抜ける
なんか処理2
loop

これで無限ループからも抜けられる
988デフォルトの名無しさん:2011/05/18(水) 13:26:39.24
>>987
バカ?
989デフォルトの名無しさん:2011/05/18(水) 14:25:43.42
もっと分かりやすい説明が必要だったか……
990デフォルトの名無しさん:2011/05/18(水) 14:48:54.58
解りやすい解りにくい以前に間が抜けすぎだ
その記述は無限ループを回避する為の手法じゃないしな

ということは「バカ?」ではなく「マヌケ?」と言うべきだったかな?
991デフォルトの名無しさん:2011/05/18(水) 15:28:46.38
何が言いたいのかは理解した
が、どうでもいい

次スレまだー?
992デフォルトの名無しさん:2011/05/18(水) 15:58:13.21
これは苦しいw
993デフォルトの名無しさん:2011/05/18(水) 16:06:31.68
レスも読めないのに揚げ足とりして勝手に自爆するような方に中途半端に煽られても別に……
994デフォルトの名無しさん:2011/05/18(水) 16:11:45.45
反応するってことは自覚はあったようだ
995デフォルトの名無しさん:2011/05/18(水) 16:19:51.78
>>993
草生やすクズを一々相手にしてたら自分が嫌な気分になるから止めといた方がいいよ。
996デフォルトの名無しさん:2011/05/18(水) 16:22:50.64
自分にレs(ry
997デフォルトの名無しさん:2011/05/18(水) 17:03:46.10
ここまでお兄ちゃんの自演なの

新スレ欲しいなっ
998デフォルトの名無しさん:2011/05/19(木) 06:40:21.69
取り敢えず立てたので誘導させて頂くわさ。

Excel VBA 質問スレ Part19
http://hibari.2ch.net/test/read.cgi/tech/1305754555/l50
999デフォルトの名無しさん:2011/05/19(木) 10:10:39.25
やったね!
1000デフォルトの名無しさん:2011/05/19(木) 10:18:18.41
1000ならみんなが幸せに
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。