- worksheet 的代码
- Const SourceFiledConfigStart As Integer = 2
- Const SourceFiledConfigEnd As Integer = 27
- Const SourceFiledDefaultStart As Integer = 41
- Const SourceFiledDefaultEnd As Integer = 46
- Const usersheetname As String = "数据"
- Const RefSheetname As String = "配置"
- Public sourcefilename As String
- Public sourcefilepath As String
- Dim index_Col As Integer
- Dim SUBPATH As Object
- Dim FieldExists As Boolean
- Dim TargetColumnArray() As String
- Dim SourceColumnArray() As String
- Private Function CopyField(index_Object As Integer, index_Source As Integer)
- Dim iColumnIndex As Integer
- iColumnIndex = index_Source - 1
- ActiveWorkbook.Sheets(1).Range("A2").Select
- Selection.Offset(0, iColumnIndex).Select
- ActiveWorkbook.Sheets(1).Range(Selection, Selection.End(xlDown)).Select
- Selection.Copy
- ThisWorkbook.Activate
- Sheets(usersheetname).Select
- Sheets(usersheetname).Range("A2").Select
- iColumnIndex = index_Object - 1
- Selection.Offset(0, iColumnIndex).Select
- ActiveSheet.Paste
- End Function
- '用于记录源表列名所在的列
- Private Function CopyField2(index_Object As Integer, index_Source As Integer)
- Dim row As Integer
- Dim iRows As Integer
- iRows = ActiveWorkbook.Sheets(1).Cells(1, index_Source).CurrentRegion.Rows.Count
- '列拷贝
- For row = 2 To iRows
- ThisWorkbook.Sheets(usersheetname).Cells(row, index_Object) = ActiveWorkbook.Sheets(1).Cells(row, index_Source).Value()
- Next row
- End Function
- Private Function IndexCol(colName As String)
- Dim iColumns As Integer
- Dim column As Integer
- iColumns = ActiveWorkbook.Sheets(1).UsedRange.Columns.Count
- For column = 1 To iColumns
- If ActiveWorkbook.Sheets(1).Cells(1, column) = colName Then
- index_Col = column
- Exit For
- End If
- Next column
- End Function
- Private Function DataSheetClear()
- '清除第二行开始的数据
- Dim rowstart As Integer
- Dim iColumns As Integer
- rowend = Sheets(usersheetname).UsedRange.Rows.Count
- rowstart = 2
- If rowend < 2 Then
- Exit Function
- End If
- Sheets(usersheetname).Range("A" & rowstart, "A" & rowend).EntireRow.Delete
- End Function
- Function ExcelColumnNameConvert(ByVal r)
- If r Like "[A-Z]*" Then ExcelColumnNameConvert = Range(r & 1).column
- If r Like "#*" And r > 0 And r <= 256 Then ExcelColumnNameConvert = Split(Cells(1, r).Address, "$")(1)
- End Function
- Private Function SetField(index_Object As Integer, defaultValue As Integer)
- Dim iRows As Integer
- Dim AString As String
- Dim AString2 As String
- Dim AString3 As String
- Dim AStartRow As Integer
- iRows = ThisWorkbook.Sheets(usersheetname).Cells(1, index_Object).CurrentRegion.Rows.Count
- AString = ExcelColumnNameConvert(index_Object)
- AStartRow = 2
- AString2 = AString & AStartRow
- AString3 = AString & iRows
- AString = AString2 & ":" & AString3
- ThisWorkbook.Activate
- Sheets(usersheetname).Select
- Sheets(usersheetname).Range(AString2).Select
- ActiveCell.FormulaR1C1 = defaultValue
- Selection.AutoFill Destination:=Sheets(usersheetname).Range(AString), Type:=xlFillDefault
- End Function
- Private Function SetField2(index_Object As Integer, defaultValue As Integer)
- Dim row As Integer
- Dim iRows As Integer
- iRows = ThisWorkbook.Sheets(usersheetname).Cells(1, index_Object).CurrentRegion.Rows.Count
- '列拷贝
- For row = 2 To iRows
- ThisWorkbook.Sheets(usersheetname).Cells(row, index_Object) = defaultValue
- Next row
- End Function
- Private Function SetDefaultFieldData()
- For iRow = SourceFiledDefaultStart To SourceFiledDefaultEnd
- Call SetField(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9), ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 2))
- Next
- End Function
- Private Function CopyFieldData()
- Set SUBPATH = CreateObject("vbscript.regexp")
- With SUBPATH
- .Global = True
- .Pattern = ".*\\"
- End With
- sourcefilepath = ThisWorkbook.Sheets(RefSheetname).Cells(1, 5)
- soucefilename = SUBPATH.Replace(sourcefilepath, "")
- FileExists = Exist(soucefilename)
- If Not FileExists Then
- Workbooks.Open sourcefilepath
- End If
- Windows(soucefilename).Activate
- For iRow = SourceFiledConfigStart To SourceFiledConfigEnd
- Windows(soucefilename).Activate
- Call CopyField(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9), ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 3))
- Next
- End Function
- Private Function GetTargetColumns()
- Dim iCount As Integer
- Dim strValue As String
- Dim str As String
- Set SUBPATH = CreateObject("vbscript.regexp")
- With SUBPATH
- .Global = True
- .Pattern = ".*\\"
- End With
- ThisWorkbook.Activate
- If ThisWorkbook.Sheets(RefSheetname).Cells(1, 5) = "" Then
- MsgBox "没有选择Excel文件", vbOKOnly, "配置错误"
- Exit Function
- End If
- sourcefilepath = ThisWorkbook.Sheets(RefSheetname).Cells(1, 5)
- soucefilename = SUBPATH.Replace(sourcefilepath, "")
- FileExists = Exist(soucefilename)
- If Not FileExists Then
- Workbooks.Open sourcefilepath
- End If
- Windows(soucefilename).Activate
- iCount = ActiveWorkbook.Sheets(1).Cells(1, 1).CurrentRegion.Columns.Count
- strValue = ""
- str = ""
- For iColumn = 1 To iCount - 1
- str = Trim(ActiveWorkbook.Sheets(1).Cells(1, iColumn).Value)
- strValue = strValue + str + ","
- Next
- strValue = strValue + Trim(ActiveWorkbook.Sheets(1).Cells(1, iCount).Value)
- InitCandidateValue (strValue)
- TargetColumnArray = Split(strValue, ",")
- End Function
- Private Sub CommandButton1_Click()
- Dim FileExists As Boolean
- FieldExists = Flase
- '清除基站信息检测模板数据和检测报告
- Call DataSheetClear
- Call GetTargetColumns
- '处理数据
- FieldExists = CheckTargetFields
- If Not FieldExists Then
- MsgBox "目标文件检查失败"
- Exit Sub
- End If
- FieldExists = CheckSourceFields
- If Not FieldExists Then
- MsgBox "本文件数据sheet检查失败"
- Exit Sub
- End If
- Sheets(RefSheetname).Select
- MsgBox "检查完成"
- End Sub
- Private Function CheckSourceFields() As Boolean
- Dim iRow As Integer
- Dim iFieldIndex As Integer
- Dim sFieldName As String
- Dim iCols As Integer
- Dim iCol As Integer
- Dim errFields As String
- Dim errMSG As String
- errMSG = ""
- errFields = ""
- getProjectDColumn
- For iRow = SourceFiledConfigStart To SourceFiledConfigEnd
- For iFieldIndex = 0 To UBound(SourceColumnArray)
- sFieldName = SourceColumnArray(iFieldIndex)
- If sFieldName = Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1)) Then
- ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9) = iFieldIndex + 1
- Exit For
- End If
- Next
- If Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9)) = "" Then
- errFields = errFields & ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1) & " "
- End If
- Next
- For iRow = SourceFiledDefaultStart To SourceFiledDefaultEnd
- For iFieldIndex = 0 To UBound(SourceColumnArray)
- sFieldName = SourceColumnArray(iFieldIndex)
- If sFieldName = Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1)) Then
- ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9) = iFieldIndex + 1
- Exit For
- End If
- Next
- If Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 9)) = "" Then
- errFields = errFields & ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1) & " "
- End If
- Next
- If errFields <> "" Then
- ThisWorkbook.Activate
- errMSG = "工程参数表对应列名: " & errFields & "不存在,请检查输入是否正确!"
- MsgBox errMSG, vbOKOnly, "字段配置错误"
- CheckSourceFields = False
- Else
- CheckSourceFields = True
- End If
- End Function
- Private Sub CommandButton2_Click()
- Dim filename As Variant
- '打开文件对话框返回的文件名,是一个全路径文件名,其值也可能是False,因此类型为Variant
- Dim sFileName As String '从FileName中提取的文件名
- Dim sPathName As String '从FileName中提取的路径名
- Dim aFile As Variant
- Dim values As String
- filename = Application.GetOpenFilename("Excel 文件,*.xls;*.xlsx")
- Call DataSheetClear
- '调用Windows打开文件对话框
- If filename <> False Then '如果未按“取消”键
- aFile = Split(filename, "\") '在全路径中,以“\”为分隔符,分成数据
- sPathName = aFile(0) '取盘符
- For i = 1 To UBound(aFile) - 1 '循环合成路径名
- sPathName = sPathName & "\" & aFile(i)
- Next
- sFileName = aFile(UBound(aFile)) '数组的最后一个元素为文件名
- Cells(1, 5).Value = sPathName & "\" & sFileName '保存路径名
- FileExists = Exist(sFileName)
- If Not FileExists Then
- Workbooks.Open filename
- End If
- Windows(sFileName).Activate
- values = getColumnValue(sFileName, filename)
- InitCandidateValue (values)
- ThisWorkbook.Activate
- MsgBox "文件选择完成"
- Else
- MsgBox "文件选择失败"
- Exit Sub
- End If
- End Sub
- Private Function CheckTargetFields() As Boolean
- Dim iRow As Integer
- Dim iFieldIndex As Integer
- Dim sFieldName As String
- Dim iCols As Integer
- Dim iCol As Integer
- Dim errFields As String
- Dim errMSG As String
- errMSG = ""
- errFields = ""
- For iRow = SourceFiledConfigStart To SourceFiledConfigEnd
- If Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 2)) = "" Then
- errFields = errFields & ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1) & " "
- End If
- For iFieldIndex = 0 To UBound(TargetColumnArray)
- sFieldName = TargetColumnArray(iFieldIndex)
- If sFieldName = Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 2)) Then
- ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 3) = iFieldIndex + 1
- Exit For
- End If
- Next
- If Trim(ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 3)) = "" Then
- errFields = errFields & ThisWorkbook.Sheets(RefSheetname).Cells(iRow, 1) & " "
- End If
- Next
- If errFields <> "" Then
- ThisWorkbook.Activate
- errMSG = "源表对应列名: " & errFields & "不存在,请检查输入是否正确!"
- MsgBox errMSG, vbOKOnly, "字段配置错误"
- CheckTargetFields = False
- Else
- CheckTargetFields = True
- End If
- End Function
- Private Function Exist(ByVal filename As String) As Boolean
- Dim iCount As Integer
- Dim i As Integer
- iCount = Workbooks.Count
- For i = 1 To iCount
- If Workbooks.Item(i).Name = filename Then
- Exist = True
- Exit For
- End If
- Next
- If i > iCount Then
- Exist = False
- End If
- End Function
- Private Function getProjectDColumn() As String
- Dim strValue As String
- Dim str As String
- Dim iCount As Integer
- Dim iColumn As Integer
- 'Windows(sFileName).Activate
- iCount = ThisWorkbook.Sheets(usersheetname).Cells(1, 1).CurrentRegion.Columns.Count
- strValue = ""
- str = ""
- For iColumn = 1 To iCount - 1
- str = Trim(ThisWorkbook.Sheets(usersheetname).Cells(1, iColumn).Value)
- strValue = strValue + str + ","
- Next
- str = Trim(ThisWorkbook.Sheets(usersheetname).Cells(1, iCount).Value)
- strValue = strValue + str
- SourceColumnArray = Split(strValue, ",")
- iCount = UBound(TargetColumnArray)
- getProjectDColumn = strValue
- End Function
- Private Function getColumnValue(ByVal sFileName As String, ByVal filename As String) As String
- Dim strValue As String
- Dim str As String
- Dim iCount As Integer
- Dim iColumn As Integer
- FileExists = Exist(sFileName)
- If Not FileExists Then
- Workbooks.Open filename
- End If
- Windows(sFileName).Activate
- 'Windows(sFileName).Activate
- iCount = ActiveWorkbook.Sheets(1).Cells(1, 1).CurrentRegion.Columns.Count
- strValue = ""
- str = ""
- For iColumn = 1 To iCount - 1
- str = Trim(ActiveWorkbook.Sheets(1).Cells(1, iColumn).Value)
- strValue = strValue + str + ","
- Next
- str = Trim(ActiveWorkbook.Sheets(1).Cells(1, iCount).Value)
- strValue = strValue + str
- TargetColumnArray = Split(strValue, ",")
- iCount = UBound(TargetColumnArray)
- getColumnValue = strValue
- End Function
- Public Function InitCandidateValue(ByVal values As String)
- ThisWorkbook.Activate
- Sheets(RefSheetname).Select
- Range("D2:D100").Select
- With Selection.Validation
- .Delete
- .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
- xlBetween, Formula1:=values
- .IgnoreBlank = True
- .InCellDropdown = True
- .InputTitle = ""
- .ErrorTitle = ""
- .InputMessage = ""
- .ErrorMessage = ""
- .IMEMode = xlIMEModeNoControl
- .ShowInput = True
- .ShowError = True
- End With
- End Function
- Private Sub CommandButton3_Click()
- ' 复制数据开始了
- Call DataSheetClear
- Call CopyFieldData
- Call SetDefaultFieldData
- End Sub
- ThisWorkBook的代码
- Const usersheetname As String = "数据"
- Const RefSheetname As String = "配置"
- Private Sub Workbook_Open()
- If Sheets(RefSheetname).Cells(1, 5).Value = "" Then
- Sheets(RefSheetname).InitCandidateValue (" ")
- Sheets(RefSheetname).Range("D2:D100").ClearContents
- Sheets(RefSheetname).Select
- End If
- End Sub