Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7021 / 13644 ツリー ←次へ | 前へ→

【41205】期間を判定し、予定表をつくりたい mori3 06/8/1(火) 20:01 質問[未読]
【41207】Re:期間を判定し、予定表をつくりたい ichinose 06/8/1(火) 20:22 発言[未読]
【41239】Re:期間を判定し、予定表をつくりたい mori3 06/8/2(水) 21:33 発言[未読]
【41240】Re:期間を判定し、予定表をつくりたい ichinose 06/8/2(水) 22:22 発言[未読]
【41336】Re:期間を判定し、予定表をつくりたい mori3 06/8/6(日) 17:25 お礼[未読]
【41454】Re:期間を判定し、予定表をつくりたい りお 06/8/10(木) 20:50 質問[未読]
【41464】Re:期間を判定し、予定表をつくりたい ichinose 06/8/11(金) 7:10 発言[未読]
【41489】Re:期間を判定し、予定表をつくりたい りお 06/8/12(土) 2:32 発言[未読]
【41491】Re:期間を判定し、予定表をつくりたい ichinose 06/8/12(土) 4:13 発言[未読]
【41597】Re:期間を判定し、予定表をつくりたい ichinose 06/8/15(火) 14:26 発言[未読]
【41598】Re:期間を判定し、予定表をつくりたい りお 06/8/15(火) 22:37 発言[未読]
【41599】Re:期間を判定し、予定表をつくりたい ichinose 06/8/16(水) 8:31 発言[未読]
【41709】Re:期間を判定し、予定表をつくりたい りお 06/8/21(月) 0:00 お礼[未読]

【41205】期間を判定し、予定表をつくりたい
質問  mori3  - 06/8/1(火) 20:01 -

引用なし
パスワード
   いつも拝見させていただいております。
今回は質問で伺わせて頂きました。

たとえば8/1〜2007年の1/31の期間がどれだけあるのかを判定し
予定表をつくりたいと思っております。
上記の例であると6ヶ月とカウントし

A   B   C   D   E    F 
8月 9月 10月 11月 12月 2007年1月

と表示させ
msgbox "予定表を作成しますか?"
につなげたいと思っています。

期間の月のカウントとそれを書き出すには
どうしたらよいのでしょうか?
ご教授宜しくお願い致します。

【41207】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/1(火) 20:22 -

引用なし
パスワード
   ▼mori3 さん:
こんばんは。

>
>たとえば8/1〜2007年の1/31の期間がどれだけあるのかを判定し
>予定表をつくりたいと思っております。
>上記の例であると6ヶ月とカウントし
>
>A   B   C   D   E    F 
>8月 9月 10月 11月 12月 2007年1月
>
>と表示させ
>msgbox "予定表を作成しますか?"
>につなげたいと思っています。
>
>期間の月のカウントとそれを書き出すには
>どうしたらよいのでしょうか?


Datediffっていう便利な関数がありますよ!!

Sub test()
  Dim d1 As Date
  Dim d2 As Date
  d1 = "2006/8/1"  'こんな記述すると日付が文字列だなんて
  d2 = "2007/1/31" '思ってしまいそうですが、違いますよ!!
  MsgBox DateDiff("m", d1, d2) + 1
End Sub

【41239】Re:期間を判定し、予定表をつくりたい
発言  mori3  - 06/8/2(水) 21:33 -

引用なし
パスワード
   ▼ichinose さん:
>>
>>8/1〜2007年の1/31の期間がどれだけあるのかを判定。
>>上記の例であると6ヶ月とカウント。
>>[sheet1]
A      B
2006/8/1 2007/1/31

>>[sheet2]
>>A   B   C   D   E    F 
>>8月 9月 10月 11月 12月 2007年1月
>>
>>期間の月のカウントとそれをsheet2のように書き出すには
>>どうしたらよいのでしょうか?
>
>Datediffっていう便利な関数がありますよ!!
>
>Sub test()
>  Dim d1 As Date
>  Dim d2 As Date
>  d1 = "2006/8/1"  'こんな記述すると日付が文字列だなんて
>  d2 = "2007/1/31" '思ってしまいそうですが、違いますよ!!
>  MsgBox DateDiff("m", d1, d2) + 1
>End Sub

