试图根据给出错误值的范围获取最后一个单元格地址

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】:

我希望以下内容对您有用。

intstring 参考…

Convert an Excel column number to a column name or letter:

stringint 参考...

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

您可以将其组合到一个函数中并添加错误处理。

【讨论】:

以上是关于试图根据给出错误值的范围获取最后一个单元格地址的主要内容,如果未能解决你的问题,请参考以下文章

根据单元格值合并范围内的单元格,但最后一个单元格没有被合并

如何获取特定匹配值的起始单元格和结束单元格地址?

将单元格的值剪切并粘贴到vba中的另一个单元格

从单元格获取超链接地址的用户定义函数

通过将活动单元格的范围提供给列的最后一行来显示自动填充命令范围中的错误

jxl合并单元格,最后一个合并的单元格边框消失