Excel范围到CSVrangeoutput-将范围拆分为41个条目的组
我不确定如何在谷歌搜索中解释这一点,所以我不确定是否有人问过这个问题 我有一个vba函数,它接受一个范围,并将其转换为逗号分隔的值字符串。 它就像一个符咒 现在我希望它只输出前41个条目,向下切换一行并输出范围内的下41个条目 我不能完全把我的头绕在它周围,它感觉像一个简单的环,但我不能完全到达那里 我在网上某处找到了csvrange宏:) 输入范围如下所示Excel范围到CSVrangeoutput-将范围拆分为41个条目的组,excel,vba,date-range,Excel,Vba,Date Range,我不确定如何在谷歌搜索中解释这一点,所以我不确定是否有人问过这个问题 我有一个vba函数,它接受一个范围,并将其转换为逗号分隔的值字符串。 它就像一个符咒 现在我希望它只输出前41个条目,向下切换一行并输出范围内的下41个条目 我不能完全把我的头绕在它周围,它感觉像一个简单的环,但我不能完全到达那里 我在网上某处找到了csvrange宏:) 输入范围如下所示 所需的输出如下所示,一个字符串位于B列中,每组41个值在一行上分开,每次函数命中下一个nr 42时向下偏移1 类似这样的内容: Opti
所需的输出如下所示,一个字符串位于B列中,每组41个值在一行上分开,每次函数命中下一个nr 42时向下偏移1 类似这样的内容:
Option Explicit
Public Sub test()
Debug.Print csvRange(Selection, 41)
End Sub
Public Function csvRange(ByVal myRange As Range, ByVal Columns As Long) As String
Dim csvRangeOutput
Dim iCol As Long
Dim Entry As Variant
For Each Entry In myRange
If Not IsEmpty(Entry.Value) Then
iCol = iCol + 1
csvRangeOutput = csvRangeOutput & Entry.Value
If iCol = Columns Then
csvRangeOutput = csvRangeOutput & vbCrLf
iCol = 0
Else
csvRangeOutput = csvRangeOutput & ","
End If
End If
Next
csvRange = Left$(csvRangeOutput, Len(csvRangeOutput) - 1)
End Function
将把这些数据
转换为以逗号分隔的值,共有41列
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82
83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123
124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140
可供替代的
请测试下一个代码。它将满足(我理解)您的需要,因为您在A:A列中有很多记录。它应该很快,使用数组并在内存中工作。单个迭代用于必要数量的范围切片:
Private Sub testStringCSVArray()
Dim sh As Worksheet, arr, nrSlices As Long, LastRow As Long, rngF As Range
Dim rngStart As Range, i As Long, k As Long, h As Long, arrFin
Set sh = ActiveSheet
LastRow = sh.Range("A1").End(xlDown).row
LastRow = sh.Range("A" & rows.count).End(xlUp).row 'last row of A:A
arr = sh.Range("A1:A" & LastRow).Value 'put the range in an array
nrSlices = UBound(arr) \ 41 'determine the number of necessary slices
ReDim arrFin(nrSlices + 1)
Set rngStart = sh.Range("B" & UBound(arr) + 2) 'set the cell where the result to be returned
For i = 1 To nrSlices + 1
arrFin(h) = CStr(Join(Application.Transpose(Application.Index(arr, _
Evaluate("row(" & k + 1 & ":" & IIf(i <= nrSlices, 41 + k, UBound(arr)) & ")"), 1)), ","))
k = k + 41: h = h + 1
Next i
'Format the range where the processed data will be returned and drop the processed data array:
With rngStart.Resize(h, 1)
.NumberFormat = "@"
.Value = WorksheetFunction.Transpose(arrFin)
End With
End Sub
Private子testStringCSVArray()
将sh作为工作表、arr、NR作为长切片、LastRow作为长切片、rngF作为范围
暗rngStart作为范围,i作为长度,k作为长度,h作为长度,arrFin
设置sh=ActiveSheet
LastRow=sh.Range(“A1”).End(xlDown).row
LastRow=sh.Range(“A”&rows.count).End(xlUp).row'A的最后一行:A
arr=sh.Range(“A1:A”&LastRow).Value”将范围放入数组中
nRSicles=UBound(arr)\41'确定所需切片的数量
ReDim arrFin(NRM+1)
Set rngStart=sh.Range(“B”&UBound(arr)+2)”设置返回结果的单元格
对于i=1到nr+1
arrFin(h)=CStr(Join(应用程序转置)(应用程序索引)(arr_
求值(“行(“&k+1&”):”&IIf(i)它是否像嵌套另一个循环一样简单,将第一个循环中的计数器与41进行检查,然后以重置计数器结束并返回?这有意义吗?如果有意义,是否尝试过?请注意,示例输入数据和所需输出数据将始终有助于理解您试图实现的目标(如果您的问题中包含了它们)。请参见。那么,您是否希望首先“输出前41个条目”.以哪种方式?像一个由41个条目组成的字符串,用逗号分隔,或者在一个单独的单元格中每个分隔的实体?对于该字符串的其余部分也是一样的。该字符串是否少于82个这样的分隔元素?如果不是,该操作是否应重复,每次复制41个条目?是,41个值中的一个字符串,然后向下跳过一行,并创建一个新的字符串接下来的41个值用逗号分隔。示例输入范围是A1:A82i所有数据都在一列A:A中,我想将其排序为最多41个值的逗号分隔字符串,然后向下跳过一行,将接下来的41个值转换为一个逗号分隔字符串。这有意义吗?我用几个输入图像编辑了我的问题d想要的output@MichaelChristensen问题出在哪里呢?然后,csvRange(Range(“A1:A82”),41)
将为每行提供41个值作为输出。只需将A1:A82
调整到您的数据范围即可。噢,这些列让我感到困惑,我想:让我试试out@MichaelChristensen我所说的列是指逗号分隔的列,而不是Excel列;)如果不清楚的话,很抱歉。注释不用于扩展讨论;此对话已结束。@MichaelChristensen您没有抽出时间测试代码吗?
Public Sub Convert()
Const ColCount As Long = 41
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim iRow As Long
For iRow = 1 To LastRow Step ColCount
ws.Cells(iRow \ ColCount + 1, "B").Value = "'" & Join((WorksheetFunction.Transpose(ws.Range("A" & iRow).Resize(RowSize:=IIf(iRow + ColCount - 1 > LastRow, WorksheetFunction.Max(LastRow Mod ColCount, 2), ColCount)).Value)), ",")
Next iRow
End Sub
Private Sub testStringCSVArray()
Dim sh As Worksheet, arr, nrSlices As Long, LastRow As Long, rngF As Range
Dim rngStart As Range, i As Long, k As Long, h As Long, arrFin
Set sh = ActiveSheet
LastRow = sh.Range("A1").End(xlDown).row
LastRow = sh.Range("A" & rows.count).End(xlUp).row 'last row of A:A
arr = sh.Range("A1:A" & LastRow).Value 'put the range in an array
nrSlices = UBound(arr) \ 41 'determine the number of necessary slices
ReDim arrFin(nrSlices + 1)
Set rngStart = sh.Range("B" & UBound(arr) + 2) 'set the cell where the result to be returned
For i = 1 To nrSlices + 1
arrFin(h) = CStr(Join(Application.Transpose(Application.Index(arr, _
Evaluate("row(" & k + 1 & ":" & IIf(i <= nrSlices, 41 + k, UBound(arr)) & ")"), 1)), ","))
k = k + 41: h = h + 1
Next i
'Format the range where the processed data will be returned and drop the processed data array:
With rngStart.Resize(h, 1)
.NumberFormat = "@"
.Value = WorksheetFunction.Transpose(arrFin)
End With
End Sub