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

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

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

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

Q&A

解決済

5回答

856閲覧

テキストボックスからの転記

milk1218

総合スコア20

VBA

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

0グッド

0クリップ

投稿2021/10/21 04:44

編集2021/10/22 05:13

前提・実現したいこと

シートのセルへ保存(テキストボックス→構造体→シート)が中々出来ません。
テキストボックスに入れた値を構造体に格納してセルへ保存したいです。

現在、シートからの出力は出来ていますがこの逆がなかなか出来ません。

シート→構造体→テキストボックス
出力の代入式と左右を逆にしたつもりでも
下記の試したことのようにで記述したような結果になります。

テキストボックス→構造体→シートと
三段階ある処理の書き方のイメージがなかなか思いつかない状態です・・。

イメージ説明

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

エラーメッセージ

該当のソースコード

Type attendance starttime As Date endtime As Date breakstart As Date breakend As Date worktime As Single note As String End Type '以下ユーザーフォーム Private monthly() As attendance '構造体の配列を宣言 Private Sub CommandButton1_Click() '更新ボタン Call AttendanceSave 'Call SetAttendance End Sub Public Sub AttendanceSave() '保存 セルへの転記 ReDim monthly(1 To 31) Dim i As Long For i = 1 To 31 monthly(i).starttime = Cells(i + 1, 3).Value monthly(i).endtime = Cells(i + 1, 4).Value monthly(i).breakstart = Cells(i + 1, 5).Value monthly(i).breakend = Cells(i + 1, 6).Value monthly(i).worktime = Cells(i + 1, 7).Value monthly(i).note = Cells(i + 1, 8).Value Next i End Sub Public Sub SetAttendance() '出力 Dim i As Long Sheets(cmbMonth.Value).Activate For i = LBound(monthly) To UBound(monthly) Me.Controls("txtStarttime" & i).Value = monthly(i).starttime Me.Controls("txtEndtime" & i).Value = monthly(i).endtime Me.Controls("txtBreakstart" & i).Value = monthly(i).breakstart Me.Controls("txtBreakend" & i).Value = monthly(i).breakend Me.Controls("txtWorktime" & i).Value = monthly(i).worktime Me.Controls("txtNote" & i).Value = monthly(i).note Next i End Sub Private Sub cmbMonth_Change() '月選択プルダウン Debug.Print cmbMonth.Value Worksheets(cmbMonth.Value).Select '先に月シートを選択してから '曜日設定やテキストへの転記をする SetWeekLabel '曜日設定 Call AttendanceSave '選択したシートデータを構造体配列へ Call SetAttendance '構造体配列からテキストへ End Sub

試したこと

Cells(i + 1, 3).Value = Me.Controls("txtStarttime" & i).Value
⇒セルへ入ってもフォームを閉じたり月選択で切り替えると、デフォルトの「00:00」になって消えてしまいます

Cells(i + 1, 3).Value = monthly(i).starttime
⇒テキストボックスはその列全て「00:00」が入り、シートのセルには「12:00:00 AM」が入り、「00:00」を消して違う値を入力して更新ボタン押しても、テキストボックスに入力した値はセルに入らない状態です

monthly(i).starttime = Me.Controls("txtStarttime" & i).Value
⇒構文エラー

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

※画像でシートのセルに入っている値は直入力したものです。

・Private Sub cmbMonth_Change()
の部分の、それぞれcallで呼び出している保存と出力処理はコメントアウトするとエラーになってしまいます。

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

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

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

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

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

guest

回答5

0

VBA

