みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルのVBA初心者です。教えてください。

エクセルVBAの勉強を始めたばかりのものです。無知を自覚しながら質問させていただきます。
宜しくお願い致します。

下のようにエクセルの表があります。
B列の中から例えば5月13日が今日だとして本日の日付のものを探し、見つけたらその隣の列の
A列の通番を参照しピックアップしたら、別のシートに作ってある番号ばかりのシート表の中のその通番のセルを塗りつぶすという一連の作業のVBAを作りたいのですがどうしたらいいのでしょうか?

問題の説明不足で意味が通じるかが心配なのですが、本日の日付をB列から見つけてその通番
をピックアップするVBAを教えて頂けたらとおもい、質問しました。
ちなみに日付は5/13の形式で入力しています。


AB
15月13日
2
3
4
55月13日
6
6

投稿日時 - 2013-05-14 09:44:15

QNo.8087166

困ってます

質問者が選んだベストアンサー

#2 DOUGLAS_ です。

 #2に補足いただいた内容を整理して、下記のように理解したのですがいかがでしょうか?
1)「入力.xls」に「データ」シートがある。
2)「データ」シートの「A1:A1000」に「1 ~ 1000」の連番が入っている。
3)「データ」シートの「B1:B1000」には、A列の番号が付いた書類が決裁された日を記入。
4)「確認書.xls」に「チェック」シートがある。
5)「チェック」シートの「A1:AN25」などの矩形範囲に「1 ~ 1000」の連番が入っている。
6)(3)の範囲に決裁日が入力されている連番を検索し、(5)の対応する連番を塗りつぶす。

>要するに戻ってきた書類の通番が一目でわかるように塗りつぶしをしたい
>最後はすべての通番が塗りつぶされるというわけです。
とのことですので、「(3)の範囲に日付が入っていれば(5)の連番を塗りつぶす」という考え方でOKですよね?

'-----------------------------------

>VBAの勉強を兼ねて作ってみたい
とのことですが、VBAを使わない場合は、下記により、目的のことを達成できます。

1)「チェック」シートの「A1:AN25」に「1 ~ 1000」の連番が入っているとします。
2)「A1」をアクティブにし、[Ctrl] + [A] で、「A1:AN25」を選択します。
3)名前ボックスに「A1」と表示されていることを確認の上、条件付き書式で「数式が」
=INDIRECT("[入力.xls]データ!B" & A1,1)<>""
で、塗りつぶしの書式を施します。
4)以上で、「入力.xls」を開いた時点で、「確認書.xls」の連番が塗りつぶされますので、印刷なり、目視なりなさってください。

5)「今日」の日付を強調したい場合は、(3)の時点で、「数式が」
=INDIRECT("[入力.xls]データ!B" & A1,1)=TODAY()
で、塗りつぶしの書式を施し、(3)の条件は「条件2」に設定します。

'-----------------------------------

 さて、本題に戻りますが、#2に補足いただいた内容をよく考えてみると、「1~1000ごとに」とお書きですので、書類に付された連番が「1000」に到達した時点で、新たに「1」から連番を振り直すということになろうかと存じます。
 したがって、その場合には、「入力.xls」の「データ」シートも「確認書.xls」の「チェック」シートも新しくなるかと存じます。
 このことを含めて、VBAを書くことは、初級者には難しいと存じますので、「VBAを使わない」方法をお勧めいたします。

 上記のことを考えずに、取り敢えず、目の前の「入力.xls」の「データ」シートと「確認書.xls」の「チェック」シートだけを対象にVBAを書くと下記のようなことになろうかと存じます。

'-----------------------------------

●「別のブックを開きその通番を塗りつぶす」マクロ
 ただし、「エクセルのVBA初心者」・「VBAの勉強を兼ねて作ってみたい」とのことですので、奇をてらったヤリ方やコードは用いず、人間がするように、マクロの操作を書いてみました。

