[[20041025165459]] 『マクロで勤怠管理すると...』(キリキ) ページの最後に飛ぶ

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

 

『マクロで勤怠管理すると...』(キリキ)

[マクロですると・・・]

 いつも楽しく拝見させて頂いております。

 今回、お聞きしたい内容は勤怠管理を下記のように行っているのですが
 sheet1からsheet2にデータを飛ばしたいと考えております。
 HLOOKUP関数で考えたのですが
 ふと、マクロでするとどうなるのだろ〜?と思い質問させていただきます。

 sheet1(1週間の基本パターン)
   A    B     C     D     E     F      G      H
           月      火      水      木      金       土      日
  あああ  12B8    /     12B8    /     12B8     9D8    9C8
  いいい    9D7    /      9D7   9D7     9D7      /     9D7
  ううう 12C7.5  11A7.5   /   11C7.5   12C7.5  11A7.5   /
  えええ    /    18B3    18B3  18B3     /      15D5.5 10A5.5

 sheet2(1月分の勤怠)
   A     B     C     D     E     F      G      H・・・・・
 2004/10/16 16      17      18     19      20       21      22・・・・・
            土      日       月      火      水      木      金・・・・・
  あああ  =HLOOKUP(B$2,Sheet1!$B:$H,ROW(A2),)→
  いいい    ↓

 ・1週間分の基本勤怠があり、毎月作成するシートに飛ばしたい
 ・実際のsheet1は、記号ではなく時間入力です(sheet2は時間を記号化したものを表示)
  よって、コピペではなく、関数を使用してます。

 なんだか分かり辛くなってきましたが。。。
 基本パターンを作成しておくことにより、sheet2のA1に日付を入力すると
 曜日が勝手に変り(text関数済)HLOOKUP関数のようにsheet1を検索しsheet2を
 作成したいと思っております。

 分かり辛くて申し訳ありませんが、ご指導よろしくお願いいたします。
 マクロは記録のみしか出来ません(キリキ)


 具体的に何を回答すればよいのでしょうか?
 マクロによるどの部分の処理が分からないのでしょうか?
 それとも質問ではなく、マクロ作成依頼でしょうか?

   (INA)


 キリキさんと言えば、ぽこさんの事ですわなぁ。
 やったら、あんさんが回答者に廻ってレスつける立場になる日はそう遠くはおまへん
 なぁ。
 で、上のご質問ですけどな、キリキさんの勉強のお役に立てればと思うて作ってみまし
 たんですけど、これで良かったんでっしゃろか?
 Sheet2のシートモジュールにコピペしておくんなはれ。
 Sheet1にはあんさんが呈示してくれたデータを書き込んでください。
 Sheet2は何にも書き込まんでも結構です。
 Sheet2のA1に日付を書き込んでみてくらはい。
 どうでっか?
       (弥太郎)
 '-------------------------------------
 Option Explicit
 Option Base 1
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim days As Integer, days_data As Integer, n As Integer, i As Integer, t As Integer
    Dim j As Long
    Dim data, youbi
    If Target.Count > 1 Then Exit Sub
    If Target.Address <> Range("A1").Address Then Exit Sub
    Application.EnableEvents = False
    data = Target
    Range("a1").CurrentRegion.Clear
    On Error GoTo trbl
    Range(Target.Address) = data
    days = (Split(Range("a1"), "/", -1)(2)) * 1

    Select Case Split(Range("a1"), "/", -1)(1)
        Case 1, 3, 5, 7, 8, 10, 12
            days_data = 31
        Case 2
            If Split(Range("a1"), "/")(0) Mod 4 = 0 Then
                days_data = 29
            Else
                days_data = 28
            End If
        Case 4, 6, 9, 11
            days_data = 30
    End Select
    Cells(2, 2) = WorksheetFunction.Weekday(Range("a1"))

    For n = 2 To (days_data - days + 2) + (days - 1)
        Cells(1, n) = Split(Range("a1"), "/")(2) + i
        If Cells(1, n) = days_data Then i = i - days_data
        i = i + 1
    Next n
    youbi = Array("日", "月", "火", "水", "木", "金", "土")

    For i = 1 To 7
        If i = Cells(2, 2) Then
            Cells(2, 2) = youbi(i)
            Exit For
        End If
    Next i
    Cells(2, 2).FormulaR1C1 = Cells(2, 2)
    Cells(2, 2).AutoFill Destination:=Range(Cells(2, 2), Cells(2, (days_data - days + 2) + (days - 1))), _
                    Type:=xlFillDefault

    With Sheets("sheet1")
        For j = 3 To .Range("a65536").End(xlUp).Row + 1
            For n = 2 To (days_data - days + 2) + (days - 1)
                If .Cells(1, n) = Cells(2, 2) Then
                    Cells(j, 1) = .Cells(j - 1, 1)
                    i = 2
                    For t = n To (days_data - days + 2) + (days - 1)
                        Cells(j, i) = .Cells(j - 1, t)
                        i = i + 1
                        If t = 8 Then
                            t = 1
                        End If
                        If Cells(1, i) = "" Then Exit For
                    Next t
                End If
            Next n
        Next j
    End With

    Application.EnableEvents = True
    End

 trbl:
    MsgBox "キチンと日付を書き込んでおくんなはれ。"
    Application.EnableEvents = True
 End Sub


 返事が遅くなりまして、大変申し訳ございませんでした。。。

 INAさん>早速のレスを頂きながら、返答が遅くなってしまいすいませんでした。
