Excel 文件复制操作vba代码
2012-07-24 18:17
375 查看
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 IfEnd Sub
相关文章推荐
- Excel 文件复制操作vba代码
- VBA处理文件框架代码 【第五部分:Excel文件操作】
- Excel 关于新建xls文件 新建sheet 合并sheet的VBA操作代码
- VBA操作Excel代码收集
- Excel-VBA文件操作1
- Excel-VBA操作文件四大方法
- VBA遍历当前目录下指定类型的excel文件并复制文件内指定的内容到新表中
- Excel 文件操作代码
- Excel-VBA操作文件四大方法
- Excel-VBA文件操作2
- VBA 从一个Excel文件复制一行数据到另一个Excel文件
- Excel-VBA文件操作3
- VBA 从一个Excel文件复制一行数据到另一个Excel文件
- 利用Asp.net IO.File类完成文件新建复制删除操作(代码调试通过)(转)
- Excel-VBA文件操作4
- Excel-VBA操作文件四大方法
- 综述:本专栏将介绍以下内容(专栏:Java代码操作word、excel、pdf等文件)
- Excel-VBA文件操作5
- ★Excel-VBA操作文件四大方法之一 by excelhome
- ASP FSO文件操作函数代码(复制文件、重命名文件、删除文件、替换字符串)