プロが教えるわが家の防犯対策術!

ワークシート“日別”のシートからワークシート"曜日別“に転記しなくてはなりません。シート"日別"のそれぞれの日付が、何週目の何曜日かに基づいて、シート"曜日別"に順番にデータを転記しなくてはいけません。
曜日別の時にMod関数を使わないといけないのですが、全く分からなくてVBAを使うんですけど教えてください。

「VBA.Mod関数について」の質問画像

質問者からの補足コメント

  • VBAでコマンドボタンを設定してやりたいです…

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/11/27 14:26
  • ありがとうございます!
    はい、Mod関数を使うという決まりがあります。
    VBAでコマンドボタンを作ってやらなくてはいけなくて、全く分からず困っていて…

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/11/27 14:32
  • コマンドボタンを設定してVBAでMod関数を使わなくてはいけません。どなたかやり方教えてくださる方いますか?当方、プログラミングに関して無知でありますので定義の示し方もあやふやです、、、。

      補足日時:2020/11/27 14:34

A 回答 (5件)

shut0325です。



>Mod関数を使わなくてはいけません。

日付というのはシリアル値(簡単に言えば連番)なのはご存じでしょうか?
1900年1月1日(日曜日)からの日数です。
実際にはその数値を日付形式で見ているだけにすぎません。
日付を表した文字列から、シリアル値を求めるのは、DATEVALE関数です。

※これがちょっと感覚的にややこしいかもしれません。
※任意のセルに適当な数値(整数)を入れ、そのセルの表示形式を「自動」から日付形式に変えてみるとわかります。


週数や曜日を求めるのは簡単です。7で割ればいいのですから。

MOD関数はあまりを求めるものですから、余りで日~土までがわかります。
丁度割り切れた場合、0で日曜日、6で土曜日になります。

曜日は先ほど書いたWeekday関数は

MOD(該当セルの値,7)+1

で表せます。実際には第1週の日曜日のセルが基準で、そこからどれだけ列を移動した(オフセットした)セルに値を入れるか? なので、+1せずに使用することになるかと思います。(日曜日の場合、列方向は基準セルと同じ=移動なし=0)

※ここで言う該当セルの値、、というのは処理をするセルの日付(厳密には日付のシリアル値)を意味します。

何週目かは(該当日のシリアル値から起点日のシリアル値を引き、7で割った商のを切り上げたものになります。切り上げにはROUNDUP関数を使用します。

つまり
まず、2020/1/1から何日目かをわりだすには、

Nannichi =(該当セルの値-DATEVALE(”2020/1/1”)

と表せ、これを7で割り切り上げるので、

shuusu = ROUNDUP(Nannichi/7,0)

と表現できます。

これも週と同じで、基準セルからの行オフセット値として利用する際はshuusuから1引くか、改めて計算する際に切り捨て(ROUNDDOWN)または、整数商(QUOTIENT関数)を使用します。

例: ROUNDDOWN(Nannichi/7,0) または QUOTIENT(Nannichi/7)


基本部分は以上となりますが、学校の課題か何かでしょうか?


MODを使うようにしたのは、そういった全体の考え方を問うものだとおもいます。実際の細かい条件・仕様がわかれば、私なら、簡単にできると思いますが、それでは意味がないと思います。

プログラムは課題解決の手法・手順を表したものですから、問題解決能力を問うているのと同じです。

「人にやってもらう」も良く使う手法ではありますが、そのような縛り(MOD縛り)を付けていることからも、それは適切ではないと思います。


ボタンを押したら処理をする。が一つの課題。
これは、ボタンを押したらメッセージが出る。というのすればつかめるでしょう。 というか、新しいプログラミング言語を習得する際には真っ先にやる儀式みたいなものです。

あとはプログラミングの記述ルールををしり、処理の基本で、順次処理・繰り返し処理・条件分岐を使ってやればできます。

正直、やっていない人には、「何が何だか」の世界だと思いますが、簡単なものを徐々に拡張していきながら完成へと向けられてください。
    • good
    • 0
この回答へのお礼

丁寧に教えていただきありがとうございました。
教えていただいたのを参考にちょこちょこやっていこうと思います。

お礼日時:2020/11/27 21:00

どこを求める時にMod関数を使わなければならないのでしょうか・・・?


余りを求めてどうのこうのしようとしたいプロセスが分からないのですが。
    • good
    • 0

>曜日別の時にMod関数を使わないといけない



これはしばり(決まり事)ですか?

そうでないなら、Weekday関数で簡単に解決できると思うのですが。
週別はWeekNum関数です。

「順番に」とあるのですが、図(ちょっと見えませんが)からすると、日曜日をスタートとして、列を一つずつずらして記入するということですよね?

集計・リストアップ、、という感じの仕様ですね。

さて、Weekday関数の戻り値は1~7の整数で1が日曜日です。
WeekNum関数は、WeekNum(日付,開始曜日番号)です。
日曜日を起点とする場合、開始曜日番号は1となります。

今日の日付で考えてみましょう。

A1セル:2020/11/27

B1セル:=WeekNum(A1,1)
→48(週目)

C1セル:=Weekday(A1)
→6(金曜日)

となります。

では、週頭の日付を求めるには?
D1セル:=A1-C1+1
→2020/11/22

週末(土曜は)
E1セル:=A1+6+C1 または D1+6
→2020/11/28

こういった具合です。

あとは、基準からの差異(オフセット)を指定して値を代入していけばよいと思います。

2020/1/1~の週(第1週)の日曜日のセルが基準ですね。

VBAに慣れておらず、頻繁にやる作業でないなら、セルで週数と曜日(番号)を該当行のところに関数で書いておいて、それを参照して、オフセット指定でセルに値を代入(加算?)していく方が良いようには思います。
この回答への補足あり
    • good
    • 0

日別シート


A列 日付
B列 数値

曜日別シート
A列 週初日付
B~H列 曜日ごとの集計値

だと仮定した場合、曜日別シートのB~H列に
=IFERROR(VLOOKUP(A2+0,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+1,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+2,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+3,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+4,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+5,Sheet1!$A:$B,2,FALSE), 0)
=IFERROR(VLOOKUP(A2+6,Sheet1!$A:$B,2,FALSE), 0)

を入れて、行コピーしていけばいいです。

なお、曜日別シートのA列週初の日付は、1行目を正しく週初の日付を入れておけば、2行目以降は
=A2+7
とすれば週初の日付になります。

VBAでやりたいなら、
Application.Evaluate("上記の=を除いた数式")
または
application.WorksheetFunction.IfError(application.WorksheetFunction.VLookup(上記VLOOKUPの数式), 0)
を使ってください。
この回答への補足あり
    • good
    • 0

IOの仕様(何を入力して、何を出力する?)は?


使ってよい関数は指定されているのか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!