试图根据给出错误值的范围获取最后一个单元格地址
Posted
技术标签:
【中文标题】试图根据给出错误值的范围获取最后一个单元格地址【英文标题】:trying to get the last cell address based on range giving wrong value 【发布时间】:2021-12-30 09:55:57 【问题描述】:我正在尝试使用以下代码根据起始地址和范围从 Excel 工作表中获取最后一个单元格地址以进行合并。
我有像X
这样的起始单元格地址,并希望使用给定范围获取结束单元格地址。例如,起始地址为X
,范围为7,则结束单元格地址为AD
。
我尝试了以下方法,但我得到了错误的结束单元格地址
private static readonly char[] BaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
private static readonly Dictionary<char, int> CharValues = BaseChars
.Select((c, i) => new Char = c, Index = i )
.ToDictionary(c => c.Char, c => c.Index);
public static string IntToBase(int value)
int targetBase = BaseChars.Length;
// Determine exact number of characters to use.
char[] buffer = new char[Math.Max(
(int)Math.Ceiling(Math.Log(value + 1, targetBase)), 1)];
var i = buffer.Length;
do
buffer[--i] = BaseChars[value % targetBase];
value /= targetBase;
while (value > 0);
return new string(buffer, i, buffer.Length - i);
public static int BaseToInt(string number)
_ = number ?? throw new ArgumentNullException(nameof(number));
char[] chrs = number.ToCharArray();
int m = chrs.Length - 1;
int n = BaseChars.Length, x;
int result = 0;
foreach (char c in chrs)
x = CharValues[c];
result += x * (int)Math.Pow(n, m--);
return result;
public static string GetLastCellAddress(string number, int cellCount)
int startVal = BaseToInt(number);
return Enumerable.Range(startVal, cellCount).Select(i => IntToBase(i)).Last();
我正在使用上面的函数,如下所示
var environmentsLastCellAddress = ExcelBuilderExtensions.GetLastCellAddress(startColumnAddress, spaceTypeLibraryByPropertiesCount);
如果我给出了像X
这样的起始单元格地址并且计数是7
,则上述函数给出了错误的结束地址,我应该将结束单元格地址设为AD
而不是我得到地址为@987654329 @
谁能告诉我上面的代码有什么问题吗?那将非常感谢我。非常感谢!
【问题讨论】:
【参考方案1】:我希望以下内容对您有用。
int
到 string
参考…
Convert an Excel column number to a column name or letter:
string
到 int
参考...
Fastest method to remove Empty rows and Columns From Excel Files using Interop
static void Main(string[] args)
Console.WriteLine("Start: A + 0: " + GetAddedRange("A", 0));
Console.WriteLine("Start: A + 1: " + GetAddedRange("A", 1));
Console.WriteLine("Start: H + 4: " + GetAddedRange("H", 4));
Console.WriteLine("Start: AA + 26: " + GetAddedRange("AA", 26));
Console.WriteLine("Start: BA + 11: " + GetAddedRange("BA", 11));
Console.WriteLine("Start: CAA + 11: " + GetAddedRange("CAA", 11));
Console.WriteLine("Start: GAA + 11: " + GetAddedRange("GAA", 11));
Console.WriteLine("Start: Z + 11: " + GetAddedRange("Z", 11));
Console.WriteLine("Start: Z - 10: " + GetAddedRange("Z", -10));
Console.ReadKey();
private static string ColumnIndexToColumnLetter(int colIndex)
int div = colIndex;
string colLetter = String.Empty;
int mod = 0;
while (div > 0)
mod = (div - 1) % 26;
colLetter = (char)(65 + mod) + colLetter;
div = (int)((div - mod) / 26);
return colLetter;
private static int ParseColHeaderToIndex(string colAdress)
int[] digits = new int[colAdress.Length];
for (int i = 0; i < colAdress.Length; ++i)
digits[i] = Convert.ToInt32(colAdress[i]) - 64;
int mul = 1;
int res = 0;
for (int pos = digits.Length - 1; pos >= 0; --pos)
res += digits[pos] * mul;
mul *= 26;
return res;
private static string GetAddedRange(string startCol, int addedRange)
int startingCol = ParseColHeaderToIndex(startCol);
return ColumnIndexToColumnLetter(startingCol + addedRange);
还有从您的倒数第二条评论... X + 7 将是 AE... 而不是 AD。
【讨论】:
对不起,我的地址有误如果我给出的起始地址是D
,范围是11,我应该得到N
。相反,我将O
作为结束地址。起始地址也应包括起始单元地址。
对不起,请按照我的计算 D + 11 = O ... D ... e,f,g,h,i,j,k,l,m,n,o ...
如果我通过 AddedRange-1
它应该可以工作
所以如果你有任何字母 + 1……那么……它应该返回相同的字母?
是的,计数应该从它自己的起始地址开始【参考方案2】:
如果你在excel中,你也可以让excel来做:
Private Function GetColName(ColNr As Integer) As String
Dim parts() As String
parts = Split(Cells(1, ColNr).Address, "$")
GetColName = parts(1)
End Function
Private Function GetColNr(ColName As String) As Long
GetColNr = Range(ColName + "1").Column
End Function
Sub test()
MsgBox GetColName(GetColNr("X") + 7) 'will post AE
End Sub
您可以将其组合到一个函数中并添加错误处理。
【讨论】:
以上是关于试图根据给出错误值的范围获取最后一个单元格地址的主要内容,如果未能解决你的问题,请参考以下文章