用VBA如何将当前工作表vba复制指定区域到另一个工作表单元格的数据替换掉TXT文件内容?

社区首页 >问答首页 >如何使用VBA将Excel表格的单元格值写入Txt文件?Stack Overflow用户提问于 2021-08-26 12:24:54回答 3查看 100关注 0票数 1我正在尝试创建一个CSV文件,该文件将以以下方式导出Excel表格列单元格值:row number "Tab" cell values但是在下面的脚本中,它只导出表中第一个单元格的值(行数和顺序是正确的)。如何修复它?Private Sub ExportAsCSV()
'Export current sheet as a CSV TXT file on the same location
Dim ThisPathName, CSVFileName, ThisFileName, ThisSheetName As String
Dim SeriesRange As Range
Dim i As Integer
ThisPathName = ThisWorkbook.Path
' Generate workbook current path
ThisFileName = ThisPathName & "/" & ThisWorkbook.Name
' Generate file name & path
ThisSheetName = ActiveSheet.Name
' Generate sheet name
CSVFileName = ThisPathName & "/Wren Kitchens " & ThisSheetName & ".txt"
' Sets CSV txt file name and location
If ActiveSheet.Name = "00 Kitchen Series" Then
'if active table is "00 Kitchen Series"
Open CSVFileName For Output As #1
Set SeriesRange = ActiveSheet.ListObjects("KitchenLinesTable").ListColumns(1).DataBodyRange
For i = 1 To SeriesRange.Count
Print #1, i & "
" & ActiveSheet.ListObjects("KitchenLinesTable").DataBodyRange(1, i).Value
Next i
Close #1
End If结束子对象Stack Overflow用户回答已采纳发布于 2021-08-26 14:03:57请尝试下一种压缩方法来创建CSV字符串:替换此代码:If ActiveSheet.Name = "00 Kitchen Series" Then
'if active table is "00 Kitchen Series"
Open CSVFileName For Output As #1
Set SeriesRange = ActiveSheet.ListObjects("KitchenLinesTable").ListColumns(1).DataBodyRange
For i = 1 To SeriesRange.Count
Print #1, i & "
" & ActiveSheet.ListObjects("KitchenLinesTable").DataBodyRange(i, 1).Value
Next i
Close #1
End If
End Sub下一个:
Set SeriesRange = ActiveSheet.ListObjects("KitchenLinesTable").ListColumns(1).DataBodyRange
Open CSVFileName For Output As #1
Print #1, Join(Application.Transpose(Evaluate("row(1:" & SeriesRange.count & ")&""
""&" & SeriesRange.Address)), vbCrLf)
Close #1如果您理解数组VBA部分和Evaluate方法,那么它们将会是令人惊叹的东西……为了理解上面的代码,我将尝试展示什么是必须知道的。打开即时窗口(Ctrl + G, being in VBE) and press F5when code stops (on停止`命令),可以看到返回:Sub TestToUnderstandAboveCode()
Dim SeriesRange As Range
Set SeriesRange = ActiveSheet.ListObjects("KitchenLinesTable").ListColumns(1).DataBodyRange
'1. Placing a range in an array:
Dim arr: arr = SeriesRange.Value 'it creates a 2D array
Debug.Print arr(1, 1)
'returns the first array element
'Make the above array 1D:
arr = Application.Transpose(arr)
'or doing it dirrectly:
arr = Application.Transpose(SeriesRange.Value)
'it can be tested so:
Debug.Print Join(arr, "|")
'another way to create an array is using Evaluate (very powerfull method):
arr = Evaluate(SeriesRange.Address)
'2D array
arr = Application.Transpose(Evaluate(SeriesRange.Address)) '1D array
Debug.Print Join(arr, "|"): Stop 'it returns the same as above. Press F5 to continue the code
'now we need to
build another 1D array to keep the range rows:
Dim arrRows: arrRows = Application.Evaluate("row(1:10)") '2D array keeping numbers from 1 to 10
Debug.Print Join(Application.Transpose(arrRows), "|")
'You can join only a 1D array to see the jonned string
'Now, let us personalize it according to the necessary string to be processed:
arrRows = Application.Transpose(Evaluate("row(1:" & SeriesRange.cells.count & ")"))
Debug.Print Join(arrRows, "|")
'Now, putting all pieces together:
arr = Evaluate("row(1:" & SeriesRange.count & ")&""
""&" & SeriesRange.Address) 'it creates a 2D array separating arrays by "
"
Debug.Print Join(Application.Transpose(arr), "|") ': Stop
'having a 1D array and needing a string having end lines for each array element we need to build it
'for doing it we need to firstly join the array elements by vbCrLf (end of line) separator:
Dim strArr As String
strArr = Join(Application.Transpose(arr), vbCrLf)
Debug.Print strArr : Stop 'it returns the string showing all elemnts one bellow the other.
'and finally doit it at once:
strArr = Join(Application.Transpose(Evaluate("row(1:" & SeriesRange.count & ")&""
""&" & SeriesRange.Address)), vbCrLf)
Debug.Print strArr
End SubStack Overflow用户发布于 2021-08-26 14:49:03Hi is my generic Sub要导出与工作簿位于同一目录的文件夹中的CSV文件,您只需在调用它时发送表名ExportTableToCSV("MyTableName")然后它调用下面的subPublic Sub ExportTableToCSV(TableName as String)
Dim ws As Worksheet
Dim FilePath, CSVLocation, fol As String
Dim ParseRange As Range
Dim cellValue As Variant
Dim j, k As Integer
Set ws = Application.ActiveSheet
Set ParseRange = ws.ListObjects(TableName).Range
CSVLocation = Application.ActiveWorkbook.Path & "\NewFolder\"
fol = Dir(CSVLocation, vbDirectory)
If fol = "" Then MkDir CSVLocation
FilePath = Application.ActiveWorkbook.Path & "\NewFolder\" & TableName & ".csv"
Open FilePath For Output As #1
For j = 1 To ParseRange.Rows.Count
For k = 1 To ParseRange.Columns.Count
cellValue = ParseRange.Cells(j, k).Value
If k = ParseRange.Columns.Count Then
Write #1, cellValue
Else
Write #1, cellValue,
End If
Next k
Next j
Close #1
End SubStack Overflow用户发布于 2021-08-26 13:46:23非常感谢@FaneDuru在评论中提供的答案。这个问题是由DataBodyRange(1, i).Value引起的,因为Excel知道它是通过表的行来迭代的。正确的答案必须是DataBodyRange(i, 1).Value,这样Excel才能按行的索引进行迭代。更正后的代码:Private Sub ExportAsCSV()
'Export current sheet as a CSV TXT file on the same location
Dim ThisPathName, CSVFileName, ThisFileName, ThisSheetName As String
Dim SeriesRange As Range
Dim i As Integer
ThisPathName = ThisWorkbook.Path
' Generate workbook current path
ThisFileName = ThisPathName & "/" & ThisWorkbook.Name
' Generate file name & path
ThisSheetName = ActiveSheet.Name
' Generate sheet name
CSVFileName = ThisPathName & "/Wren Kitchens " & ThisSheetName & ".txt"
' Sets CSV txt file name and location
If ActiveSheet.Name = "00 Kitchen Series" Then
'if active table is "00 Kitchen Series"
Open CSVFileName For Output As #1
Set SeriesRange = ActiveSheet.ListObjects("KitchenLinesTable").ListColumns(1).DataBodyRange
For i = 1 To SeriesRange.Count
Print #1, i & "
" & ActiveSheet.ListObjects("KitchenLinesTable").DataBodyRange(i, 1).Value
Next i
Close #1
End If
End Sub再一次感谢你@FaneDuru页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持原文链接:https://stackoverflow.com/questions/68938477复制}

利用VBA和INDIRECT 函数实现若干工作表中指定单元格数据的分类汇总
刘璐(湖北省襄阳市谷城县审计局)
近日,在协助财政审计科部门预算执行审计中遇到这样的问题:根据审计需要收集了若干单位的部门预算和批复表,表格数量多,当需要查看某一个部门的收入支出数据时很不方便直观。那么能不能有一张汇总表可以显示所有预算部门的收入和支出明细,并分类汇总呢?带着这样的疑问,我开始了这次的探索之路。 一、理清结构,建立汇总表的大概框架1、查看了所有电子表格,发现所有的部门批复表都具有相同的表结构,只是填充的数据不同。2、将所有部门的表格汇总到一个电子表格,工作表按单位命名,并建立汇总表的初步结构。(表头可以利用电子表格的转置功能) 二、数据引用1、开始第一行数据的引用数据。2、利用拖曳功能完成填充问题出来了,拖曳还是在第一个工作表中引用数据,那么如何利用拖曳功能完成所有工作表的相对引用呢?3、利用函数引用数据这里我们需要利用INDIRECT 函数来完成跨工作表的相对引用,单元格A3的公式修改为INDIRECT("Sheet"&ROW(B1)&"!A3"),表示从表格中的第一个工作表中引用A3单元格的数据。但是我们之前把所有单位汇总时,工作表名为了区分都按单位命名,INDIRECT函数在引用时根本找不到sheet1这个工作表,怎么办呢?需要再把工作表名一个一个修改成sheet1、sheet2、sheet3···吗?70多张表啊,工作量也是很大的。4、VBA编写语句完成工作表名的批量修改。在当前工作表中按快捷键Alt+F11,打开VBA编辑器,在右侧的代码窗口中输入下列代码:Sub Macro1()Dim i As IntegerFor i = 2 To Worksheets.CountWorksheets(i).Name = "Sheet" & i - 1NextEnd Sub表示从第二个工作表开始,工作表依次修改为sheet1、sheet2、sheet3···直至最后一张工作表。运行后,除了第一张工作表名是“总表”,其他工作表按次序已修改完成。5、完成其他单元格的函数公式把第三行的单元格公式都利用indirect函数完成修改后,选中第三行有数据的单元格利用鼠标的拖曳功能完成所有数据的相对引用,这样在总表中引用了其他所有工作表中指定单元格中的数据,大大提高了工作效率。最后,为方便查看工作表名对应的单位名称,可以在A列之前插入一列“表名”,用sheet+数字来命名。总结:前期的基础表结构需要一致,工作表名命名需要有规律性,后期工作相对轻松,可以插入增加的工作表,然后在总表将公式拖曳即可得到新增的单位数据,可以做成通用版本供以后使用。(刘璐)}

这个用不着动用VBA,直接在excel里面处理后复制粘贴在txt里面就可以了。 不用一个一个的复制,可以用公式的。
本回答被网友采纳你可能没明白楼上的意思,你建一列==IF(Book2!A1="北京","BJ|")&IF(Book2!C1="神州行","shengzhouxing|")&Book2!D1&Book2!E1,让后一拖,拷贝一行,粘贴就可以了。 另外是不是深圳需要改为sz那?家园卡需要改为jiayuanka?}

我要回帖

更多关于 vba复制指定区域到另一个工作表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信