質問するログイン新規登録

質問編集履歴

1

説明追加

2019/11/02 04:35

投稿

hachi3156
hachi3156

スコア16

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
+ ![イメージ説明](e6f1d9b8d456ff6e2fc80a3a80203e8a.png)
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
  ```