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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。