1'ここからフォームモジュール 2Private Sub CommandButton1_Click() 3If TextBox1.Text = "" Then Exit Sub 4Call データ検索 5End Sub 6 7Private Sub CommandButton2_Click() 8If TextBox1.Text = "" Then Exit Sub 9 Call データ入力 10End Sub 11 12Private Sub CommandButton3_Click() 13If TextBox1.Text = "" Then Exit Sub 14Call 修正 15End Sub 16 17Private Sub CommandButton5_Click() 18Unload Me 19End Sub 20 21Private Sub ListBox1_Click() 22 Call Lisutクリック 23End Sub 24 25Private Sub UserForm_Initialize() 26 UserForm1.TextBox1.Text = Date 27 Call データ検索 28 Call Frame1タイトル '取得したシート名を”2021年mm月"で表示 29End Sub 30 31'ここから標準モジュール********** 32Sub kidou() 33 UserForm1.Show 34 Worksheets(1).Select 35End Sub 36Sub risut作成() 37'UserForm1.ListBox1に表示させる設計図的なもの 38 Dim i As Long, n As Long 39 Dim myDate As Variant 40 Worksheets(シート名).Select 41 n = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 42 With UserForm1.ListBox1 43 .ColumnHeads = True 'セル(項目)のタイトル表示 44 .BoundColumn = 1 '規定値 45 .ColumnCount = 8 'セル(項目)列の数 46 .ColumnWidths = "50;50;100;100;100;100;100;100;100" 'セル(項目)列のサイズ 47 .RowSource = "A2:H" & n '*List()は時間シリアル表示だったのでRowSource 48 End With 49End Sub 50 51Option Explicit 52Public 年月日 As Date '年月日 53Public 月 As Long '月 54Public 日 As Long '日 55Public 曜日 As String '曜日 56Public i As Long 57Public シート名 As String 58Sub sheet選択() 59'年月日からどのシートを表示させるか・・***** 60 年月日 = UserForm1.TextBox1.Text 61 月 = Month(年月日) '月 62 日 = Day(年月日) '日 63 曜日 = Format(年月日, "aaa") '曜日 64 For i = 2 To Sheets.Count 65 If Sheets(i).Name = 月 Then 66 シート名 = Sheets(i).Name 67 End If 68 Next i 69End Sub 70 71Option Explicit 72' 73Sub データ検索() 74 Call データ検索1 75 Call [ListBox表示].risut作成 76 Call [リストクリック].Frame1タイトル 77End Sub 78Sub データ検索1() 79'[データ呼び出し](該当シートから呼び込む**************] 80Call [Sheet選択する].sheet選択 '該当シート 81'********************************************************** 82 Dim n As Long 83 Worksheets(シート名).Select 84 n = Cells(Rows.Count, 1).End(xlUp).Row 85 For i = 2 To n 86 If 日 = Cells(i, 1) Then 87 With UserForm1 88 .TextBox2.Text = Cells(i, 3).Text '就業時間 89 .TextBox3.Text = Cells(i, 4).Text '終業時間 90 .TextBox4.Text = Cells(i, 5).Text '休憩時間(始め) 91 .TextBox5.Text = Cells(i, 6).Text '休憩時間(終) 92 .TextBox6.Text = Cells(i, 8).Text '備考欄 93 End With 94 End If 95 Next i 96End Sub 97 98Option Explicit 99Dim n As Long, i As Long 100Dim WorkRange As Variant 101Sub データ入力() 102 '入力するシート検索*********** 103' 年月日からどのシートを表示させるか 104 Call [Sheet選択する].sheet選択 105 '******************************* 106 Worksheets(シート名).Select 107 n = Cells(Rows.Count, 1).End(xlUp).Row + 1 108 'ここで重複登録をチックする************** 109 For i = 2 To n 110 If 日 = Cells(i, 1).Value Then MsgBox "すでに登録されています": Exit Sub 111 ' ここまで 重複登録をチック************** 112 Next i 113 With UserForm1 114 Cells(n, 1).Value = 日 115 Cells(n, 2).Value = 曜日 116 Cells(n, 3).Value = .TextBox2.Text 117 Cells(n, 4).Value = .TextBox3.Text 118 Cells(n, 5).Value = .TextBox4.Text 119 Cells(n, 6).Value = .TextBox5.Text 120 Cells(n, 8).Value = .TextBox6.Text '備考欄 121 End With 122 '***日付順に並べ替え**** 123 Call 日付順 124 '************************ 125 '即ListBoxに表示させる為「データ検索」 126 Call [データ呼び出し].データ検索1 127 MsgBox "入力しました" 128 129' Worksheets(1).Select 130End Sub 131Sub 日付順() 132'***マクロの記録******** 133'日付順に並べ替え 134 Worksheets(シート名).Select 135 n = Cells(Rows.Count, 1).End(xlUp).Row 136 Range(Cells(2, 1), Cells(n, 8)).Select 137 ActiveWorkbook.Worksheets(シート名).Sort.SortFields.Clear 138 ActiveWorkbook.Worksheets(シート名).Sort.SortFields.Add2 Key:=Range(Cells(2, 1), Cells(n, 1)), _ 139 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 140 With ActiveWorkbook.Worksheets(シート名).Sort 141 .SetRange Range(Cells(2, 1), Cells(n, 8)) 142 .Header = xlGuess 143 .Apply 144 End With 145 Range("A2").Select 146End Sub 147' 148Option Explicit 149Dim ListNo As Long 150Dim n As Long 151Dim ii As Long 152Dim a As String 153Dim 年 As String 154Sub Lisutクリック() 155 ListNo = UserForm1.ListBox1.ListIndex 156 Worksheets(シート名).Select 157 年月日 = UserForm1.TextBox1.Text 158 年 = Year(年月日) 159 With UserForm1 160 For ii = 1 To 8 161 162 If ii = 3 Then 163 a = CDate(.ListBox1.List(ListNo, ii - 1)) '始業時間 164 .TextBox2.Text = Left(a, Len(a) - 3) '"0:00:00"を”0:00”に変換 165 If .TextBox2.Text = "0:00" Then .TextBox2.Text = "" 166 ElseIf ii = 4 Then 167 a = CDate(.ListBox1.List(ListNo, ii - 1)) '終業時間 168 .TextBox3.Text = Left(a, Len(a) - 3) 169 If .TextBox3.Text = "0:00" Then .TextBox3.Text = "" 170 ElseIf ii = 5 Then 171 a = CDate(.ListBox1.List(ListNo, ii - 1)) ''休憩始め 172 .TextBox4.Text = Left(a, Len(a) - 3) 173 If .TextBox4.Text = "0:00" Then .TextBox4.Text = "" 174 ElseIf ii = 6 Then 175 a = CDate(.ListBox1.List(ListNo, ii - 1)) ''休憩終わり 176 .TextBox5.Text = Left(a, Len(a) - 3) 177 If .TextBox5.Text = "0:00" Then .TextBox5.Text = "" 178 ElseIf ii = 8 Then 179 .TextBox6.Text = .ListBox1.List(ListNo, ii - 1) ' '備考欄 180 End If 181 Next ii 182 End With 183End Sub 184Sub Frame1タイトル() 185Dim 年 As String, 年月日 As String, 月 As String 186 年月日 = UserForm1.TextBox1.Text 187 年 = Year(年月日) 188 月 = Month(年月日) 189 With UserForm1.Frame2 190 .Caption = 年 & "年" & 月 & "月" 191 End With 192End Sub 193 194Option Explicit 195Sub 修正() 196Dim WorkRange As Variant 197Dim i As Long 198 Dim 日 As String 199 Dim a As Date 200 日 = Day(UserForm1.TextBox1.Text) '日 201' シートのデータを配列に格納(変数=Variant) 202 WorkRange = Worksheets(シート名).UsedRange 203 For i = 2 To UBound(WorkRange) 204 If WorkRange(i, 1) = 日 Then 205 With UserForm1 206 WorkRange(i, 3) = .TextBox2.Text 207 WorkRange(i, 4) = .TextBox3.Text 208 WorkRange(i, 5) = .TextBox4.Text 209 WorkRange(i, 6) = .TextBox5.Text 210 WorkRange(i, 8) = .TextBox6.Text 211 End With 212 End If 213 Next i 214 '変更されたセルをシートに上書き 215 Worksheets(シート名).UsedRange = WorkRange 216End Sub