1)「確認書.xls」を開く。
2)「入力.xls」の「チェック」シートB列を検索し、今日の日付を確認する。
3)今日の日付が見つかったら、その左側の連番を「確認書.xls」の「チェック」シートから見つけて、これを塗りつぶす。
4)(2~3)を、今日の日付が見つからなくなるまで繰り返す。

 ただ、「日付文字列の検索」というのは、ワークシート上の手作業でも、VBAでも少し難しいことになろうかと存じますので、[For...Next ステートメント] で、行数分回すことにします(1000行ですから、そんなに時間も掛からないでしょうし。。。)。
参考)日付を検索する
http://officetanaka.net/excel/vba/tips/tips131b.htm

Sub Macro1()
  Dim l As Long '行番号
  Workbooks.Open Filename:="~~\確認書.xls"
  Sheets("チェック").Select
  For l = 1 To 1000
    If Workbooks("入力.xls").Sheets("データ").Range("B" & l).Value = Date Then
      Cells.Find(What:=l, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False _
      , MatchByte:=False, SearchFormat:=False).Interior.ColorIndex = 6
    End If
  Next
End Sub

投稿日時 - 2013-05-15 15:19:20

お礼

ありがとうございました。

VBAを使わないでも十分できるという事がわかりましたが、やっぱり勉強して挑戦してみたいと思います。
難しいですね。
ご丁寧に教えて頂いてありがとうございました。

投稿日時 - 2013-05-15 16:51:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

#回答ではありません。
#「問題の説明不足で意味が通じるかが心配」とお書きですので、他の回答者の方のために、こちらから質問いたします。

>本日の日付をB列から見つけてその通番をピックアップする
とお書きですが、目的の動作がイマイチ判然としません。

 前半部分を読んで、感じるままに手許のワークシートにデータを入れていくと、わざわざVBAを使うよりは、関数と条件付き書式で済ませた方が簡単なように存じますが、
【質問1】(勉強のために)VBAでなさりたい、ということでしょうか? それとも、VBAを使わなくて済めば、それでよいのでしょうか?

 「その通番をピックアップする」と「番号ばかりのシート表の中のその通番のセルを塗りつぶす」とは同じ意味になるようですが、要は
【質問2】別シートの連番が塗りつぶされればよいのでしょうか?
それとも、「ピックアップ」とお書きですので、
【質問3】塗りつぶされた行がフィルターされたような状態で、一目瞭然になるようにされたいのでしょうか?

 そして、これが肝心なところですが、
【質問4】「隣の列のA列の通番」と「別のシートに作ってある番号」は、同じ番号から同じ番号までの連番ですか?

 ついでに、【質問2・3】に掲げた処理は、日が変わったら、
【質問5】前日の処理を解除して、再度、「今日」の処理を施すのでしょうか?
それとも
【質問6】前日までの連番は塗りつぶされたままで、さらに「今日」の分の連番を塗りつぶすのでしょうか?

 上記のように、分からないことだらけですが、こういうご質問の場合は、「例」で結構ですので、
【質問7】「下のようにエクセルの表」のあるシート名と、「別シート」のシート名は何ですか?
【質問8】「B列の中から・・・その隣の列のA列」の内、B列の検索対象は何行目から何行目までで、A列には何番からの連番が入っていますか?
【質問9】「番号ばかりのシート表」は何列(A列・B列など)にあって、何行目から何行目まで連番が入っていますか? または、「A1:D20」というような矩形(四角形の)範囲に、「1から順番に連番が入っている」というような感じでしょうか?
などをお書きになると、分かりやすい回答が得られるかと存じます。

投稿日時 - 2013-05-14 11:18:56

補足

前回の質問に補足させていただきます。

質問の内容があまりに言葉たらずだったと思います。
申し訳ありませんでした。

質問にお答えさせていただきながら整理してお尋ねしたいと思います。
宜しくお願い致します。


>【質問1】(勉強のために)VBAでなさりたい、ということでしょうか? それとも、VBAを使わなくて>済めば、それでよいのでしょうか?
 もともとやりたい作業の流れは次のようなものです。
 入力という名前のファイルのデータというシートがあったとします。そのデータシートに
