[[20080707135850]] 『マクロの修正』(COCO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの修正』(COCO)

 お世話になります。
 以前、
[[20080603170108]]で教えていただいたマクロを修正しています。
 B8,D8,F8,H8,J8に入力された数字はTODAYではなくて昨日の日付のセルに反映させたいのですがどのようにすればいいのでしょうか?

 outputRow = [MATCH(TODAY()-1,N:N,0)]

 とすると全部が昨日の日付になってしますので分け方がわかりません。
 ちなみに土日は含まない設定にしたいのですが。(月曜に入力をしたら金曜日のセルに入る)
 よろしくお願いします。

 Private Sub Worksheet_Change(ByVal Target As Range)  'Changeイベントで作動するマクロ
  Dim outputRow As Long
  Dim outputCol As Long
  Dim outputColsAry
  Dim inputCellsAry
  Dim inputCell As Range

     If Target.Count > 1 Then Exit Sub

     Set inputCell = Intersect(Target, Range("A8,B8,A10,C8,D8,C10,E8,F8,E10,G8,H8,G10,I8,J8,I10")) '追加があれば増やす。例:Range("F7,F13,X20")
     If inputCell Is Nothing Then Exit Sub              '処理セルか判断

     inputCellsAry = Array("A8", "B8", "A10", "C8", "D8", "C10", "E8", "F8", "E10", "G8", "H8", "G10", "I8", "J8", "I10") '追加があれば増やす。例: Array("F7", "F13","X20")
     outputColsAry = Array("O", "P", "R", "S", "T", "V", "W", "X", "Z", "AA", "AB", "AD", "AE", "AF", "AH")    '追加があれば増やす。例: Array("B","C","Y")

     outputCol = WorksheetFunction.Match(inputCell.Address(0, 0), inputCellsAry, 0) - 1

     outputRow = [MATCH(TODAY(),N:N,0)]

     If TypeName(outputRow) = "Error" Then
         MsgBox "A列に本日の日付がありません"
     Else
          Application.EnableEvents = False               '次の行でセルが書き変わっても、このChangeイベントが呼び出されない様にする。
              Range(outputColsAry(outputCol) & outputRow).Value = inputCell.Value
          Application.EnableEvents = True
     End If

  End Sub


 なんか、ごちゃごちゃしてきましたね。^^

 Workday関数を使用しますので、アドインが必要です。(※)
  ※ メニュー[ツール]→[アドイン]→[分析ツール]にチェックを入れてください。

  Private Sub Worksheet_Change(ByVal Target As Range)  'Changeイベントで作動するマクロ

   Const scopeToReact As String = "A8,B8,A10,C8,D8,C10,E8,F8,E10,G8,H8,G10,I8,J8,I10"
   Const clmnToCorrespond As String = "O,P,R,S,T,V,W,X,Z,AA,AB,AD,AE,AF,AH"
   Const scopeOfPreday As String = "B8,D8,F8,H8,J8"

   Dim colToPost As Long
   Dim rowToPost As Variant

   Dim outputColsAry
   Dim inputAddressAry
   Dim judgePreviousAry

      If Target.Count > 1 Then Exit Sub       '1セルの変更のみ受付け

      If Intersect(Target, Range(scopeToReact)) Is Nothing Then Exit Sub   '処理セルか判断

      inputAddressAry = Split(scopeToReact, ",")
      outputColsAry = Split(clmnToCorrespond, ",")
      judgePreviousAry = Split(scopeOfPreday, ",")

      With WorksheetFunction

          colToPost = .Match(Target.Address(0, 0), inputAddressAry, 0) - 1

          If .Match(Target.Address(0, 0), Split(scopeOfPreday & "," & scopeToReact, ","), 0) _
                 <= UBound(judgePreviousAry) + 1 Then
             rowToPost = [MATCH(WORKDAY(TODAY(),-1),N:N,0)]
          Else
             rowToPost = [MATCH(TODAY(),N:N,0)]
          End If

          If .IsNumber(rowToPost) Then
             Application.EnableEvents = False
                Range(outputColsAry(colToPost) & rowToPost).Value = Target.Value
             Application.EnableEvents = True
          Else
             MsgBox "N列に本日または前営業日の日付がありません"
          End If

      End With
   End Sub

 (半平太)

半平太さん、前回はありがとうございました。今回もご教授ありがとうございます。
 ゴチャゴチャしていたのがすっきり見えます。
 早速やってみたのですが会社のPCにインストールがされていないらしくアドインが設定できません。
 インストールしてもらってから実行してみます。


 >会社のPCにインストールがされていないらしくアドインが設定できません
   VBEではなく、エクセルの一般機能の方のアドインですが、本当に無いですか?
   (無いと云うのを、あまり聞いたことがありませんが)

 >ゴチャゴチャしていたのがすっきり見えます。
   そうでもないので、「Select Case」を使えばよかったと、今になって思っています。
   もしかすると、(みかねて)どなたかが書いてくれるかも知れません。

 (半平太)

それが本当に無いんです(泣)
 余談ですがVBEのヘルプ機能も使えません(笑)


 >それが本当に無いんです(泣) 余談ですがVBEのヘルプ機能も使えません 

  会社方針として、VBAなんて書いちゃいけないことになっているのではないですか?
  それにしてもWorkday関数が使えないのは、何かの折に支障が出ると思うのですがねぇ。

 単に、TODAYが「土日月」の場合、前営業日として、金曜日にすればいいだけであれば、
 一般的なWEEKDAY関数でも対応はできます。

 > rowToPost = [MATCH(WORKDAY(TODAY(),-1),N:N,0)]
    へ変更
    ↓
    rowToPost = [MATCH(TODAY()-MOD(MIN(WEEKDAY(TODAY()),3),3)-1,N:N,0)]

 ※1 実際は、TODAYが土日と云うことは無いでしょうが、念のため想定内にしてあります。
  2 WORKDAYが使えなくなったことによって、追加で「祭日対応」を言い出されても対応はできません(私は)

 (半平太)

祭日対応にしたいのでインストールをお願いしました(笑)
 インストール後に実行してみます。
 祭日非対応のWEEKDAY関数はうまく動きました。
 ありがとうございました。またご報告させていただきます。

 >祭日対応にしたいのでインストールをお願いしました
 なら、ついでにVBEのヘルプもインストールをお願いしてみては?
 (dack)

dackさんの言うとおり!VBEのヘルプも使えるようにしてもらいます(笑)
 ただ、2,3日かかるみたいです・・・

Workday関数もVBEのヘルプも使えるようになりました!
 ところで、Workday関数を使うなら日付設定も祭日認識にしないとでしょうか?

      A        B

 3    年	     月
 4    2008     7

 14  7/1(火)

 現在、A14に「=DATE(A4,B4,1)」と設定して後は上のセル+1としています。
 祭日は手動で赤くしています。(日付の列をNからAにレイアウト変更しています)
 これでは祭日を認識できないですか?
 よろしくお願いします。


 >ところで、Workday関数を使うなら日付設定も祭日認識にしないとでしょうか?
 > 祭日は手動で赤くしています。(日付の列をNからAにレイアウト変更しています)
 > これでは祭日を認識できないですか?

 祭日リストを作る必要があります。
 例えば、BA:BCの列を利用できるとして、祭日の印『1』をBB列に入力するルールにすれば、

 (1) BA1セル =N14      31行目までフィルダウンして、日付データを取ってきます
 (2) BC1セル =IF(BB1,BA1,0) 31行目までフィルダウンして、祭日だけその日付を表示します。

 <結果図>
  行    __BA___  _BB_  _BC__
   1    7月1日             0
   2    7月2日             0
   3    7月3日             0
   4    7月4日             0
  :   :        :
  20    7月20日            0
  21    7月21日     1  39650  ←BB列の「1」は手入力。BA,BC列の表示形式は自由です。
  22    7月22日            0   (日付表示にしたければ、その様に書式を設定してください)
  :   :        :   (シリアル値のままでも問題ありません。)

 ※ 以上で「祭日リスト」が「BC1:BC31」に出来ますので、それをここに反映させます
                               __↓__
             rowToPost = [MATCH(WORKDAY(TODAY(),-1,BC1:BC31),N:N,0)]
 (半平太)

半平太さんありがとうございました!
 7/10を「1」にして試してみたら見事に7/9に数字が入りました。
これなら夏休みも「1」にして入力出来そうです。
 ところで列はBA、BB、BCではなくても大丈夫ですよね?(初歩的な質問ですみません)

 >ところで列はBA、BB、BCではなくても大丈夫ですよね?

 例は、祭日リスト(『BC1:BC31』に相当するもの)を簡単に作る為の工夫であって、
 作成場所はどこでもよく、BAもBBも最終的には必要ないものです。 

 単にこんなのを直接作り、rowToPost = [MATCH(WORKDAY(TODAY(),-1,AZ5:AZ12),N:N,0)] としてもいいです。
    ↓
 行   __AZ___  
  5   7月21日  
  6         0  
  7         0  
  8         0  
  9         0  
 10         0  
 11         0  
 12         0  

 (半平太)

わかりました。

 >例は、祭日リスト(『BC1:BC31』に相当するもの)を簡単に作る為の工夫であって、

 簡単に作る為の工夫のおかげで理解できました。
 ありがとうございました!

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.