ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュのタイムカードの計算をするために

  • mixiチェック
  • このエントリーをはてなブックマークに追加
COXです。よろしくお願いします。
初めて書き込みさせていただきます。VBA初心者です。

給与計算の下準備にタイムカードの計算を「MS EXCEL 2003」を使って作ろうと考えています。タイムカードに出社時間と退社時間を素早く入力していくために、(これはテスト用のシートですが、)「選択」ボタンのスクリプトを下のように作りました。
----------------------------------------------------------------
Private Sub CommandButton1_Click()

'セル範囲に「D1」のセルデータ「時刻の入力」を入れる
Range("D5:E35").Name = Range("D1")

'セル範囲に「D1」のセルデータ「出社時刻」を入れる
Range("D5:D35").Name = Range("D2")

' セル「C4」を基本的なセルと指定し、以後の計算をそのセル位置から計算する
Range("C4").Select

' セル範囲「時刻」に「12:00」を入れる
Range("出社時刻").Value = Range("E2")

Dim i As Long

  For i = 1 To 31
Range("B5").Item(i, 2).Select
If Range("B5").Item(i, 2).Text = "--" Then
Range("B5").Item(i, 3) = ""
Range("B5").Item(i, 4) = ""

Range("E8").Item(i - 3, 2).Value = ActiveCell.Address

End If
Next

Range("時刻の入力").Select

