Excel VBA 質問スレ Part18

このエントリーをはてなブックマークに追加
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。