[[20040712171724]]
 にて問題が上がっておりました、『OfficeのCD-ROM』がやっと手に入りました(^^)
 (もちろん管理者に許可を頂きました)
 そこで、マクロをいよいよ本格的に勉強したい!!と思い、記録をいろいろしておりましたが
 今回のようなケース?では、記録が出来ないためどのような手法で行えば・・・?
 と、思った次第であります。

 >具体的に何を回答すればよいのでしょうか?
 >マクロによるどの部分の処理が分からないのでしょうか?
 >それとも質問ではなく、マクロ作成依頼でしょうか?

 確かに、改めて自分のスレを確認してみると、何をどうしたいのかがわかりませんね...(^^;
 マクロ作成依頼なんてとんでもない!!

 マクロ初心者のため、まず何を行えばいいのか?
 ヒントだけでもと思っていた次第です(結果的には、弥太郎さんの貴重なお時間を頂き作成していただきましたが...)
 次回より【分かり易く】を念頭にいたします。

 弥太郎さん>おぉ〜 心の師匠!!
 わざわざマクロまで作成させてしまい、感謝感激雨あられです。

 さらに、旧HNまで覚えていてくださったとは〜(T^T)嬉いっす!

 イメージ通りのものです!(^^)
 このマクロを理解できるようヘルプ・参考書としばらくニラメッコしてみたいと思います。
 回答者側に廻るのはまだまだだと思いますが。。。 精進いたします。

 本当にありがとうございました。
 (キリキ)

 いつもお世話になっております。
 弥太郎さんに作っていただいたマクロで、わからないことがあります。

 >days = (Split(Range("a1"), "/", -1)(2)) * 1
 の * 1 は、必要なのでしょうか?
 省けるものなのでしょうか?省いてみても日付部分の参照が出来たのですが
 もし、重要な意味があったら教えてください。

 >On Error GoTo trbl
 は、”エラー時には、trblに行きなさい”とのことだと思うのですが
 マクロ実行の途中なら、どこでも”trbl”に行くのでしょうか?
 その場合、記載する場所はこの部分以外ではいけないのでしょうか?

 今のところは、ここまでしかニラメッコが追いついていないのですが。。。
 是非、ご教授下さいm(__)m

 あとマクロを実行し、検証するためには F8のステップインの他に検証する方法は
 無いでしょうか?
 上記マクロですと、F8が効かないのですが・・・
 エクセルの【数式の検証】みたいな機能があればな〜
 (キリキ)

 途中は全然見てません。
 >上記マクロですと、F8が効かないのですが・・・
ここに限ってコメントします。
ぅんなぁ〜〜ことはないと思いますよ??
なるべく最初の方にブレイクポイントを設定しておいてから、
A1をドンッと入力したらどうですか??
まぁ、まるっきり最初からじゃないですけどね。( ̄□ ̄;)!!
v(=∩_∩=)v
(SoulMan)

 SoulManさん、ありがとうございます。
 ブレイクポイントの使い方を、いま始めて知りました...
 ほんと、お恥ずかしい〜〜〜(^^;A

 追加で質問させてください。
 >data = Target
 >Range("a1").CurrentRegion.Clear
 >On Error GoTo trbl
 >Range(Target.Address) = data

 日付部分のデータを、一度クリアにして復活させる意味を教えてください。
 絶対、重要な事が隠されてるんだと思うんだけどな〜?
 上記質問と重複しますが、
 >On Error GoTo trbl
 を間に入れるのが、ヒントなのでしょうか?

 う〜ん、わからん...(/_;)
 助けてくださいまし〜
 (キリキ)

 わかった!?(^^)

 *1をすることによって、文字入力がエラーになるって事ですか?

 連書きすいませんm(__)m
 (キリキ)

 先ず初めにSoulManさん、フォローおおきに〜。
 夏目雅子似はんに比べたら確かに容貌は落ちましたけど、いつもの鋭いレスポンスは
 相変わらずです、ハイ。(笑)

 ところでキリキさんの疑問です。
 *1が何故必要なんかですけどナ、Split関数は全て文字列で返します。
 デバックで追いかけてみればお分かりでっしゃろけど(ポインターをdaysにそ〜と近づ
 ける)daysの値は"13"とか"20"とか""で表示されます。これは数値でなくて文字列なん
 ですワ。エクセル君は小憎たらしい事にかなり頭脳が発達しとって、計算のやり方に
 よっては文字列の数値を勝手に数値に変えてしまう機能がありまんねんなぁ、これが。
 勿論文字列でしか扱うて貰えない数値もありますんで、"13"とか、"20"とかは 13また
 20に換えておかなければエラーのでるおそれが多分にありますねん。
 これは習慣としてやっとかなアカン作業ですねんで。

 関数でも文字列の数値を数値に変換するばやい、LOOKUP流は--をシニア流では*1を
 使うてまっしゃろ。わたしゃ使い慣れとる*1を書いてますけど、これはどっちでも
 よろしいんでっせ。勿論CInt,CLng,Val etc 色んな関数が使えます。

 そのままでも使えるからというてそのまま使う習慣が付くとエラーが出たばやい「な
 んでやろ!!!???」と慌てふためく羽目に陥りますさかいナ、数値は数値とし
 て扱うようにしとったほうがええんとちゃいまっか。
 "20"+"10" とか"10"*2とか色んなケースを考えて試してみるんもええことでんなぁ。

 >data = Target
 >Range("a1").CurrentRegion.Clear
 >On Error GoTo trbl
 >Range(Target.Address) = data
 これはこのシートのデータを一旦消去するための前作業ですワ。
 (前のデータがシート2に残っとったらとんでもない事になりますからなぁ)
 順番としてはA1にデータを入力したら(それ以外は反応しない)A1にまとわりついた
 データを全て消去します。その際TargetはTargetで無くなってまいまんのんで一旦
 dataという変数にA1のデータを格納しときます。
 で、目的の範囲を消去した後改めてA1に先ほどのデータを放り込んどります。
 On Error GoTo trblはエラーが発生したら(このエラーは、例えばA1にキリキ
 とでも入力したばやい、Split関数で早速エラーが発生します。なぜかというと"/"
 で分割でけるデータが無いからです。On Error GoTo trblの頭に'を付けその命令
 を無効にして試してみるとよう分かりますワ)

 また不審点がおましたらどんどんご質問くだはいよ。キリキさんの為やったら喜んで
 お答え致します。
       (弥太郎)

 なるほど〜 わかってきました(^^)
 作る時点で色々な問題点が想定できないといけない訳ですね〜 メモ〆(.. )

 しかし、弥太郎さんを始め皆さんのマクロを見ると。。。
 ほんと〜〜に、親切に作ってあるというか、相手の立場に立って考えてあるというのが
 わかりますね(^^)

 まだ完全に理解しているわけでは無いのが、チョット悔しい(><)
 お言葉に甘えて、解らないことはジャンジャン質問させていただきます。
 (キリキ)

 ジャンジャン質問その1

 またまた教えてください(連続すいません)
 >(days_data - days + 2) + (days - 1)
 の部分がどうしてもわかりません。。。

 2004/10/16のケースで言うと
 (31−16+2)+(16−1)=32

 (days_data - days + 1) + (days - 1)
 (31−16+1)+(15)=31
     10月分   +  11月分
 が正解のような気がするのですが。。。

 あっ わかった!!表の構成が、B2からだから32列までってことか〜
 ということは
 ((days_data - days) + days) + 1

 でもいいってことですね?

 あと、下記のループは"sheet2"の曜日を"sheet1"から探し
 一致したら、複写しろって事だと思うのですが、一人目はそれでいいけど
 二人目からは、nの値は7で決定していると思うのですが?

 With Sheets("sheet1")
         For j = 3 To .Range("a65536").End(xlUp).Row + 1
             For n = 2 To (days_data - days + 2) + (days - 1)
                 If .Cells(1, n) = Cells(2, 2) Then
                     Cells(j, 1) = .Cells(j - 1, 1)
                     i = 2
                     For t = n To (days_data - days + 2) + (days - 1)
                         Cells(j, i) = .Cells(j - 1, t)
                         i = i + 1
                         If t = 8 Then
                             t = 1
                         End If
                         If Cells(1, i) = "" Then Exit For
                     Next t
                 End If
             Next n
         Next j
     End With

 ということで、編集しようと思ってみても能力が追いつかず。。。
 いじってみたら、無限ループに陥っちゃうし(TT)
 文法、関数、、、etc を頭に叩き込んでからするべきでした(^^;A
 (キリキ)

 あのぅ、今宵は些か酩酊気味でして・・・
 wizikさんみたいに呑めば呑む程頭が冴えてくるという異常体質にはでけあがってまへ
 んのんで、明日(明日はヒマがとれます)でよろしいか?(笑)ふ〜っ。
 カキコついでにdays-1っちゅうんは、例えば16日から始まればその1ヶ月後は15
 日になりますわなぁ。せやから取得した日付−1日としとる訳なんですけどナ。
 え〜と、頭で考えても分からん時は両手の指を使うて勘定すればようわかりまっせ。
 わたしゃ両手の指で足らんばやいは両足の指も動員してますワ。(ぜうだんですよ)

  >((days_data - days) + days) + 1
 これは結果が同じでも私の申し上げとる意味とはちょっとばっかしちゃいますわなぁ。
 今は結果よければ全て良しの段階ではおまへんのんでなんでdays-1にして有るんかを
 ご理解いただけたら有り難いんですけどナ。
 ま、なんにせよ、今はもだえ苦しんでおくんなはれ。(笑)
 それがやがてキリキさんの血となり肉となって必ずや役にたつ時が訪れる事請け合いま
 すワ。
    ほな、 酔いどれ(弥太郎)

 弥太郎さん>お忙しいのに?レスありがとうございます。

 明日のお返事楽しみにしております(^^) 

 上記の件、こちらでは如何でしょう?
 ((days_data - days + 1) + (days - 1)) + 1
 ((31 - 16 + 1) + (16 - 1)) + 1 = 32
 ((10月末日 - 10月16日から表示の為、+1) + (11月15日まで表示の為、-1) + (セル32に合わせる為、+1) = 32

 両手・両足全部使いましたが、生憎 手足各2本しかございません(;;)
 次回は、弥太郎さんの両手足をお貸しいただければ...(笑)
 (キリキ)

 お邪魔します。
いくつか気になった点があったのでちょろっと。

 >    days = (Split(Range("a1"), "/", -1)(2)) * 1
日付型を暗黙の変換により文字列として得る場合は、
必ずしもyyyy/m/dという並び&区切りでは無い可能性に注意。
上記式は日付を得たいのでしょうから、Day関数を用い、
    days = Day(Range("A1").Value)
と書くのも手。もちろんRange("A1")がDate型としてふさわしい事が前提。
同様に月を求める時はMonth関数、年を求める時はYear関数もあり。
 
 
該当月の月末日付を求める常套手段として、
「翌月1日の前日を求める」というのがあります。
日付の計算として、DateSerial関数というのがあり、上で示した関数を組み合わせ、
    days_data = Day(DateSerial(Year(Range("A1").Value), Month(Range("A1").Value), 1 - 1))
としてみる事も出来ます。
 
 
あとは…、
    Format(対象日付, "aaa")
っていう風に書くと曜日文字列を得られます。
Format("2004/01/01", "aaa") は "木" ね。
 
 
以上は考え方の一つとして参考になれば。
 
 
で、もう一つ、
 >                    For t = n To (days_data - days + 2) + (days - 1)
 >                        Cells(j, i) = .Cells(j - 1, t)
 >                        i = i + 1
 >                        If t = 8 Then
 >                            t = 1
 >                        End If
 >                        If Cells(1, i) = "" Then Exit For
 >                    Next t
について、For〜Nextのループカウンタである「t」をそのループ内でいじってしまってます。
これは危険。何かの書き間違い?一応突っ込み、って事で。
 
 
処理の流れ全体を見てないのですが、部分部分で思った事を書いて見ました。
(ご近所PG)でしゃばりで失礼。

 おっ、イチャモンPGさんのご登場でんな。(笑)
 キリキさん「待てば海路の日和あり」ですワ。
 私のマクロの一部をPGさんのんに置き換えてみてくらはい。随分コンパクトなコードに
 なりまっせぇ。

 ところで
 >((days_data - days + 1) + (days - 1)) + 1
 これの事ですけどナ。別にご当人が分かっとったら式はなんでもええんですワ。
 わたしんは(末日までの日数+セル調整)+(期日までの日数)とキチンと分けといた
 方がローテの変更を迫られたばやいに対応し易いようにしとるだけですからですから。
 ほら、わたしゃ頭悪いんで難しい式に仕立て上げとるとどこをどういじったらええんか
 うろたえなアキマヘンもんで、こういう式になってまいまんねんで、えぇ。

 >マクロ大御所PGさんへ
 フォローおおきに。
 ところで
 >「t」をそのループ内でいじってしまってます
 この事なんですけどナ。
 例えば
 Sub delete()
    Cnt = 10
    For i = 1 To Cnt
        If IsNumeric(Cells(i, 1)) Then
            Cells(i, 1).delete shift:=xlUp
            i = i - 1
            Cnt = Cnt - 1
        End If
        If i => Cnt Then Exit For
    Next i
 End Sub
 以上のようなマクロもアカンっちゅうことでっか?
    一手御指南を(弥太郎)

 ご近所PGさん、ありがとうございます。

 なるほど〜  1つの答えを出す為の手段・経路は色々あるということですね^^
 Day・Year・Month・Format関数... 〆(.. )メモ
 あっ エクセルの関数と似てるものもあるんですね〜 
 そこらへんから入ってみようかな〜

 弥太郎さん、いつもすいません

 セル調節は、自分がわかる場所ならどこでもいいって事ですね^^
 自分にも、弥太郎さんみたいな頭脳があればな〜^^;

 自分は、((days_data - days + 1) + (days - 1)) + 1 と
 セル調節部分を別にしないと、それこそ後で見たときにわからなくなりそうです。。。

 ループ処理の件ですが短めな例題を作り、慣れていくのが一番の近道でしょうか?
 (キリキ)

 長々と書きますよ?(笑)
 
まず最初に押さえておきたい点として、For〜Nextのヘルプを参照すると
「指定した回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。」
とあります。これを念頭においてください。
 
 >以上のようなマクロもアカンっちゅうことでっか?
動くか動かないかで言えば動きます。
が、
 >Cnt = Cnt - 1
と書いても、
 >For i = 1 To Cnt
のCntには影響を及ぼしません。
この事は例えば以下のようなマクロを作成して実行してみるとわかります。
    Cnt = 10
    For i = 1 To Cnt
        Cnt = Cnt - 1
        MsgBox CStr(i)
    Next i
メッセージボックスは10回表示されます。
 
ですが一応、
 >Cnt = Cnt - 1
と書くことで、Cntそのものの値は変わっていきます。
以下のマクロでそれがわかります。
    Cnt = 10
    For i = 1 To Cnt
        Cnt = Cnt - 1
        MsgBox CStr(Cnt)
    Next i
これにより、
 >If i => Cnt Then Exit For
という記述が有効に働き、For〜Next文を抜ける事が出来ています。
逆にいうと、
このループはExit Forが書かれていないと永久ループに陥る可能性のある怖いループである、
ともいえます。(実際は数値でないものが続けば必ず終わるでしょうけれど。)
これは、
「指定した回数だけ〜繰り返す〜」という、For〜Next文の考え方としては少々問題ありかな、
と考えます。
 
また、
 >i = i - 1
は、
「見ているセルの位置が先に進みすぎたので一つ戻す」
という意味になっていますが、それよりは
「今の場所の処理が終わったら次の場所へ移る」
という考え方の方が、しっくり来るのでは、と考えます。
 
で、どうせExit Forを書かないと抜けられないループになる可能性があるなら、
最初からそれを前提としたループを使おう、と考えます。
それがDo〜Loop文です。
以下にFor〜NextをDo〜Loopと置き換えた例を示します。
 
 Sub delete2()
    '変数宣言
    Dim i As Long
    Dim Cnt As Long
    '初期化
    i = 1 '1行目から見ていく
    Cnt = 10 '10行目まで対象とする
    '処理開始
    Do 'Do〜Loop間を繰り返し処理
        If IsNumeric(Cells(i, 1)) Then 'セルの値が削除条件に適合するなら
            Cells(i, 1).delete shift:=xlUp 'セルを削除し上へずらす
            Cnt = Cnt - 1 'セルを削除したので見る範囲を狭める
        Else '削除する必要のないセルなら
            i = i + 1 '次のセルを見る
        End If
        If i >= Cnt Then Exit Do '条件に適合したらループを抜ける
    Loop
 End Sub
 
処理内容は一緒です。どちらでも動作はします。
そういった意味ではどちらを使っても良いでしょう。
しかし、
抜けるタイミングがExit Do以外にはありえない、
見ているセルの移り変わりが明確になる、
という部分で、コードの主旨が明確になります。
取り合えず利点はそんなとこです。
 
また、この場合は抜ける条件が1つだけですので、
    Do Until i >= Cnt 'iがCntを越えたら終了
        If IsNumeric(Cells(i, 1)) Then 'セルの値が削除条件に適合するなら
            Cells(i, 1).delete shift:=xlUp 'セルを削除し上へずらす
            Cnt = Cnt - 1 'セルを削除したので見る範囲を狭める
        Else '削除する必要のないセルなら
            i = i + 1 '次のセルを見る
        End If
    Loop
と言うように書く方がより明確になるでしょう。
 
 
そして、今回例示として上げられた処理については、
上から順に見ていくという事が必須では無いならば、
以下のように書くとよりシンプルになりそうです。
 Sub delete3()
    '変数宣言
    Dim i As Long
    Dim Cnt As Long
    '初期化
    Cnt = 10 '10行目まで対象
    '処理開始
    For i = Cnt To 1 Step -1 'Cnt行から1行目に向けて処理
        If IsNumeric(Cells(i, 1)) Then 'セルの値が削除条件に適合するなら
            Cells(i, 1).delete shift:=xlUp 'セルを削除し上へずらす
        End If
    Next
 End Sub
 
以上、回答になったかしら。
 
追記:
 >(days_data - days + 2) + (days - 1)
 >((days_data - days + 1) + (days - 1)) + 1
について。
なぜ弥太郎さんは「+ 2」としているのか?
それは、2とはB列の事を指し示しているからだと思います。
だから、弥太郎さんはこの「2」を見えるようにしておきたい、
という考えに基づいて上記式を書いているんですね。
言って見ると、「2」の持つ意味がキリキさんには解りにくかった。
 
で、さらに突き詰めると現状結局は「days_data = 最大列数」になっているのではと思います。
10月なら31列分データがあって、11月なら30列データがある、んですよね。
それをあえて分けて書いているのは、思考過程を残したかったから、でしょう。
個人的にはdays_data = 最大列数と考える方が自然に思えるので、私なら
    days_data + 2 - 1
と書くかな。
で、重要なのは「列の開始位置が現状ではB列であるが、それがもし変わったら?」
という点なのでしょうから、その点を考慮し、
    Const CstStartCol As Long = 2 'データ開始列位置
という定数(あるいは変数)を作っておいて、
    For n = CstStartCol To days_data + CstStartCol - 1
と書いて見るのが、後々見やすいかと思うけれど、どうかしら。
 
(ご近所PG)我ながら長い…ちょい修正

  >我ながら長すぎたか…
 いや、いや、初心者であるわたしにゃとても解りやすい解説でした。おおきにです。
 なぁるほど、こういうばやいは確かにDo Loopで処理すべきでんなぁ。納得、納得。
 For Nextやと確かにStep-1というせこいやり方(ぜうだんデスヨ(笑))が適して
 まんなぁ。
 あのぅ、長い解説にしてはお礼の言葉が少なすぎますけど、あらためておおきに。

 To キリキさん。
 >ループ処理の件ですが短めな例題を作り、慣れていくのが一番の近道でしょうか?
 えぇ、どんなに短いループでもそれが廻りさえすれば後は色んな条件を放り込んで
 も大丈夫でっせ。
 それと
                      For t = n To (days_data - days + 2) + (days - 1)
                         Cells(j, i) = .Cells(j - 1, t)
                         i = i + 1
                         If t = 8 Then
                             t = 1
                         End If
                         If Cells(1, i) = "" Then Exit For
                     Next t
 このループは芳しくないようなんで、PGさんのんを参考に書き換えてみてくだはい。
 うれしい課題がひとつでてきましたなぁ。 (笑い)

 まあ、なんですわ。イキのええ「や」のつく若鮎をおとりに釣り糸たらしたら、
 なんと巨大なマクロ、じゃない、マグロが引っかかったといった図柄でんなぁ。(笑)
 キリキさん、ラッキー。
 また、「や」の付くおとりを使うてみておくんなはれ。
       ほな(弥太郎)

 ご近所PGさん>大変わかり易い説明ありがとうございました^^

 >言って見ると、「2」の持つ意味がキリキさんには解りにくかった。
 そうんなんですよ〜  最初「2」の意味がチンプンカンプンだったんです。
 ご近所PGさんの説明で大変よくわかりましたし、弥太郎さんの親切なマクロを
 あらためて知りましたし、弥太郎さんの優しさがそのままマクロとなっている気が
 しました。

 >それをあえて分けて書いているのは、思考過程を残したかったから
 まさに初心者の私には、思考過程ほど重要なことはありません。

 弥太郎さん>課題の件ですが、勉強しながら時間を掛けて行いたいと思います。

 >また、「や」の付くおとりを使うてみておくんなはれ。
 おとりだなんて、とんでもない!!
 また困ったことがあったら、よろしくお願いいたします。
 (すぐに困りだしそうなキリキ)

 早速、困りました。。。

 上記の
 >該当月の月末日付を求める常套手段として、
 >「翌月1日の前日を求める」というのがあります。
 >日付の計算として、DateSerial関数というのがあり、上で示した関数を組み合わせ、
 >    days_data = Day(DateSerial(Year(Range("A1").Value), Month(Range("A1").Value), 1 - 1))
 での答えが30になるのですが、、、なぜ?(A1=2004/10/16)
 とりあえず、+1をして帳尻を合わせてしまいましたが、どうしてでしょう?
 (キリキ)

 Month(Range("A1").Value)は"2004/10/16"の「何月」を求めているのだから、
数式全体では"2004/10/0"。
「翌月1日の前日を求める」なら
Month(Range("A1").Value)+1
(みやほりん)

 みやほりんさん、ありがとうございますm(_ _)m
 >数式全体では"2004/10/0"。
 この説明は、すごくわかりやすかったです。
 (キリキ)

 おっとっとっと、今度は元祖「弥太郎の守護神」の登場でんな。(笑)
 まぁ、今更キリキさんにご説明申し上げるまでもなく、みやさんは元「KAMIYA」のHN
 でこの学校を震撼させた切れ者(別にナイフを懐に忍ばせとる訳やおまへん)ですさか
 いナ、あん人の言う事やったら間違いおまへんワ。
 なんせこの学校じゃ極めて稀な守備範囲の広いオールラウンドプレーヤーですからな、
 大事に扱うとって損はおまへんでぇ。
 ただ、チョット変人なんが玉に瑕ですけどナ。(笑)
 ついでに申し上げときますけど、いつまで経っても独り立ちでけへん弥太郎めを
 「しゃあないやっちゃ」と、渋々サポートに乗り出させる人徳っちゅうもんが私にゃ
 備わってまんねんで、えぇ、えぇ。(どこが人徳やねん、笑)
 せやから無責任なマクロをまき散らす事がでけるんデスヨ。
 もひとつ。
    変人=おもろい人
       ほな・・・(弥太郎) 

 ぅゎーぃ私ってばミスってましたね、みやほりんさんフォローありがとう。
てことで解決されたでしょうが、訂正…
誤)days_data = Day(DateSerial(Year(Range("A1").Value), Month(Range("A1").Value), 1 - 1))
正)days_data = Day(DateSerial(Year(Range("A1").Value), Month(Range("A1").Value) + 1, 1 - 1))
 
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


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