Excel按最大stringsorting一列

我正在尝试将每个excel文件按大长度文本的一列进行sorting。 这是因为数据在使用数据服务作业导入到SQL时不会被截断。 我意识到Excel读取第一个8或16行,并根据这个长度来确定字段的长度,我的很多文本在255个字符处被切割。

我试了一个文件作为实验,列被设置为399 varchar,这是其中一个文件中最长string的长度。 DS作业映射中设置的字段的大小无关紧要,string的长度设置字段大小。

我已经创build了一小段VBA来循环遍历每个文件,并按照最大到最小的文本进行sorting,它正在循环,正在做的事情,但没有sorting从最大到最小。

不知道是否是空的单元格或是什么导致它,但我设法做一个文件手动 – sorting从最大到最小 – 现在它从来没有说从最大到最小,只有A> Z出于某种原因。

我有一个问题的代码,这是因为我提到它不是sorting,和2)我有一个关心处理多个文件,并确定最大字段长度。 我不知道DS作业是否会改变字段的大小,如果遇到另一个文件长度比最后一个文件长的文件? 我用一个文件做了这个,但是这并不告诉我,唯一的办法是尝试正确sorting多个文件,然后针对每个文件运行作业。

这里是我正在试图做这种循环。 我find一个名为“sorting我”的专栏作为例子,然后将其应用于此。

For i = 1 To lastcol With wb.ActiveSheet ColChar = colLtr(i) rangestr = ColChar & "1:" & ColChar & "" & MaxRowCount If .range(ColChar & 1).Value = "Sort Me" Then range(rangestr).Sort key1:=range(rangestr), order1:=xlDescending, Orientation:=xlSortRows, Header:=xlYes End If End With Next i 

我有一个函数可以根据列号创build列字符。 我循环通过每列,直到我打我想要的然后尝试和sorting。 rangestrvariables是我想要sorting的范围。

编辑:澄清我想要文本字段最长在顶部和最短的底部,有,空值,有些表没有文本。 喜欢这个:

 "This is the longest piece of text to be a top" "This is shorter piece of text" "This is even shorter" 

主要是至less要首先正确完成sorting。 就如何正确地寻求build议。

非常感谢

安德鲁

Excel有强大的内置sortingfunction,我最好使用它的实际速度,而不是重新发明轮子

因为你需要一个新的(和临时)字段 – 一个字符长度的文本 – 我也会使用一个“助手”字段的方法和代码如下:

 Sub SortIt(dataRng As Range, headerStrng As String) Dim f As Range, helpRng As Range Dim colsOffset As Long With dataRng Set f = .Rows(1).Find(what:=headerStrng, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) '<--| look for wanted header column If f Is Nothing Then Exit Sub '<--| if no header found, then no job to do! Set helpRng = .Resize(, 1).Offset(, .Parent.UsedRange.Columns(.Parent.UsedRange.Columns.Count).Column - .Columns(1).Column + 1) '<--| set a helper range in first column outside worksheet used range and occupying data range same rows With helpRng colsOffset = .Column - f.Column + 1 '<--| calculate column offset from "header" column to "helper" range .FormulaR1C1 = "=len(RC[-" & colsOffset - 1 & "])" '<--| fill "helper" range with corresponding "header" cells number of characters. they will be eventually cleared End With .Resize(, helpRng.Column - .Columns(1).Column + 1).Sort key1:=helpRng, order1:=xlDescending, Orientation:=xlSortColumns, Header:=xlYes helpRng.Clear '<--| clear the "helper" range End With End Sub 

被你的主要部分调用如下:

 Option Explicit Sub main() Dim dataRng As Range, headerStrng As String With Worksheets("SortData") '<--| change "SortData" with your actual sheet name Set dataRng = .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 10) '<--| change "A1", "A" and '10' to reflect, respectively, your data actual leftupmost cell, "counter" column (ie the one that determines its rows span) and columns number End With headerStrng = "Sort me" '<--| change "Sort me" with your actual header SortIt dataRng, headerStrng End Sub 

基于我在这里find的代码片段
我编辑了如下所示的代码,只要传入要sorting的范围,并将可选参数设置为true(如果要按最短长度sorting)

 Sub SortByLength(rangeToSort As Range, Optional shortest As Boolean = False) Dim x As Long, y As Long, lLastRow As Long Dim tempX As String, tempY As String Dim tempArray As Variant tempArray = rangeToSort 'Sort array For x = 1 To UBound(tempArray) For y = x To UBound(tempArray) If shortest = True Then If Len(tempArray(y, 1)) < Len(tempArray(x, 1)) Then tempX = tempArray(x, 1) tempY = tempArray(y, 1) tempArray(x, 1) = tempY tempArray(y, 1) = tempX End If Else If Len(tempArray(y, 1)) > Len(tempArray(x, 1)) Then tempX = tempArray(x, 1) tempY = tempArray(y, 1) tempArray(x, 1) = tempY tempArray(y, 1) = tempX End If End If Next y Next x 'Output sorted array Range(rangeToSort.Item(1), rangeToSort.Item(UBound(tempArray))) = (tempArray) End Sub