End Sub
----------------------------------------------------------------
 ボタンをクリックした結果が「写真1」です。F13~F15は曜日に「--」の入っているセルを出しました。この状態でもなんとか使えるのですが、もう少し完成度を高めたいと欲張っています。希望は、最終的な選択状態を「Range("D5:E12,D16:E35)」(3月度の出社時間と退社時間の入力が必要なセルだけを選択状態にする。空白部分は選択しないようにする。)にしたいと考えているのですが、どの様にすればいいのか分からず、悩んでいます。何方か解決方法がお分かりの方がいらっしゃいましたらご教示下さい。よろしくお願いします。

 また、社員の数だけこのような計算表(社員一人分のタイムカード計算を完結する表の領域)を同じシートに複数配置しようと考えています。社員数は10人程度なので、一つのシートに社員数分だけコピーし、同じシート上に集計表を作ろうと考えています。

 そのために、『セル「C4」を基本的なセルと指定し、以後の計算をそのセル位置から計算する』としたのですが、この表とボタンを(例えば)A50:F85くらいの位置にコピー・ペースとしても、ボタンのスクリプトは何カ所も(セルの番号など)変更しなければならないと思います。どの様にすれば、一つ作った表をコピー&ペースとして、出来るだけ修正箇所を少なくして、複数作ることが出来るのでしょう?

 また、もし意味のないスクリプトの部分があればご指摘下さい。

 分かりにくい文章かと思いますが、よろしくご教示下さい。

コメント(12)

<ヒント>

[1] Dim * As Object
[2] Dim * As Range
[3] .Offset(Column,Row)
[3] For Each * In * 〜 Next
[4] 標準モジュール
[5] <シートモジュールレベル>
  Private Sub CommandButton1_Click()
   Call 標準モジュール.SUB名(Me)
  End Sub
[6] <標準モジュールレベル>
  Sub SUB名(ByVal Me As Object)
   〜
   :
   〜
  End Sub

----------------------------------------------------------------

<語句間違い>

VBAではスクリプトとは言わずコードと言う。
VBSではコードともスクリプトとも言う。
 魔流さん、ヒントありがとうございます。

 しかし...、ちょっと(じゃなくて大分かな?)、僕には難しすぎるような気がします。(EXCELのVBAには初めて首を突っ込んだばかりなんです。)答えが出れば、一つの表にコード(と言う言い方でいいのかな?)を埋め込んで、複数の表を一つのシートに置くことができるのでしょうか...? (「.Offset(Colum,Row)」を見てそんな風に感じているのですが、その使い方がぜんぜん理解できていません。しっかり勉強しなくてはいけませんね。)

 もうちょっと易しい(?)部分(と言っても、分からなくてここで訊いているのですが)、セレクト部分を分割する方法はどうしたらいいのでしょう・・・??


> VBAではスクリプトとは言わずコードと言う。
> VBSではコードともスクリプトとも言う。
 VBSというのは初めて聞きました。ググってみて、おおよその内容を知りました。今後は間違わないように使います。ありがとうございました。
>>2
VBSについてGoogle出来たのであれば、
上記を参考にGoogle及びVBEのヘルプを見て謎解きをすると
コードを書くのがよりいっそう楽しくなりますよww

>(「.Offset(Colum,Row)」を見てそんな風に感じているのですが〜〜
うーむ微妙に着眼点がずれているのに、内容としては合ってる。フシギ〜


では、本件とは微妙に違いますが、サンプルソースをば・・

http://cid-ca4d84e190759574.skydrive.live.com/self.aspx?path=%2f%u516c%u958b%u3059%u3063%u305e%uff01%uff01%2f%5bmixi%5d%20EXCEL%20VBA%20%u30b3%u30df%u30e5%u30cb%u30c6%u30a3%2f%u3060%u3044%u3059%u3051%2f%u30a8%u30af%u30b9%u30d7%u30ed%u30fc%u30e9%u98a8%u8a73%u7d30%u8868%u793a%u30de%u30af%u30ed%7c5Excel%u5185%u5b8c%u7d50%7c6.xls
魔流さん、ありがとうございます。

 早速ダウンロードしましたが、Macでダウンロードしてしまったので、VBAは使えませんね。(^^) 自宅にWindowsマシンがなく、 VMware Fusion を使ってVistaを動かしています。 今晩仕事から帰ったら、ダウンロードをやり直して拝見させていただきます。(理解できるといいのですが...。)

> コードを書くのがよりいっそう楽しくなりますよww
 FileMakerでスクリプトを書くのは好きなのですが、VBAは全然違いますから、今のところさっぱり理解できてません。ただ、下手な横好きで、書いたスクリプト(やコード)がうまく動いたときは、とても嬉しいもんですね。「こうやるのかぁ!」なんてひとりで頷いてます。(^^)
 魔流さん、ありがとうございます。「エクスプローラ風詳細マクロ(エクセル内完結(1)」、昨晩ダウンロードいたしました。

 しかし、シートを開いてみて、この表が何をするためのものなのか理解できず、コードを拝見しましたが、私のような初心者レベルでは難しくて、ほとんど何も理解できませんでした。あの表はどのように使うものなんでしょう?

 「ID」のところに適当な数字を入れると、「NO.・・・」と表示されるんで、「アクセス日時」のところにも、適当に日にちと時間を入れてみましたが、入力されたままにしか表示されず、だめでした。表示されるフォーマットは「"yyyy-mm-dd_hh-mm-ss"」のように表示されるのかなぁ...、と想像しながらコードを眺めたのですが、わかりませんでした。

 折角のサンプルですが、私にはハードルが高すぎるようです。
>5
あー説明不足サーセン。。

E列に文字列を入れる。
あとはコードを読み取ってみてください。

それと>>1に訂正がww

-----【誤】----------------------------
[6] <標準モジュールレベル>
  Sub SUB名(ByVal Me As Object)
   〜
   :
   〜
  End Sub

-----【正】----------------------------
[6] <標準モジュールレベル>
  Sub SUB名(ByVal Iam As Object)
   〜
   :
   〜
  End Sub

---------------------------------------
>>5
>>6の回答でコードを読み取ってもどうしても判らないことや、
読み取った結果が合っているかどうかの確認には、
このコミュニティの総合質問スレ>>24に対して作った物になりますので、
そちらで確認してみてください。

つ http://mixi.jp/view_bbs.pl?id=33486000&comm_id=24524&page=all
 魔流さん、サンプル、やっと動かし方がわかりました。(^^) しかし、コードを眺めても、どこがど〜なるとあ〜いう結果になるのか、サッパリ分かりません。まだまだ僕のレベルが低すぎるようです。(取り組み初めて1週間じゃお話になりませんね。)

 自分のやりたいことをBVAで実現するには、まだまだ時間がかかりそうだと改めて認識しました。「総合質問スレ」を見てましたら、勉強になりそうなことがずいぶんあるようなので、ここを参考に少しずつ勉強していこうと思います。

 ただ、課題の「タイムカード計算」は仕事の効率化のためにも何とか解決しなければなりませんので、時間が掛かっても、これからも取り組んでいくつもりです。今後も何か書き込んだときには、お助けくださいますよう、お願いします。
8 COXさん
今回のを始めるにあたり、インターネットで検索してみましたか?
エクセルでのタイムカードや出退勤はよく使われて、個人ブログや質問ブログ(?)でも良く出ています。
もしかすると出来上がったものを入手できるかもしれませんヨ。
 
>>8
ただ単にコードを眺めているだけだと判らないことでも、
Excel画面とVBE画面を上下または左右に並べてブレイクポイントを設定してから、
E列に文字を入れる。

その後ブレイクポイントでとまったら、後はF8でゆっくり眺めてみる。

こうすれば、コードが読めなくても、どのコードでどんな事象が起こっているのかが判りますよね!
 いま会社からちょこっと書いてます。返事が遅くなってすみません。小さな小売店なので、会社では仕事、家に帰ってコードを書くと言うことをしていますが、ついつい疲れて夜はバタンキューが続くことも...。(^^)

> fenwickさん
 タイムカード計算のサンプルは、ググるとやって言うほど出てくるんですが、このくらいのは(と言っても、それが私には難しいんですが)、自分で作ってみたいなと思って、挑戦しています。今月の給料日(の計算に)間に合えばいいなと思っていましたが、まだまだずいぶん掛かりそうです。

> 魔流さん
 一行ずつコードを実行させるんですね。自分で作ったときは何処がおかしいのか知るためにこれをやるのですが、この前のサンプルではやっていませんでした。今度、元気があるときにでも (^^) やってみようと思います。

 ところで、あのサンプルはセルに文字を入れて確定するだけでIDや更新日時などが出てきますね。僕はボタンを作ってそれにコードを連携させて書く(という言い方でいいんだろうか?)ものとばかり思っていたので、ちょっと驚きでした。あれだと、タイムカードの計算をする月を入れるだけで、時間を入力するセルを選択するようなことが出来そうですが、そんな風に夢を膨らませると、いくら経っても完成しないので、今は諦めましょう。


 現時点の課題は、最初の写真のような場合、日にちと曜日に「−−」が入っている右側の出退社時間を入れるセル(6カ所)を、選択部分からはずすにはどうすればいいかと悩んでいます。
 選択されているセルは「時刻の入力」という名前が付いていますから、選択しないセルについている名前をはずしたら(そんなことが出来るんだろうか?)、6つのセルを除いて、必要なセルだけ選択することが出来るんじゃないかと考えています。
 ただ、「時刻の入力」はセルの範囲に付けている名前なので、その中のいくつかの名前を取り去ることで選択範囲を変えることが実際に出来るのか疑問です。

 他にも方法を考えているのですが、月によって選択したくないセルの数が変化するので、上記の方法が可能なら、一番簡単なのかなと思案中です。
 結局、セル範囲についている名前の中の一部のセルの名前を削除しても、セル範囲の選択には何の影響もありませんでした。
 色々悩んで、なかなかうまくいかないので、今回は簡単な方法で逃げました。もうちょっとスマートな方法がないかとも思うのですが、僕の今の力ではここまでしかできません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Private Sub CommandButton1_Click()

' 基準セル「B5」に「基準」という名をつける
Range("B5").Name = "基準"

Dim A(30) As Variant
Dim i As Long

For i = 1 To 31
Range("基準").Item(i, 2).Select

If Range("基準").Item(i, 2).Text = "--" Then
Range("基準").Item(i, 3) = ""
Range("基準").Item(i, 4) = ""
End If
Next

If Range("基準").Item(9, 1) = "--" Then
Range("D5:E12, D16:E35").Select ★1
ElseIf Range("基準").Item(10, 1) = "--" Then
Range("D5:E13, D16:E35").Select ★2
ElseIf Range("基準").Item(11, 1) = "--" Then
Range("D5:E14, D16:E35").Select ★3
Else
Range("D5:E35").Select
End If

End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 このコードで一応自分が納得のいく動作まで進みました。

 ★1、★2、★3のセル範囲に名前を付けて、Range("名前").Select の様な風に出来れば、このボタンや表をコピーして使っても、あまり変更する所が多くないので楽かなと考えているのですが、どうなんでしょう...?

 僕はここで「Item」を多用しているのですが、「Offset」を使う方がいいのでしょうか?色々ググってみるのですが、「Item」と「Offset」をどうやって使い分けるのか、どんな時に「Item」を使い、どんな時に「Offset」を使うのかよく分からないでいます。どちらも同じような機能にみえるのですが...。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。