2010-04-13 26 views

Trả lời

10

Tôi không phải là người dùng lớn của VSTO C# - tôi thường chọn VBA. Tuy nhiên, cặp chức năng sau đây có thể hữu ích cho bạn. Không chắc chắn nếu chúng có thể được sắp xếp hợp lý hơn nữa:

public string RangeAddress(Excel.Range rng) 
{ 
    return rng.get_AddressLocal(false, false, Excel.XlReferenceStyle.xlA1, 
      missing, missing); 
} 
public string CellAddress(Excel.Worksheet sht, int row, int col) 
{ 
    return RangeAddress(sht.Cells[row, col]); 
} 

RangeAddress sẽ lấy bất kỳ phạm vi Excel nào và đưa bạn trở lại địa chỉ. Nếu bạn muốn kiểu tuyệt đối (với các ký hiệu đô la, ví dụ: $ C $ 3) thì bạn phải thay đổi hai thông số đầu tiên của lệnh gọi get_AddressLocal thành true, true.

Để lấy địa chỉ ô từ cặp hàng/col, bạn có thể sử dụng CellAddress. Nó cần một tờ để có được địa chỉ. Tuy nhiên, bạn có thể hoán đổi trong (Excel.Worksheet)ActiveSheet nếu bạn không muốn cung cấp một trang tính (điều này có thể hoặc có thể không hoạt động, tùy thuộc vào những gì bạn đã mở trong phiên VSTO của bạn).

0

Bạn bằng cách nào đó có thể gọi các công thức hoặc hàm gốc của Excel trùng lặp chức năng của chúng? Nó sẽ chỉ

=CELL("address") 
-1
public string GetCellAddress(int row, int col) { 
     return (char)((int)'A' + (row - 1)) + col.ToString(); 
} 
+0

Cảm ơn Timores ... không thể lấy nó từ Excel Interop Object ??? – Sathish

+0

Đó sẽ là câu trả lời của @ Alastair. – Timores

+0

Điều này sẽ trả về giá trị sai: hàng 1 col 27 sẽ trả về A27 sẽ là cột 1 hàng 27. Chỉ cần chuyển hàng và col sẽ trả về [1 cũng sai. Đúng là AA1. –

2

Cái này (chưa được kiểm tra) cũng nên làm việc với các địa chỉ cột trên đó là hơn 26:

using System.Text; 

public string GetCellAddress(int row, int col) { 
    StringBuilder sb = new StringBuilder(); 
    col--; 
    do { 
     sb.Insert(0, (char)('A' + (col % 26))); 
     col /= 26; 
    } while (col > 0); 
    sb.Append(row); 
    return sb.ToString(); 
} 

Corrected: địa chỉ cột là ngược

+3

Điều này sẽ trả về BA1 cho col 27 thay vì AA1. –

0

tế bào (2, 3) .Thêm

3

Chỉ cần một sự cải tiến, các col-- là tại địa điểm sai

static string GetCellAddress(int row, int col) 
    { 
     StringBuilder sb = new StringBuilder(); 

     do 
     { 
      col--; 
      sb.Insert(0, (char)('A' + (col % 26))); 
      col /= 26; 
     } while (col > 0); 
     sb.Append(row); 
     return sb.ToString(); 
    } 
0

Tôi đang sử dụng không dựa trên hàng và cột chỉ mục. Vì vậy, tôi đã phải thích ứng với mã của câu trả lời trước cho sau đây. Mất một số thử và sai để có được quyền này cho tất cả các địa chỉ có thể có. I.E. A1, Z2, AA2, ZZ10, ...

public string GetAddress(int col, int row) 
    { 
     col++; 
     StringBuilder sb = new StringBuilder(); 
     do 
     { 
      col--; 
      sb.Insert(0, (char)('A' + (col % 26))); 
      col /= 26; 

     } while (col > 0); 
     sb.Append(row + 1); 
     return sb.ToString(); 
    } 
Các vấn đề liên quan