Вы ничего не говорите, даже если я думаю, что вы должны ... У меня нет времени ждать.
Я подготовил решение, работая в следующих обстоятельствах: Вы можете вставить, сколько столбцов вы нужно, , но вы НЕ будете заполнять данные в этих столбцах , как в первом коде. Код может быть адаптирован, чтобы также справиться с такой ситуацией. Не очень сложно.
Вы должны построить строку, связывающую в ее логике c заголовок столбца с элементами управления формы, из которых используется значение:
strHeaders = "HeaderB;2|HeaderC;3|HeaderD;4|HeaderE;5|HeaderF;6|HeaderG;7|HeaderH;8|HeaderI;9|HeaderJ;10"
Логика построения c просто: заголовок связан с управляющим тегом , разделенным ";". Каждый заголовок разделен "|". Таким образом, вы должны назначить соответствующие теги элементам управления формы (начиная с 2).
Sub SafeInsertOnHeader()
Dim ws As Worksheet, Table As ListObject, strHeaders As String, h As Long
Dim arrH As Variant, arrInt As Variant, El As Variant, Ctrl As Control, iRow As Long
Set ws = ThisWorkbook.Sheets("PFU")
Set Table = ws.ListObjects("Table1")
strHeaders = "HeaderB;2|HeaderC;3|HeaderD;4|HeaderE;5|HeaderF;6|HeaderG;7|HeaderH;8|HeaderI;9|HeaderJ;10"
arrH = Split(strHeaders, "|")
If frmForm.txtRowNumber.value = "" Then
iRow = [Counta(PFU!A:A)] + 2
Else
iRow = frmForm.txtRowNumber.value
End If
ws.Cells(iRow, 1) = iRow - 2 'independent of a control value
For h = 1 To Table.HeaderRowRange.Count 'iterare through the headers
For Each El In arrH 'iterate through the array elements
arrInt = Split(El, ";") 'create each element array (header and tag)
If Table.HeaderRowRange.Columns(h) = arrInt(0) Then
For Each Ctrl In frmForm.Controls
If Ctrl.Tag = arrInt(1) Then 'for the tag matching the array association
ws.Cells(iRow, h).value = Ctrl.value
End If
Next
End If
Next
Next h
End Sub
Если вам нужно использовать новый вставленный столбец, во время кода вставки столбца строка strHeaders
будет изменена с помощью соответствующий header;tag
. Строка будет сохраняться в реестре и использоваться каждый раз при чтении реестра.
Следующий подход еще проще. Вы непосредственно будете использовать имя заголовка в качестве управляющего тега:
Sub SafeInsertOnHeaderBis()
Dim ws As Worksheet, Table As ListObject, strHeaders As String, h As Long
Dim arrH As Variant, El As Variant, Ctrl As Control, iRow As Long
Set ws = ThisWorkbook.Sheets("PFU")
Set Table = ws.ListObjects(1) ' ws.ListObjects("Table1")
strHeaders = "HeaderA|HeaderB|HeaderC|HeaderD|HeaderE|HeaderF|HeaderG|HeaderH|HeaderI|HeaderJ|HeaderK"
arrH = Split(strHeaders, "|")
'I used your way of last row determinig but it can be done a little better
If frmForm.txtRowNumber.value = "" Then
iRow = [Counta(PFU!A:A)] + 2
Else
iRow = frmForm.txtRowNumber.value
End If
'Each control will have like tag the header name!
ws.Cells(iRow, 1) = iRow - 2
For h = 1 To Table.HeaderRowRange.Count
For Each El In arrH
If Table.HeaderRowRange.Columns(h) = El Then
For Each Ctrl In frmForm.Controls
If Ctrl.Tag = El Then
ws.Cells(iRow, h).value = Ctrl.value
End If
Next
End If
Next
Next h
End Sub
Так, например, для headerA
необходимо выбрать txtID
элемент управления формы, нажать F4
, чтобы открыть Properties
, прокрутите вниз, пока не увидите свойство Tag
, и заполните его значение строкой headerA. Сделайте одинаковые ассоциации для всех ваших пар header/control name
, сохраните форму и наслаждайтесь ее использованием, вставляя столбцы ...