毎日提出するA列の通番つきの書類がありまして決裁を貰うとかえってくるのです。かえってくるとその日付をB列に入力します。と同時に確認書という、別のファイルにある、通番を1~1000ごとに作ってあるチェックシートがありまして、その中から今日戻ってきた通番を見つけて、通番の塗りつぶしをしたい、という事なのです。
要するに戻ってきた書類の通番が一目でわかるように塗りつぶしをしたいのです。
ただそのチェックシートは別ファイルなのです。日付を入力し別のブックを開きその通番を塗りつぶすというルーチン作業をVBAの勉強を兼ねて作ってみたいのです。


 >「その通番をピックアップする」と「番号ばかりのシート表の中のその通番のセルを塗りつぶす」とは同じ>意味になるようですが、要は
>【質問2】別シートの連番が塗りつぶされればよいのでしょうか?
>それとも、「ピックアップ」とお書きですので、
>【質問3】塗りつぶされた行がフィルターされたような状態で、一目瞭然になるようにされたいのでしょう>か?
 ピックアップというのはその通番を見つけて戻ってきたという事がわかるように塗りつぶす、という事です。


> そして、これが肝心なところですが、
>【質問4】「隣の列のA列の通番」と「別のシートに作ってある番号」は、同じ番号から同じ番号までの連番>ですか?
 同じ番号の通番なのですが、別ブックなんです。


 >ついでに、【質問2・3】に掲げた処理は、日が変わったら、
>【質問5】前日の処理を解除して、再度、「今日」の処理を施すのでしょうか?
>それとも
>【質問6】前日までの連番は塗りつぶされたままで、さらに「今日」の分の連番を塗りつぶすのでしょう>>か?
 毎日塗りつぶしは更新されるようにし最後はすべての通番が塗りつぶされるというわけです。
 
>上記のように、分からないことだらけですが、こういうご質問の場合は、「例」で結構ですので、
>【質問7】「下のようにエクセルの表」のあるシート名と、「別シート」のシート名は何ですか?
>【質問8】「B列の中から・・・その隣の列のA列」の内、B列の検索対象は何行目から何行目までで、A列>には何番からの連番が入っていますか?
>【質問9】「番号ばかりのシート表」は何列(A列・B列など)にあって、何行目から何行目まで連番が入>っていますか? または、「A1:D20」というような矩形(四角形の)範囲に、「1から順番に連番が入>っている」というような感じでしょうか?
>などをお書きになると、分かりやすい回答が得られるかと存じます。
 それぞれのシートは別ブックにあります。
 また、検索対象は順不同に戻ってくるので列全体ということになります。
 以上でだいたい質問内容はお分かりいただけましたでしょうか?なにぶんにも意図を文章にするのに慣れて いなくてすみません。
どうぞ宜しくお願い致します。

投稿日時 - 2013-05-15 10:24:56

お礼

ご指導ありがとうございました。
質問の内容があやふや過ぎました。
ご指摘の通り、もう一度整理して質問させていただきます。

また、宜しくお願い致します。

投稿日時 - 2013-05-14 14:42:10

ANo.1

例えばシート1のA列に番号が、B列に日付が入力されているとして、シート2のA列からE列にある該当する番号のセルを塗りつぶすとしたら、「開発」タブの「マクロの記録」を選択してから「条件付き書式」の操作で数式を選択して操作をすればよいでしょう。
例えばその時のマクロの記録は次のようになりますね。セルを赤で塗りつぶしている場合です。

Sub Macro2()
Columns("A:E").Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=A1=INDEX(Sheet1!$A:$A,MATCH(TODAY(),Sheet1!$B:$B,0))"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
Range("A1").Select
End Sub

投稿日時 - 2013-05-14 11:16:24

お礼

ありがとうございました。

早速やってみます。

質問の内容が不明瞭なのにお答えを頂きありがとうございました。

投稿日時 - 2013-05-14 14:26:14

あなたにオススメの質問