[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの修正』(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のヘルプ機能も使えません
会社方針として、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)
ただ、2,3日かかるみたいです・・・
ところで、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.