アプリ版:「スタンプのみでお礼する」機能のリリースについて

画像のUserFormのupdateData3のid,name,stockにそれぞれシート4の左から2,6,3列目のデータを表示させるようにしています。

UserFormの処理は以下(1)です。
またその情報取得のためにシート4では以下(2)のような処理を行っています。

このとき、UserFormのテキストボックスに入力した情報を取得先のシート4の該当データに上書きするにはどうすればいいでしょうか?

素人考えでは配列yをPublicにしないと上書きができないと思い、yをグローバル変数にしていますがこれで配列がグローバル化しているかもよくわかってないです。

うまく説明できていないかもしれませんが是非ご教授お願いします。

(1)
Option Explicit


Public Function updateData3(id As String, name As String, stock As String) As String

'受け取ったデータをセット
idLabel.Caption = id
nameLabel.Caption = name
stockLabel.Caption = stock

Me.TextBox1.SetFocus
Me.Show


updateData3 = 0

End Function

Private Sub commandbutton1_click()
Sheet4.intData3 = 0
Unload Me
End Sub



Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean)
If idLabel.Caption = TextBox1.Text Then
Unload Me
Else
MsgBox "一致しません"
TextBox1.Text = ""
Me.TextBox1.SetFocus
End If
End Sub

(2)
Option Explicit

Public y
Public intData3 As Integer
Public intData4 As Integer

'==========================================================
'在庫ボタンの処理
'==========================================================
Sub zaikoButton()
Dim lRow As Long, lCol As Long
Dim i As Long, j As Long
Dim x, y, z
Dim a, n
Dim cnt1 As Long, cnt2 As Long

cnt1 = 0
cnt2 = 0


'----最終行
lRow = Cells(Rows.Count, 2).End(xlUp).Row
'----最終列
lCol = 25

'----データを配列Xに読み込む
x = Range(Cells(4, 1), Cells(lRow, lCol)).Value

'----データを書き出す配列yを準備する
ReDim y(1 To lRow, 1 To lCol)

'----データを書き出す配列zを準備する
ReDim z(1 To lRow, 1 To lCol)

intData3 = 1

For i = 4 To lRow
'----削除しないデータを配列yに書き込む
If Not Cells(i, 1).Value = "" Then
a = UserForm4.updateData3(CStr(x(i - 3, 2)), CStr(x(i - 3, 6)), CStr(x(i - 3, 3)))
cnt1 = cnt1 + 1
For j = 2 To 25
y(cnt1, j - 1) = x(i - 3, j)
Next j
Else
cnt2 = cnt2 + 1
For j = 1 To lCol
z(cnt2, j) = x(i - 3, j)
Next j
End If
Next i

If intData3 = 1 Then
Dim rc As Integer
rc = MsgBox("在庫棚へ戻しますか?", vbYesNo + vbQuestion, "確認")
If rc = vbYes Then
'----配列yをシートへ書き出す
Range("A4").Resize(lRow, lCol).Value = z

n = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To cnt1
For j = 2 To 25
Sheets(2).Cells(n + i, j).Value = y(i, j - 1)
Next j
Next i

Else
MsgBox "処理を中断します"
End If
End If

End Sub

「Excel VBA でのマクロ制作につい」の質問画像

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

  • (2)はシート4に記述されており,シート内のデータは三行目がデータのラベル,それ以下がデータで,列は全部で25列あり,一列目がデータを選択するためのチェックボックス替わりで記述内のIf not cells(i, 1).value = "" Thenでチェックが入っているか判別しています.
    UserForm4のupdatedata3にはチェックが入っている行のデータの2、6、3列目の文字列を上からセットしています.


    今回わからないのは,UsreForm4に表示されているデータのうち「保管場所」のデータをフォーム内のテキストボックスに入力した内容をシート4内の該当セル(三列目)に上書きする方法がわからないということです.

      補足日時:2019/09/12 16:28

A 回答 (2件)

>フォーム内のテキストボックスに入力した内容をシート4内の該当セル(三列目)に上書きする方法


Dim 該当行 as long
該当行=3
Worksheets("シート4").Cells(該当行, 3).Value = UserForm4.TextBox1.Value(文字列として使うなら、.Text)
シート名がシート4のC3にテキストの値が書き込まれます。
シートインデックス4になら
Worksheets(4).Cells(該当行, 3).Value = UserForm4.TextBox1.Value

よく読んでないけど、
>(2)はシート4に記述されており
グローバル変数なんとかなら、全部フォームモジュールに書けばいいのでは?
困りそうな、シートイベントがトリガーになる処理は無いかと思いますが。

lRow = Cells(Rows.Count, 2).End(xlUp).Row
など、この辺をしっかりシートを明示しする(Withで括る)とか、
手を入れなくてはいけない所はあるようですが、、
    • good
    • 0

>シート4内の該当セル(三列目)に上書きする


読むの疲れた。どこ?
って言うか、Option Explicit あるのに
エラー出ませんか??
グローバル変数とか言う前にデバックしてください。(わかるから)
Sheet4 って何?変数?.付けられるしーーーーーー、何?
Sheet4.intData3 = 0 この意味教えてください。

これだけ、コード掲示するなら、せめてちゃんとして。
    • good
    • 0

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