質問編集履歴
1
説明追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -88,57 +88,11 @@
|
|
88
88
|
Next CntRow
|
89
89
|
|
90
90
|
End Sub
|
91
|
-
|
92
|
-
Public Sub ReadDBData(ByVal TarObjToWRITE As String, ByRef ReadList() As Variant, ByRef WriteList() As Variant, ByVal strSQL As String)
|
93
|
-
|
94
|
-
Dim CntRow As Long
|
95
|
-
Dim readobj As Object
|
96
|
-
Dim writeobj As Object
|
97
|
-
Dim LengthOfArray As Long
|
98
|
-
Dim StartRow As Long
|
99
|
-
Dim EndRow As Long
|
100
|
-
|
101
|
-
Dim ADOCon As ADODB.Connection
|
102
|
-
Dim ADORes As ADODB.Recordset
|
103
|
-
|
104
|
-
Set ADOCon = initDb(ADODB_NAME, ADODB_PASS)
|
105
|
-
Set ADORes = New ADODB.Recordset
|
106
|
-
|
107
|
-
ADORes.Open strSQL, ADOCon
|
108
|
-
|
109
|
-
Dim reObj As returnObject
|
110
|
-
Set reObj = New returnObject
|
111
|
-
|
112
|
-
'----標準モジュール記載
|
113
|
-
Set reObj.Cls_ADORes = Createobject("ADODB.recordset")
|
114
|
-
Set reObj.Cls_Frm = UserForm1
|
115
|
-
'----
|
116
|
-
|
117
|
-
StartRow = 3
|
118
|
-
EndRow = 10
|
119
|
-
|
120
|
-
For CntRow = StartRow To EndRow
|
121
|
-
'リストの要素数
|
122
|
-
For LengthOfArray = LBound(ReadList) To UBound(ReadList)
|
123
|
-
|
124
|
-
Set readobj = reObj.SetObjToRead("FIELD", ReadList(), LengthOfArray, CntRow)
|
125
|
-
Set writeobj = reObj.SetObjToWrite(TarObjToWRITE, WriteList(), LengthOfArray, CntRow)
|
126
|
-
|
127
|
-
writeobj.Value = readobj.Value
|
128
|
-
|
129
|
-
Next LengthOfArray
|
130
|
-
|
131
|
-
Next CntRow
|
132
|
-
|
133
|
-
End Sub
|
134
|
-
|
135
91
|
```
|
136
92
|
|
137
93
|
###クラスモジュール3 returnObject
|
138
94
|
|
139
95
|
```
|
140
|
-
|
141
|
-
|
142
96
|
・クラス変数
|
143
97
|
Public Cls_ws As Worksheet
|
144
98
|
Public Cls_ADORes As ADODB.Recordset
|
@@ -192,8 +146,153 @@
|
|
192
146
|
|
193
147
|
```
|
194
148
|
|
195
|
-
|
149
|
+
|
150
|
+
#修正
|
151
|
+
追加の返信をいただく前に標準モジュールにしてしまいました。申し訳ないです。
|
152
|
+
|
153
|
+
使用例:ワークシート→ユーザーフォーム間のデータのやりとり
|
154
|
+

|
155
|
+
|
156
|
+
アクティブシートのデータを取得したい行を「行番号」のテキストボックスに入力してから、「コピー元決定」ボタンを押すとcmdC_DecideParts_Clickが動きます
|
157
|
+
データのやりとりを行うオブジェクトはSetObjToRead関数とSetObjToWrite関数で決めており、どのオブジェクトのどの要素をやりとりの対象とするのかを文字列として渡すことで目的のオブジェクトを決めています。
|
158
|
+
(例:データを読み込みたい(値をコピーしたい)オブジェクトをアクティブシートの7行目にある品番列のRangeオブジェクトにする場合)
|
159
|
+
→strTarObjName="CELL"、TarRowForCell=7,strTarElement="品番",TarObj=ActivesheetをSetObjToRead関数に引数として渡す
|
160
|
+
セルをデータのやり取りの対象にしたい場合は単純に列番号を渡すと列の順番を変更できないので、さらにcolslctbytitle関数に列名を文字列として渡して、渡した文字列とシートの列名が一致したらそのときの列番号をcolslctbytitle関数の返り値としています
|
161
|
+
|
162
|
+
ReadArray(),WriteArray()ではSetObjToRead関数とSetObjToWrite関数に渡すための文字列を決めています
|
163
|
+
|
164
|
+
現状はShtToFrm関数のように(データの読み込み先:Worksheet)To(データの書き込み先:UserForm)として関数の名前を付けていますが、6パターン文の関数(ShtToFrm,FrmToSht,ShtToAccessDB,AccessDBToSht,FrmToAccessDB,AccessDBToFrm)
|
165
|
+
(データの書き込み先がAccessDBの場合は新規追加と更新もあるので、さらに関数が増えそう)
|
166
|
+
を作るのではなく、2,3つの関数にまとめられたらと考えています。
|
167
|
+
|
168
|
+
ユーザーフォームのモジュール(FrmCopyContentsInfoOfParts)
|
169
|
+
```ここに言語を入力
|
170
|
+
Private Sub cmdC_DecideParts_Click()
|
171
|
+
|
172
|
+
Dim TarRow As Integer
|
173
|
+
TarRow = Me.txtRowNum.Value
|
174
|
+
|
175
|
+
Dim ReadArray() As Variant
|
176
|
+
Dim WriteArray() As Variant
|
177
|
+
|
178
|
+
'配列の要素はそれぞれ対応していなければならない(e.g:品番⇔txtC_PartNum)
|
179
|
+
ReadArray() = Array("品番", "図番", "図番改定", "品名", "型式名", "アキクラコード", "メーカー名", "メーカーコード", "仕入先", "仕入先コード", "標準原価単価", "標準発注単価", _
|
180
|
+
"ロット発注", "ロット単位数", "部品_在庫小数桁", "在庫用発注_棚卸変換値", "標準発注LT", "製番製品No_ロットNo", _
|
181
|
+
"部品単位", "発注単位", "品番分類", "在庫分類", "発注手配", "引当手配", "品番備考")
|
182
|
+
WriteArray() = Array("txtC_PartNum", "txtC_ChartNum", "txtC_ChartNumRev", "txtC_Item", "txtC_Model", "txtC_AkikuraCode", "txtC_maker", "txtC_MakerCode", "txtC_Vendor", "txtC_VendorCode", "txtC_Price", "txtC_OrderPrice", _
|
183
|
+
"txtC_Lot", "txtC_LotQty", "txtC_Digit", "txtC_ConversionValue", "txtC_LT", "txtC_LotNo", _
|
184
|
+
"txtC_PartsUnit", "txtC_OrderUnit", "txtC_PartNumClassCode", "txtC_StockClassCode", "txtC_OrderArrgtCode", "txtC_AllocArrgtCode", "txtC_Remark")
|
185
|
+
Call ShtToFrm(ReadArray(), WriteArray(), TarRow)
|
186
|
+
|
187
|
+
End Sub
|
196
188
|
```
|
189
|
+
|
190
|
+
以下、標準モジュール
|
191
|
+
```ここに言語を入力
|
192
|
+
Public Sub ShtToFrm(ByRef strArrayToRead() As Variant, ByRef strArrayToWrite() As Variant, ByVal TarRow As Long)
|
193
|
+
|
194
|
+
If UBound(strArrayToRead) <> UBound(strArrayToWrite) Then
|
195
|
+
|
196
|
+
MsgBox "読み込み先の配列の要素数と書き込み先の配列の要素数が違います" & vbCrLf & "処理を中止します"
|
197
|
+
Exit Sub
|
198
|
+
|
199
|
+
End If
|
200
|
+
|
201
|
+
Dim StartRow As Long
|
202
|
+
Dim LengthOfArray As Long
|
203
|
+
|
204
|
+
Dim ReadObj As Object
|
205
|
+
Dim WriteObj As Object
|
206
|
+
|
207
|
+
For LengthOfArray = LBound(strArrayToRead) To UBound(strArrayToRead)
|
208
|
+
|
209
|
+
Set ReadObj = SetObjToRead("CELL", ActiveSheet, strArrayToRead(LengthOfArray), TarRow)
|
210
|
+
Set WriteObj = SetObjToWrite("CONTROL", FrmCopyContentsInfoOfParts, strArrayToWrite(LengthOfArray))
|
211
|
+
|
212
|
+
WriteObj.Value = ReadObj.Value
|
213
|
+
|
214
|
+
Next LengthOfArray
|
215
|
+
|
216
|
+
End Sub
|
217
|
+
```
|
218
|
+
前回ではSetObjToReadやSetObjToWriteに配列を渡していたので、それを配列内の文字列を直接渡すようにしたのですが、こうしてみるとShtToFrmにも配列で渡す必要なかったですね
|
219
|
+
そうすれば、forループを関数の外で処理できそうです
|
220
|
+
```ここに言語を入力
|
221
|
+
Option Explicit
|
222
|
+
|
223
|
+
Public Function SetObjToRead(ByVal strTarObjName As String, ByVal TarObj As Object, ByVal strTarElement As String, Optional TarRowForCell As Long = 1) As Object
|
224
|
+
'データを読み込む(コピーする)オブジェクトを選択
|
225
|
+
|
226
|
+
On Error GoTo Err
|
227
|
+
|
228
|
+
Select Case strTarObjName
|
229
|
+
|
230
|
+
Case "CELL"
|
231
|
+
|
232
|
+
Set SetObjToRead = TarObj.Cells(TarRowForCell, ColSlctByTitle(strTarElement, TarObj))
|
233
|
+
|
234
|
+
Case "FIELD"
|
235
|
+
|
236
|
+
Set SetObjToRead = TarObj.Fields(strTarElement)
|
237
|
+
|
238
|
+
Case "CONTROL"
|
239
|
+
|
240
|
+
Set SetObjToRead = TarObj.Controls(strTarElement)
|
241
|
+
|
242
|
+
End Select
|
243
|
+
|
244
|
+
Exit Function
|
245
|
+
|
246
|
+
Err:
|
247
|
+
Call ErrHndl(Err.Number, Err.Description)
|
248
|
+
|
249
|
+
End Function
|
250
|
+
|
251
|
+
Public Function SetObjToWrite(ByVal strTarObjName As String, ByVal TarObj As Object, ByVal strTarElement As String, Optional TarRowForCell As Long = 1) As Object
|
252
|
+
'データを書き込む(ペーストする)オブジェクトを選択
|
253
|
+
|
254
|
+
On Error GoTo Err
|
255
|
+
|
256
|
+
Select Case strTarObjName
|
257
|
+
|
258
|
+
Case "CELL"
|
259
|
+
|
260
|
+
Set SetObjToWrite = TarObj.Cells(TarRowForCell, ColSlctByTitle(strTarElement, TarObj))
|
261
|
+
|
262
|
+
Case "FIELD"
|
263
|
+
|
264
|
+
Set SetObjToWrite = TarObj.Fields(strTarElement)
|
265
|
+
|
266
|
+
Case "CONTROL"
|
267
|
+
|
268
|
+
Set SetObjToWrite = TarObj.Controls(strTarElement)
|
269
|
+
|
270
|
+
End Select
|
271
|
+
|
272
|
+
Exit Function
|
273
|
+
|
274
|
+
Err:
|
275
|
+
Call ErrHndl(Err.Number, Err.Description)
|
276
|
+
|
277
|
+
End Function
|
278
|
+
|
279
|
+
Private Sub ErrHndl(ByVal ErrNum As Long, ByVal ErrDiscription As Variant)
|
280
|
+
|
281
|
+
Select Case ErrNum
|
282
|
+
|
283
|
+
Case Else
|
284
|
+
|
285
|
+
MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & ErrDiscription
|
286
|
+
|
287
|
+
End Select
|
288
|
+
|
289
|
+
End Sub
|
290
|
+
|
291
|
+
```
|
292
|
+
|
293
|
+
```ここに言語を入力
|
294
|
+
Public Const StartRow = 5
|
295
|
+
|
197
296
|
Public Function ColSlctByTitle(ByVal Title As String, ByVal ws As Worksheet, Optional ByVal DefaultRow As Integer = StartRow) As Integer
|
198
297
|
|
199
298
|
Dim CountCol As Integer
|
@@ -218,30 +317,4 @@
|
|
218
317
|
MsgBox (Err.Description)
|
219
318
|
|
220
319
|
End Function
|
221
|
-
|
222
|
-
Public Function initDb(ByVal FileName As String, ByVal FilePass As String) As ADODB.Connection
|
223
|
-
|
224
|
-
Dim ConnectionString As String '接続文字列
|
225
|
-
Dim DbFilePass As String 'データベースファイルのパス
|
226
|
-
Dim DbFileName As String 'データベースファイルの名前
|
227
|
-
|
228
|
-
Dim ADOCon As ADODB.Connection 'データベース接続オブジェクト
|
229
|
-
Dim strCon As String
|
230
|
-
|
231
|
-
'接続文字列作成
|
232
|
-
ConnectionString = "Microsoft.ACE.OLEDB.12.0"
|
233
|
-
DbFileName = FileName & ".accdb"
|
234
|
-
|
235
|
-
Set ADOCon = New ADODB.Connection
|
236
|
-
|
237
|
-
' 接続文字列を作成する
|
238
|
-
strCon = "Provider=" & ConnectionString & ";" & "Data Source=" & FilePass & DbFileName & ";"
|
239
|
-
|
240
|
-
'接続する
|
241
|
-
ADOCon.Open strCon
|
242
|
-
|
243
|
-
Set initDb = ADOCon
|
244
|
-
|
245
|
-
End Function
|
246
|
-
|
247
320
|
```
|