ありがとうございます!!!カウントについて、解決できました! 
次に月の書き出しについて一日考えていたのですが・・・

sub test()
dim rg as range
dim rgall as range

set rg=worksheets(2).range("A1")
set rgall=worksheets(2).range("A1:F1")
rg.value=worksheets(1).range("A1")
rg.autofill destination:=rgall,type:=xlfillmonths
rgall.numberformatlocal="yyyy年mm月"
set rg=nothing
set rgall=nothing
end sub

これだと"F1"まで入力!、期限は1月まで!って指定しちゃってますよね・・・
解けそうでなかなか解けません。

【41240】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/2(水) 22:22 -

引用なし
パスワード
   こんばんは。


>次に月の書き出しについて一日考えていたのですが・・・
>
>sub test()
> dim rg as range
> dim rgall as range
>
> set rg=worksheets(2).range("A1")
> set rgall=worksheets(2).range("A1:F1")
'ここのFの代わりに月の数を反映させればよいですね!!

> rg.value=worksheets(1).range("A1")
> rg.autofill destination:=rgall,type:=xlfillmonths
> rgall.numberformatlocal="yyyy年mm月"
> set rg=nothing
> set rgall=nothing
>end sub
>
>これだと"F1"まで入力!、期限は1月まで!って指定しちゃってますよね・・・
>解けそうでなかなか解けません。

仮に

アクティブシートのセルA1に開始年月日(前回の例で言う2006/8/1)
セルB1に終了年月日(前回の例で言う2007/1/31)が入力されているとします。

月の書き出しはセルA2からB2、C2・・・作成することを
考えます。


標準モジュールに

'======================================================================
Sub test()
  Dim mcnt As Long
  mcnt = DateDiff("m", Range("a1").Value, Range("b1").Value) + 1
  With Range("a2")
    .Value = Range("a1").Value
    If mcnt > 1 Then
     .AutoFill _
       Destination:=Range("A2", Cells(2, mcnt)), _
       Type:=xlFillMonths
     End If
    .Resize(, mcnt).NumberFormatLocal = "yyyy""年""m""月"""
    End With
End Sub


これでA1が2006/8/1 B1が2007/1/31だった場合、

A2〜F2の範囲に 2006年8月 2006年9月 ・・・2007年1月

と書き込みます。


試してみてください。

【41336】Re:期間を判定し、予定表をつくりたい
お礼  mori3  - 06/8/6(日) 17:25 -

引用なし
パスワード
   お礼が遅くなり申し訳ありません。
希望通りに動きました。
ありがとうございます!!!

【41454】Re:期間を判定し、予定表をつくりたい
質問  りお  - 06/8/10(木) 20:50 -

引用なし
パスワード
   こんばんは。
すでに解決済みなのですが
横やりですみません。

質問のように
A1から期間分、列方向に並べていくのはわかるのですが
これは決まったセル内で並べることはできますか?

8月から4月まで続けて書きたい場合
AからIまでしか入れる余裕がなくて
A   B   C    D   E   F   G    H   I
1月  2月  3月  4月  8月  9月  10月  11月  12月

というようにやりたいのですが・・
(I1まで埋まったらA1に戻って必要分上書きする)

【41464】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/11(金) 7:10 -

引用なし
パスワード
   ▼りお さん:
おはようございます。

私が仕様を理解できていません・・・。


>
>質問のように
>A1から期間分、列方向に並べていくのはわかるのですが
>これは決まったセル内で並べることはできますか?

>8月から4月まで続けて書きたい場合

は、

>AからIまでしか入れる余裕がなくて
>A   B   C    D   E   F   G    H   I
>1月  2月  3月  4月  8月  9月  10月  11月  12月
>
>というようにやりたいのですが・・
>(I1まで埋まったらA1に戻って必要分上書きする)

という結果をだすとして、

例えば、

8月から、7月の場合は、どのような結果になるのですか?

もうひとつ、1月から 12月という場合は、どのような結果になるのですか?

上記の8月から4月までのような結果を示してください。

