トップページtech
1001コメント373KB

Excel VBA質問スレ Part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/08/25(月) 23:16:33
ExcelのVBAに関する質問スレです

前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
04864812008/10/11(土) 12:15:07
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。
【モジュール】
Private Foo As Integer
public sub Bar(Baz As Integer)
Foo = Baz
End Sub

【フォーム】
Private Sub TextBox1_Change()
On Error Goto Err
If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then
Call Bar(TextBox1.Text)
Else
TextBox1.Text = ""
End If
Err:
If Err.Number <> 0 Then
● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。
End If
End Sub
0487デフォルトの名無しさん2008/10/11(土) 12:45:27
ByRef渡しでもVBAの方でうまくやってくれたっけ?
0488デフォルトの名無しさん2008/10/11(土) 14:52:03
>>486
だからOn Error外せって
0489デフォルトの名無しさん2008/10/11(土) 16:23:17
>>485
>>483-484は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな
04904792008/10/11(土) 17:48:11
キーワードを変えてググってみても見つけられなかった。
VBAからソートプロパティを取得する方法は無いのでしょうか?
0491デフォルトの名無しさん2008/10/11(土) 18:52:51
>>486

テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。
0492デフォルトの名無しさん2008/10/11(土) 19:03:24
>>490
> キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>

ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・
0493デフォルトの名無しさん2008/10/11(土) 19:10:50
>492
これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。
なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
0494デフォルトの名無しさん2008/10/11(土) 20:58:41
>>479
単純にセルの値取得すればいいだけじゃないの??
0495デフォルトの名無しさん2008/10/11(土) 23:01:15
OS: WindowsXP
Excel: 2007

チャートの目盛線のスタイルを「破線」にしたいと思っていますが、
以下のようなコードを実行しても、「長破線」になってしまいます。

ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash

LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を
すべて試しましたが、やはり破線にはなりませんでした。
今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。
VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
0496デフォルトの名無しさん2008/10/12(日) 00:38:29
エクセル2002 ウインドウズxp で質問!

@列を選択
AダイアログBoxに文字を入れ検索
B検索にヒットしたセルの左のセルに*を入力

具体例
@’D列・F列を選択
A’ダイアログBOXに検索したい文字 イロハ を入力
B’ イロハニホ が入力されてるセルD1の左C1と
  アイロノカニ が入力されてるセルF3の左E3に*を入力

この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。
詳しい方、コードを教えて下さい m( )m

この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
0497デフォルトの名無しさん2008/10/12(日) 05:46:19
置換でいいじゃんd
0498デフォルトの名無しさん2008/10/12(日) 07:07:43
>>496
先に総合相談所にも謝って来いよ
04994792008/10/12(日) 13:44:23
>>493
おっしゃる通り、ソートの設定状態を参照したいのです。

Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。
0500デフォルトの名無しさん2008/10/12(日) 16:54:02
>499
で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
0501デフォルトの名無しさん2008/10/12(日) 17:29:28
>>500
シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。

実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。
05025002008/10/12(日) 19:23:34
>501
シートAは手動でソートするんですか? シートAのソートをマクロで実行して、
その際のパラメータをデータブックに記録しておけばどうですか?
シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように
したらいいのでは?
0503デフォルトの名無しさん2008/10/12(日) 22:26:40
シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて
ソートされる事も想定が必要です。

