プロが教える店舗&オフィスのセキュリティ対策術

今エクセルマクロを作っていて、いいところまではいってるんですが完成には至らなくて困っています。すでにシート1のA1からA40のところまで40番までの人の番号と、B1からB40のところまで名前と、C3からAF40のところまで1日から31日までの出席情報がかかれています。(出席なら◯、欠席なら×、遅刻なら△です)。そしてシート上につくった出席というボタンを押すと何番ですか?とインプットボックスが出てきて例えば1と入力したら番号が1の人の出席数だけがカウントされて、出席数は◯◯ですというメッセージが出てくるようにしたいです。どのようにプログラムを設計したらいいんでしょうか?

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

  • エクセルのシート状で関数使って数えた方がはやいのですがエクセルマクロを使ってつくるという課題だからそのようにつくりたいです

      補足日時:2018/12/15 18:11

A 回答 (5件)

こんばんは。



学生さんですか?高校生ぐらいでしょうか?入門編で、このぐらいのマクロの問題ができるのは、クラスで1人か2人で、たぶん経験者です。練習用としては、ワークシートの関数はなるべく使わないようにします。

>いいところまではいってるんですが完成には至らなく
うまくいかないのは、間違えているわけで、それがクリアしないと学校では、50点を貰えるかもしれませんが、仕事や掲示板の回答者では、0点であるということです。私は、何度も悔しい思いをしました。VBAプログラミングは完成して初めてマクロと呼びます。

このレベルでも、ヒントが出ていないと、たぶん出来ないのではないかと思います。
仮のサンプル表の画像を貼り付けましたから、それをみてください。

'//
Sub BUTTON1_Click()
 Dim d As Date
 Dim num As Variant
 Dim i As Long
 Dim j As Long
 Dim cnt As Long
 d = Range("C1").Value  '日付の始まり
 cnt =0
'エラー処理
 If Day(d) <> 1 Then MsgBox "表が正しくありません。", vbExclamation: Exit Sub
 num = Application.InputBox("何番ですか?", "出席番号")
 If num = False Then Exit Sub
 If WorksheetFunction.CountIf(Range("A3:A40"), num) = 0 Then
  MsgBox "出席番号は見つかりません。", vbExclamation: Exit Sub
 End If
'---------実際のコード---------
 For i = 1 To 40
  If Val(num) = Trim(Cells(i + 2, 1).Value) Then
   For j = 1 To Day(DateSerial(Year(d), Month(d) - 1, 0))  '月末まで
    If Cells(i + 2, j + 2).Value Like "○*" Then
     cnt = cnt + 1
    End If
   Next j
   Exit For
  End If
 Next i
 MsgBox Cells(i + 2, 1).Value & "番:" & Cells(i + 2, 2).Value & " さんの出席数は" & vbCrLf & _
  cnt & "日 です。"
End Sub
「今エクセルマクロを作っていて、いいところ」の回答画像5
    • good
    • 0

課題で、しかも良いところまでできている・・・ということであれば、



何が悪くて意図した通りに動かないかを質問しないとダメだろ。
 「良いところまではできているんだけど、代わりに作ってください」
って、どうなの?

今現在できているコードと、その結果どうなるか、
または途中まででも意図した通りになるコードを併記し、
どう修正すれば良いか、何を追加しなければならないかを質問するようにしましょう。
(「補足」に書けるんじゃないかな)
    • good
    • 0

>エクセルのシート状で関数使って数えた方がはやいのですがエクセルマクロを


>使ってつくるという課題だからそのようにつくりたいです

それができるのであれば、それをマクロ化すればよいだけです。
具体的には、マクロで、セルにワークシート関数の数式を貼り付けて計算させる。そして、答えを求めた後でセルに記載した数式をマクロで消去する。
これもれっきとしたマクロを使った求め方です。
記述方法は、range(○○).formula = "=sum(○○)" または cells(○○).formula = "=sum(○○)" です。.fomulaをつけることで数式だと認識されます。当然右辺は記述方法も含めてワークシート関数です。
R1C1形式にしておけば、変数によるセル指定も可能です。通常はA1形式だと思いますので、A1形式→R1C1形式の切り替えをマクロの初めのほうに記述しておきます。最後にR1C1形式→A1形式に戻します。
私は、このやり方をよく使います。かなり使えるやり方です。


どこで行き詰っているか具体的に示さないと、アドバイスもできません。
No.1さんも書かれていますが、作成中のマクロを載せてみては?回答がつきやすいと思います。
    • good
    • 0

>>どのようにプログラムを設計したらいいんでしょうか?



日本語で書くと、簡単に思えることでも、それをプログラミングに変換しようとすると、いくつもの処理を書かないと実現しないことが多いです。
まずは、「○○の結果を表示するには、こういうデータが必要だよな、そのデータを得るにはAって処理が必要だ。Aの処理を行うには、その前にBって処理が必要だよな・・・」って日本語でおおざっぱに流れを日本語で書いてみます。
その中でAの処理が大きすぎるとおもえば、A1,A2・・・とさらに細分化・分割していくことになりますね。
そして、日本語で処理の流れが表現できて、その先のコードもおよそどうなるか想像できたら、コーディング&テストしながら作っていけばいいと思います。

また、最初から100%のものを作ろうとしないで、機能限定版的に作って、そこそこ動くようになったら、肉付けしていけばいいでしょうね。
たとえば、「Bの処理ができていたら、こういうデータが得られるはず。そのデータが得られたとして、固定値を与えて、それ以降の処理を作ってみよう」とか。

とりあえず、機能が乏しくとも、目に見える動作をするものができると、「続けて頑張ろう!」ってモチベーションがアップしますからね。
    • good
    • 0

その、いいところまでいっているマクロを書いていただくといいと思いますよ。



ちなみに、例えばCに1列追加して、C3に
=COUNTIF(D3:AG3,"○")
で表示した方が便利なような気がしますがいかがでしょうか。
    • good
    • 0

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