投稿2021/10/23 12:11

syousuke.33

総合スコア312

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

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

milk1218

2021/10/24 12:06

ご丁寧にありがとうございます・・・!! 参考にさせていただきます!!!
guest

0

ベストアンサー

構造体を使う目的がよくわかりませんでしたが、

VBA

1Option Explicit 2 3Private monthly(1 To 31) As attendance 4Private ws As Worksheet 5 6Private Sub FormToSheet_Click() 7 Set ws = ThisWorkbook.Worksheets(cmbMonth.Value) 8 9 Dim i 10 For i = 1 To 31 11 monthly(i).starttime = Me.Controls("txtStartTime" & i).Value 12 Next 13 14 For i = 1 To 31 15 ws.Cells(i + 1, 3).Value = monthly(i).starttime 16 Next 17 18End Sub 19 20Private Sub SheetToForm_Click() 21 Set ws = ActiveSheet 22 cmbMonth.Value = ws.Name 23 24 Dim i 25 For i = 1 To 31 26 monthly(i).starttime = ws.Cells(i + 1, 3).Value 27 Next 28 29 For i = 1 To 31 30 Me.Controls("txtStartTime" & i).Value = Format(monthly(i).starttime, "hh:nn") 31 Next 32 33End Sub 34

投稿2021/10/23 06:32

jinoji

総合スコア4592

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

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

milk1218

2021/10/24 12:05

ありがとうございます!!参考にさせていただきます! monthly(i).starttime = Me.Controls("txtStartTime" & i).Valueは 私も何度か試したのですが、"型が一致しません"とコンパイルエラーが出てきてしまいます・・。
jinoji

2021/10/24 12:23 編集

If IsDate(Me.Controls("txtStartTime" & i).Value) Then monthly(i).starttime = CDate(Me.Controls("txtStartTime" & i).Value) Else End If
guest

0

milk1218さんのユーザーフォームスタイルとは違いますが画像添付しますイメージ説明
イメージ説明
イメージ説明
イメージ説明
決して、高度なプログラムの書き方ではありません。
なので、貴方様の質問に対する回答も出来ません
それでも良ければ参考までに、後日ソースコード添付します

投稿2021/10/22 09:41

syousuke.33

総合スコア312

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

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

milk1218

2021/10/23 02:21

ありがとうございます! 画像まで添付していただき恐れ入ります…。
guest

0

間違い箇所がありましたので変更おねがいします
Sub Sistクリック()のところ画像添付します
イメージ説明
赤線で囲ったところです 追加・変更

申し訳ございません

投稿2021/10/23 23:58

syousuke.33

総合スコア312

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

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

0

先にコードの画像4枚添付します
後からコード送信します。これは、あくまでもド素人のコードですので
参考程度でおねがいします
イメージ説明
イメージ説明
イメージ説明
イメージ説明

投稿2021/10/23 12:08

syousuke.33

総合スコア312

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問