Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel范围到CSVrangeoutput-将范围拆分为41个条目的组_Excel_Vba_Date Range - Fatal编程技术网

Excel范围到CSVrangeoutput-将范围拆分为41个条目的组

Excel范围到CSVrangeoutput-将范围拆分为41个条目的组,excel,vba,date-range,Excel,Vba,Date Range,我不确定如何在谷歌搜索中解释这一点,所以我不确定是否有人问过这个问题 我有一个vba函数,它接受一个范围,并将其转换为逗号分隔的值字符串。 它就像一个符咒 现在我希望它只输出前41个条目,向下切换一行并输出范围内的下41个条目 我不能完全把我的头绕在它周围,它感觉像一个简单的环,但我不能完全到达那里 我在网上某处找到了csvrange宏:) 输入范围如下所示 所需的输出如下所示,一个字符串位于B列中,每组41个值在一行上分开,每次函数命中下一个nr 42时向下偏移1 类似这样的内容: Opti

我不确定如何在谷歌搜索中解释这一点,所以我不确定是否有人问过这个问题

我有一个vba函数,它接受一个范围,并将其转换为逗号分隔的值字符串。 它就像一个符咒

现在我希望它只输出前41个条目,向下切换一行并输出范围内的下41个条目

我不能完全把我的头绕在它周围,它感觉像一个简单的环,但我不能完全到达那里

我在网上某处找到了csvrange宏:)

输入范围如下所示

所需的输出如下所示,一个字符串位于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