【41489】Re:期間を判定し、予定表をつくりたい
発言  りお  - 06/8/12(土) 2:32 -

引用なし
パスワード
   ▼ichinose さん:
ご返答ありがとうございます。
>
>私が仕様を理解できていません・・・。
書き方が悪くすみません。。。
>>
>>8月から4月まで続けて書きたい場合は、
>>AからIまでしか入れる余裕がなくて
>>A   B   C    D   E   F   G    H   I
>>1月  2月  3月  4月  8月  9月  10月  11月  12月
>>
>>というようにやりたいのですが・・
>>(I1まで埋まったらA1に戻って必要分上書きする)
>
>という結果をだすとして、
>
>例えば、
>
>8月から、7月の場合は、どのような結果になるのですか?
結果としては上記の例と同じです。
9個のセル内に書けなかった5月から7月分は別シートに書くことになっていますので考えていません。
スタートする月がA1から書ければいいのですが
例のようにE1から書かなければならなかったり
F1から書かなければならなかったりでばらばらなんです。

F1からの場合はこうなります。
A    B   C    D   E   F   G    H   I
12月  1月  2月  3月  4月  8月  9月  10月  11月

>
>もうひとつ、1月から 12月という場合は、どのような結果になるのですか?

A1から入力する場合はIまで9ヶ月分を入力します。
A   B   C    D   E   F   G    H   I
1月  2月  3月  4月  5月  6月  7月   8月   9月
10月から12月分は考えません。
またスタート月の入力がF1から始まったりすることもあります。
その場合は
A   B   C    D   E   F   G    H   I
5月  6月  7月  8月  9月  1月  2月   3月   4月
です。

A1からではなくF1からのように途中から始まってもI1まで入力されたら
A1に戻って入力を続けることは可能なんでしょうか?

(ああ〜うまく伝わったでしょうか??)

【41491】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/12(土) 4:13 -

引用なし
パスワード
   ▼りお さん:
おはようございます。
わかりました。

アクティブシートのA1〜I1に書き込むコードです。

尚、A2には月の書き込み開始セル列番号
 B2に書き込み開始月
 C2に書き込み終了月
を入れておきます。

例1

8月〜4月という月をセルE1を開始セルとしたい場合、

A2  5
B2  8
C2  4
と入力してmainを実行します。

例2

8月〜7月という月をセルF1を開始セルとしたい場合、

A2  6
B2  8
C2  7
と入力してmainを実行します。

例3

1月〜12月という月をセルF1を開始セルとしたい場合、

A2  6
B2  1
C2  12
と入力してmainを実行します


標準モジュールに
'=============================================================
Sub main()
  Dim st As Long
  Dim stm As Long
  Dim edm As Long
  Dim idx As Long
  Dim lim As Long
  st = Range("a2")
  stm = Range("b2").Value
  edm = Range("c2").Value
  idx = st
  Dim myarray(1 To 9) As Variant
  lim = UBound(myarray())
  Do Until Month(DateSerial(Year(Date), stm, 1)) = edm Or idx = st + lim
   myarray(IIf(idx Mod lim = 0, lim, idx Mod lim)) = DateSerial(Year(Date), stm, 1)
   idx = idx + 1
   stm = stm + 1
   Loop
  If Month(DateSerial(Year(Date), stm, 1)) = edm Then
    myarray(IIf(idx Mod lim = 0, lim, idx Mod lim)) = DateSerial(Year(Date), stm, 1)
    End If
  With Range("a1:i1")
    .Value = myarray()
    .NumberFormatLocal = "m""月"""
    End With
End Sub

尚、今から出かけてしまうので
問題があった場合は、投稿は15日以降になってしまいます。

確認してください。

【41597】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/15(火) 14:26 -

引用なし
パスワード
   ▼りお さん:
こんにちは。

出かける直前にあせって投稿したので、訂正です。