プログラムブックからデータブックを開いて、データブックに定義されている
内容によりデータブックのアクティブシートを編集しています。
データブック側にはVBAコード等の記述は不要であり、プログラムブック側に
VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を
行っています。
データブックは任意のxlsファイルが指定できます。
0504デフォルトの名無しさん2008/10/12(日) 23:42:02
誰か早く無理だって言ってやれよ
0505デフォルトの名無しさん2008/10/13(月) 00:01:29
無理です
05065032008/10/13(月) 00:02:44
自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示
(Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第
です。
Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。
諦めかな...
0507デフォルトの名無しさん2008/10/13(月) 00:27:16
無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあb驍ニは限らない=B
0508デフォルャgの名無しさん2008/10/13(月) 00:35:54
二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?
0509デフォルトの名無しさん2008/10/13(月) 00:46:52
無理です
0510デフォルトの名無しさん2008/10/13(月) 01:40:17
ExcelVBAの関数のコールグラフを作成してくれるツールってある?
ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
0511デフォルトの名無しさん2008/10/13(月) 14:36:23
フォルダにある複数の報告書のファイル名を変更したいのですが
方法を知っている方おられませんか?

報告書(Aさん)→済_報告書(Aさん)
報告書(Bさん)→済_報告書(Bさん)
報告書(Cさん)→済_報告書(Cさん)

上記のように
()内の名前が変わってもファイル名を

報告書()→済_報告書()

と変更できる方法を探しています。

何か良い方法を知っている方がいれば教えて頂けないでしょうか?
お願いします。
0512デフォルトの名無しさん2008/10/13(月) 15:12:43
ファイル名を fileName As String とすると、
まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、
fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")"
って感じ?
0513デフォルトの名無しさん2008/10/13(月) 16:40:36
>>511
スレ違い
ファイル名変更ぐらいならRENコマンドでできる。
05145122008/10/13(月) 17:50:21
この条件だと、wsh使わないと一寸厳しいとは思う。
というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの? >>511
0515デフォルトの名無しさん2008/10/13(月) 18:51:55
>>1
0516デフォルトの名無しさん2008/10/13(月) 18:58:06
>>511
Name ステートメント
0517デフォルトの名無しさん2008/10/13(月) 19:15:55
>>514さん
返信遅くなってすみません
レス有難うございます。

>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。

>>513>>515さん
スレ違いでしたか、すみませんでした。
0518デフォルトの名無しさん2008/10/13(月) 20:08:55
>>506
xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。
0519デフォルトの名無しさん2008/10/13(月) 21:24:53
何がわからないのかわからなかった
0520デフォルトの名無しさん2008/10/13(月) 21:42:57
なんでわかってもらえないのかがわからない
0521デフォルトの名無しさん2008/10/13(月) 22:54:48
なんでわかってもらえると思えるのかがわからない
0522デフォルトの名無しさん2008/10/14(火) 10:15:24
>>506
ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・

ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
0523500,5022008/10/14(火) 13:13:28
>506
522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
05245062008/10/14(火) 13:22:48
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。
出直します。orz
0525デフォルトの名無しさん2008/10/14(火) 16:26:52
なんで強制的にソートしちゃいけないのかな
Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう

ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし
0526デフォルトの名無しさん2008/10/14(火) 16:57:54
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。
文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。
05275062008/10/14(火) 17:42:10
>>525
説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。

0528デフォルトの名無しさん2008/10/14(火) 18:03:14
>>526
バージョン差あるかもだけど、option compare は?

>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね
0529デフォルトの名無しさん2008/10/14(火) 19:03:09
>>526
その「ソート」って何の事よ
0530デフォルトの名無しさん2008/10/14(火) 19:35:11
>>527
だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
0531デフォルトの名無しさん2008/10/14(火) 19:36:19
そぅっとしてやってくれ。
0532デフォルトの名無しさん2008/10/14(火) 21:16:22
早野乙
0533デフォルトの名無しさん2008/10/14(火) 21:58:59
>526
自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。
ヘルプから引用
一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、
ハイフンを含む文字列が後に配置されます。
引用終わり
つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。
先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も
比較に利用されるので、bd-02-mb.htmlが先になる。
文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
05345262008/10/15(水) 22:38:35
>533
おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。
05355332008/10/15(水) 22:54:32
>534
レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。

解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
0536デフォルトの名無しさん2008/10/15(水) 23:00:23
binary
0537デフォルトの名無しさん2008/10/15(水) 23:03:15
ハイフンは、行末で英単語を分割する際に使われるからだな。
0538デフォルトの名無しさん2008/10/15(水) 23:04:22
どのような時に、なぜマッチング処理ができないのかを明記せよ
0539デフォルトの名無しさん2008/10/15(水) 23:08:50
>536
バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)
0540デフォルトの名無しさん2008/10/15(水) 23:27:30
マッチング処理ってどういう処理をしてるの?
0541デフォルトの名無しさん2008/10/15(水) 23:35:57
比較にstrcompを使った独自ソート関数書けよ
0542デフォルトの名無しさん2008/10/15(水) 23:48:53
>>539
Option Compare ステートメント
05435422008/10/15(水) 23:52:53
こっちの勘違いにつき、忘れてcくれ(^^;
05445392008/10/15(水) 23:57:27
>542
エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?
05455392008/10/16(木) 00:03:27
>543
リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
0546デフォルトの名無しさん2008/10/16(木) 01:57:46
で今夜は徹夜ですっと
0547デフォルトの名無しさん2008/10/16(木) 03:44:56
購入日   保証年数
2006/10/05  2
2004/08/12  5
2005/04/22  3

という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、
・・・するという場合、

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then 'もし列がA(1)なら
★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then
'今日との日付差がマイナスなら

Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする
Else
Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする
End If
End If
End Sub

保証切れの場合、色をつけたいのですが、
★をどのようにすればいいでしょうか?
0548デフォルトの名無しさん2008/10/16(木) 05:05:36
ある日付から、 n年後 n日後などを求めたい時は dateadd
詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで
05495262008/10/16(木) 22:42:05
なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、
Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。

0550デフォルトの名無しさん2008/10/16(木) 22:51:10
説明する気ないのか
05515262008/10/16(木) 22:52:41
間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは
Do While マスターキー >= トランザクションキーでした。
0552デフォルトの名無しさん2008/10/16(木) 23:07:51
もう来なくていいよ
0553デフォルトの名無しさん2008/10/16(木) 23:09:30
そもそもマッチングを勘違いしてると思われる。
0554デフォルトの名無しさん2008/10/17(金) 01:13:46
マイッチングまちこ


てか、正規表現でも使うの?マッチングって事は。
0555デフォルトの名無しさん2008/10/17(金) 02:37:01
ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。
COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
0556デフォルトの名無しさん2008/10/17(金) 10:56:37
ものすごくアフォな質問で申し訳ないんですが教えてください
For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、

For I = 1 To 1000
「基本作業」
a = Right(I, 2)
If a = 1 Then
「選択作業1」
ElseIf p = 2 Then
「選択作業2」

以下、0まで選択作業計10個

Else
End If
Next I

こんな感じでいいんでしょうか?
今実行環境が無いのでどなたかアドバイスお願いしますorz
0557デフォルトの名無しさん2008/10/17(金) 11:39:21
>>556
あくまで自分ならだが
For I = 1 To 1000
 '「基本作業」
 a = I Mod 10
 Select Case a
  Case 1
  '「選択作業1」
  Case 2, 3
  '「選択作業2」
 End Select
Next I

といった感じにする
0558デフォルトの名無しさん2008/10/17(金) 11:44:28
>>557
ありがとう
家に帰ったらいろいろ試してみます
0559デフォルトの名無しさん2008/10/17(金) 17:54:59
セルの値が1のときセルの色づけ赤,2のときセルの色づけ青
とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。
0560デフォルトの名無しさん2008/10/17(金) 18:27:43
>>559
ボタン押したら色が変わるようにしたんだろ?
だったら当然だな

入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな

ところでテンプレ>>1の★5読んだか?
0561デフォルトの名無しさん2008/10/17(金) 19:06:41
>>560
ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。
05625472008/10/17(金) 20:36:21
> ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then

なんですが、
dateaddをして、比較したいのですが、

If Dateadd("y", target.offset(0,1).value, target.value) < Date Then
と、やってみてもダメでした、

Private Sub Worksheet_Change
If Target.Column = 1 Then

に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、
上記であっているのでしょうか?
0563デフォルトの名無しさん2008/10/17(金) 21:38:26
>>562
ダメだった時はどうダメだったのかを書こうぜ

> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで
0564デフォルトの名無しさん2008/10/18(土) 01:46:12
>>559
条件付書式だかそんな感じの奴でマクロなしでできる
05655472008/10/18(土) 04:21:40
>>563
もう一度考えてみました。

やりたいことと、セルの値
購入日   保証年数
2006/10/05  2 ←保証切れ(青色になって欲しい)
2004/08/12  5 ←保証が切れていない(色は黒色に)

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then
  ' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較

Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If

End If
End Sub

日付を入れると「全部青になってしまいます」
ちなみに
If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then
と年数バージョンでもやってみましたが、同じ結果orzでした。

全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
0566デフォルトの名無しさん2008/10/18(土) 05:47:32
>>565
おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw

>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?
05675652008/10/18(土) 06:29:37
ありがとうございます。
yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。
たしかにadddateで今ヘルプを見ると、

設定値 内容
yyyy yyyy
y 年間通算日

yyyy・・・内容書いていませんwww (by Office 2003)
でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。


しかし、大問題が発生しました。
xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、
worksheet_changeじゃだめなんです。

workbookが開いたとき、な方法があればいいのですが、
worksheet_activate、selectionchangeでも反応しませんでした。

Private Sub Worksheet_Change(ByVal Target As Range)
ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
05685652008/10/18(土) 06:53:58
何度もすいません、
たぶん、worksheet_activateイベントで良いと思うのですが、

activateになった時に計算させるということは、
自動的に

Private Sub Worksheet_Activate(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub

Private Sub部分を変えただけだと
違うシートを選んで、選択し直すと

「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
と出ますが、すでに上の言葉が理解できません。
if文以下も変更しなければならないのでしょうか?

byヘルプ
プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。
イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。
たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。

ダメです、わけわかりませんorz
0569デフォルトの名無しさん2008/10/18(土) 08:23:40
>>567-568
> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった

イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK

つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw
0570デフォルトの名無しさん2008/10/19(日) 02:32:28
VBAにEffective C++やEffective Javaみたいなガイドラインってある?
05715682008/10/19(日) 02:58:41
>>569
>色変えたいだけなら条件付き書式でもできるがw

こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。

わざわざVBAを使う必要無かったんだ・・・。
___________
   ||     
   ||     ⊂⊃
   ||    ∧ ∧
   ||    (  ⌒ ヽ でも勉強にナターヨ・・・
 ∧||∧   ∪  ノ
(  ⌒ ヽ 彡  V
 ∪  ノ  フワーリ
  ∪∪
0572デフォルトの名無しさん2008/10/19(日) 03:29:41
ほんとに色変えるだけなのかよwまいったw

>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄
0573デフォルトの名無しさん2008/10/19(日) 07:09:25
悪いけど笑わせてもらう


  ァ   ∧_∧ ァ,、
 ,、'` 。゚( ゚^∀^゚)゚。,、'`
  '`   ( ⊃ ⊂)  '`


0574デフォルトの名無しさん2008/10/19(日) 07:12:51
関数でできることをマクロでやろうとしたり、案外よくあるよな
0575デフォルトの名無しさん2008/10/19(日) 12:16:55
だんだんとワークシート関数がウザくなってくるんだよなw
0576デフォルトの名無しさん2008/10/19(日) 17:15:03
暇だから何か問題だしやが……出して下さい
0577デフォルトの名無しさん2008/10/19(日) 20:25:44
>576
Excel総合相談所74で質問が出てますよ。(レス番号325です)
0578デフォルトの名無しさん2008/10/19(日) 20:49:32
プログラミング初心者かつエクセルにも詳しくない奴が、
この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし
0579デフォルトの名無しさん2008/10/19(日) 21:31:47
>>576
4色問題お願いします。
0580デフォルトの名無しさん2008/10/19(日) 22:29:21
>>577
ありがと
解決済みだった

>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?

セルに色塗るなら二色で出来ちゃうし
0581デフォルトの名無しさん2008/10/19(日) 22:33:43
二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに
格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
0582デフォルトの名無しさん2008/10/19(日) 22:43:16
>>581
あります

入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須
05835812008/10/19(日) 22:50:06
>>582
すみませんコントロールツールボックスの方です
シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…
0584デフォルトの名無しさん2008/10/19(日) 22:51:02
>>580
4色問題ってこんな感じのです。
ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C
0585デフォルトの名無しさん2008/10/19(日) 22:59:02
>>584
ありがとう

1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす

2.領域ごとに、隣り合わせ同色にならないように色IDを付ける

3.色IDが1から4で収まっているか判定


っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw
■ このスレッドは過去ログ倉庫に格納されています