質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1083閲覧

構造体を使った処理方法

milk1218

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/10/14 06:52

編集2021/10/15 15:11

構造体を使用した場合の、データ処理のやり方についてです。
これまではこちらで助力を頂いてシートとユーザーフォーム間でのやり取りで作成しましたが、仕様を変えなければいけなくなりました。

配列との違いなどは解ったのですが、構造体を介してのデータの読み書きのコードの書き方が解りません・・。

http://pineplanter.moo.jp/non-it-salaryman/2017/09/30/excel-vba-type/
上記のサイトなどを参考にして、間違っていそうですが定義などは書いたのですが
ここからどうデータの読み書きに繋げれば良いのか・・。

やりたいこととしては、更新ボタンを押すと各テキストボックスの値が各該当セルへ。
ユーザーフォームを立ち上げた際にはこれまで入力されたセルの値が、各ボックスに読み込まれるようにしたいです。
ex.10月1日なら1日金曜日の始業時刻に数字を入れると、シートの1日金の始業時刻に値が入る。
いったん閉じてまた開いた際に、今度は終業と休憩を入れると同じ行の各該当ボックスに入る。
(画像のシートは12月になっていますが・・・)

※"セルに入っている値を、構造体へ格納。
構造体に入っているデータを、ユーザーフォーム上で表示。
更新ボタンを押すと、ユーザーフォーム上で表示されているデータを、一旦
構造体に入れて、その後、セルへ書き出し"

         
標準モジュールに書きこんで、更新ボタンのところでCallで処理を呼び出す形になるのでしょうか・・?
ご教授お願い致します・・・。

イメージ説明

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Type attendance starttime As Date     '始業時刻 endtime As Date     '終業時刻 breakstart As Date    '休憩時間のはじめ breakend As Date    '休憩時間のおわり worktime As Single   '実働時間 note As string      '備考    ※10/16 As singleから修正 End Type Public monthly As attendance 'オブジェクトの定義 Public Sub AttendanceSave() '勤怠保存 For i = 1 To 31 attendance(i).starttime = Cells(i + 2, 3) attendance(i).endtime = Cells(i + 2, 4) attendance(i).breakstart = Cells(i + 2, 5) attendance(i).breakend = Cells(i + 2, 6) attendance(i).worktime = Cells(i + 2, 7) attendance(i).note = Cells(i + 2, 8) Next i End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

【補足】各テキストボックスの名前
txtStarttime1 = 始業時刻(1日月曜日の部分) 2,3,4,5・・・と31まであります。下記のものたちも同様です。
txtEndtime1 = 終業時刻
txtBreakstart1 = 休憩時間のはじめ
txtBreakend1 = 休憩時間の終わり
txtWorktime1 = 実働時間
txtNote1 = 備考

lblWeek1= 曜日ラベル
lblDay1 = 日ラベル

ーーーーーーーーーーー
cmbYear = 西暦コンボボックス
cmbMonth = 月コンボボックス
CommandButton1 = 更新ボタン

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記のような感じになります。

標準モジュール

vba

1Option Explicit 2 3Type attendance 4 starttime As Date '始業時刻 5 endtime As Date '終業時刻 6 breakstart As Date '休憩時間のはじめ 7 breakend As Date '休憩時間のおわり 8 worktime As Single '実働時間 9 note As Single '備考 10End Type

ユーザーフォームモジュール

vba

1Option Explicit 2 3Private monthly() As attendance 'オブジェクトの定義 4 5Public Sub AttendanceSave() '勤怠保存 6 ReDim monthly(1 To 31) 7 8 Dim i As Long 9 For i = 1 To 31 10 monthly(i).starttime = Cells(i + 2, 3) 11 monthly(i).endtime = Cells(i + 2, 4) 12 monthly(i).breakstart = Cells(i + 2, 5) 13 monthly(i).breakend = Cells(i + 2, 6) 14 monthly(i).worktime = Cells(i + 2, 7) 15 monthly(i).note = Cells(i + 2, 8) 16 Next i 17 18End Sub 19 20Public Sub SetAttendance() '勤怠出力 21 22 Dim i As Long 23 For i = LBound(monthly) To UBound(monthly) 24 Me.Controls("txtStarttime" & i).Value = monthly(i).starttime 25 Me.Controls("txtEndtime" & i).Value = monthly(i).endtime 26 Me.Controls("txtBreakstart" & i).Value = monthly(i).breakstart 27 Me.Controls("txtBreakend" & i).Value = monthly(i).breakend 28 Me.Controls("txtWorktime" & i).Value = monthly(i).worktime 29 Me.Controls("txtNote" & i).Value = monthly(i).note 30 Next i 31 32End Sub

ただ、個人的には、今回の質問の要件の場合、
セルデータを構造体に格納、構造体からユーザーフォームのテキストボックスに出力と、2度手間になるだけで特にメリットはないと思います。

投稿2021/10/14 12:35

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milk1218

2021/10/15 01:49

ありがとうございます・・・!! 確かにそう言われてみると二度手間で一回一回格納するメリットは特に無さそうですね・・。 すみません・・!一つ追加でご質問したいのが、これまでにもよく起こりがちなのですが monthly(i).starttime = Cells(i + 2, 3) の部分で、「オブジェクトが必要です」が出てきてしまいます。調べたら大半がSetの付け忘れ と出てくるのですが、コードを見てると特にSetが必要な部分は無いように思えて・・。
hatena19

2021/10/15 02:28

Set が必要なのは、オブジェクトとかクラスになります。 New とか CreateObject で生成する必要かあるものです。 構造体とか、配列は必要ありません。 monthly() は構造体の配列になります。
milk1218

2021/10/15 02:58

ご説明ありがとうございます・・!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問