>標準モジュールに
>'=============================================================
>Sub main()
>  Dim st As Long
>  Dim stm As Long
>  Dim edm As Long
>  Dim idx As Long
>  Dim lim As Long
>  st = Range("a2")
>  stm = Range("b2").Value
>  edm = Range("c2").Value
>  idx = st
>  Dim myarray(1 To 9) As Variant
>  lim = UBound(myarray())
>  Do Until Month(DateSerial(Year(Date), stm, 1)) = edm Or idx = st + lim
>   myarray(IIf(idx Mod lim = 0, lim, idx Mod lim)) = DateSerial(Year(Date), stm, 1)
>   idx = idx + 1
>   stm = stm + 1
>   Loop
>  If Month(DateSerial(Year(Date), stm, 1)) = edm Then
>    myarray(IIf(idx Mod lim = 0, lim, idx Mod lim)) = DateSerial(Year(Date), stm, 1)
>    End If
>  With Range("a1:i1")
>    .Value = myarray()
>    .NumberFormatLocal = "m""月"""
>    End With
>End Sub



'==============================================================
Sub main()
  Dim st As Long
  Dim stm As Long
  Dim edm As Long
  Dim idx As Long
  Dim lim As Long
  st = Range("a2")
  stm = Range("b2").Value - 1
  edm = Range("c2").Value
  idx = st
  Dim myarray(1 To 9) As Variant
  lim = UBound(myarray())
  Do
   stm = stm + 1
   myarray(IIf(idx Mod lim = 0, lim, idx Mod lim)) = _
             DateSerial(Year(Date), stm, 1)
   idx = idx + 1
   Loop Until Month(DateSerial(Year(Date), stm, 1)) = edm _
          Or idx = st + lim
  With Range("a1:i1")
    .Value = myarray()
    .NumberFormatLocal = "m""月"""
    End With
End Sub

とすると、ちょっとだけすっきりしました。

コードの仕様は同じです。

確認してください。

【41598】Re:期間を判定し、予定表をつくりたい
発言  りお  - 06/8/15(火) 22:37 -

引用なし
パスワード
   お忙しい中、ありがとうございます!

やってみたのですが
型が一致しませんというエラーが出てしまいます。
コンパクトなコードも教えていただいたので
もう少しやってみます。

【41599】Re:期間を判定し、予定表をつくりたい
発言  ichinose  - 06/8/16(水) 8:31 -

引用なし
パスワード
   ▼りお さん:
>お忙しい中、ありがとうございます!
>
>やってみたのですが
>型が一致しませんというエラーが出てしまいます。
>コンパクトなコードも教えていただいたので
>もう少しやってみます。

[#41491][#41597]では、大きくアルゴリズムが変わっているわけでは
ありませんから、[#41491]でエラーが発生するなら、[#41597]でも
発生する可能性は大です。

で、こういう場合は、

1.新規ブックにて提示コードを確認すること。
  りお さんが抱えている作業中のブックでなく、
  新規ブックにコードをコピーして実行してみること。
  これは、少しでも私とりお さんが同じブックを見るためです。

2.このコードには、入力データがありますよね?
  アクティブシートの セルA2、B2、C2ですね?
  エラーが発生した場合は、
  入力データがxxxxxの時、提示コードを実行すると、
  
  YYYYYYYYYYY
  
  という箇所で「ZZZZZZZZ」というエラーが発生し、プログラムが
  停止してしまいます。

  というような記述をしてください。

  だって、そうしないと私が再現できませんので・・・。


「型が一致しません」というエラーでプログラムが停止してしまう場合を再現すると

セルA2に  5
セルB2に  8月
セルC2に  4月

なんて入力して、[#41491] 及び、[#41597]を実行すると、
確かに「型が一致しません」というエラーが

stm = Range("b2").Value - 1

[#41597]の場合)で発生します。


この入力データであるセルA2、B2、C2には、あくまでも数値です。
(セルの書式は標準書式で試してください)
月という単位は付きません。

型が一致しません というエラーで思いつくのはこの例ですが、
他の例でしたら、再現手順をお願いします。

【41709】Re:期間を判定し、予定表をつくりたい
お礼  りお  - 06/8/21(月) 0:00 -

引用なし
パスワード
   こんにちは。
お礼が遅くなり申し訳ありません。
コードに気を取られ、8月と入力していることに
気づきませんでした。
ありがとうございました!!

7021 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free