2012-09-30 62 views
0

我已經遍尋搜索,但沒有人遇到同樣的問題。Excel值到變量列的範圍

基本上,用戶單擊Excel中的單元格,打開我的表單,填寫值,單擊插入。將這些變量添加到Excel然後Excel讀取和放置的數組的程序。

這是我的第一個辦公應用程序,所以我在這裏完全失明,但這是我的僞代碼。

我的解決方案編輯:

 static string GetColumnLetter(int columnNumber) 
    { 
     var dividend = columnNumber; 
     var columnName = String.Empty; 

     while (dividend > 0) 
     { 
      var modulo = (dividend - 1) % 26; 
      columnName = Convert.ToChar(65 + modulo) + columnName; 
      dividend = ((dividend - modulo)/26); 
     } 

     return columnName; 

    } 



     // Insert into Excel 
    public static void ExcelInsert(string mFunction, string mColor, int mQty, string mFau, string mPrice) 
    { 
     var values = new List<string> 
         { 
          mFunction, 
          mColor, 
          mQty.ToString(), 
          mFau, 
          mPrice 
         }.ToArray(); 

     var rowNumber = Globals.ThisAddIn.Application.ActiveCell.Row; 
     var columnNumber = Globals.ThisAddIn.Application.ActiveCell.Column; 
     var columnLetter = GetColumnLetter(columnNumber); 

     for (var i = 0; i < values.Count(); i++) 
     { 
      var range = Globals.ThisAddIn.Application.Range[String.Format("{0}{1}", columnLetter, rowNumber)]; 
      range.Value = values[i]; 
      columnNumber++; 
      columnLetter = GetColumnLetter(columnNumber); 
     } 
    } 
+0

因此,您的用戶將數據插入到Windows窗體中,然後您想要將這些值放到Excel電子表格上的某些單元格上? – JMK

+0

是的,這是正確的。 – Kaleet

+0

每次都是一樣的單元格?例如,是否希望用戶輸入的第一個文本框中的數據進入A3,下一個進入B6等? – JMK

回答

2

我會嘗試獲取活動單元格的位置,然後正確地添加每個值一個在你去像這樣的時刻:

using Excel = Microsoft.Office.Interop.Excel; 

void MyMethod() 
{ 
    //Replace '7' with the number of fields on your Windows Form 
    int numberOfFields = 7; 

    string[] array = new string[numberOfFields]; 

    array[0] = textBoxOneValue; 
    array[1] = textBoxTwoValue; 
    array[2] = textBoxThreeValue; 
    array[3] = textBoxFourValue; 
    array[4] = textBoxFiveValue; 
    array[5] = textBoxSixValue; 
    array[6] = textBoxSevenValue; 

    Excel.Application application = new Excel.Application(); 
    Excel.Workbook workbook = application.Workbooks.Open(@"C:\whatever.xlsx"); 
    Excel.Worksheet worksheet = workbook.ActiveSheet; 

    Excel.Range activeCell = application.ActiveCell; 

    int rowNumber = activeCell.Row; 
    int columnNumber = activeCell.Column; 

    string columnLetter = GetColumnLetter(columnNumber); 

    for(int i = 0; i < numberOfFields; i++) 
    { 
     Excel.Range range = worksheet.get_Range(String.Format("{0}{1}", columnLetter, rowNumber)); 
     range.Value = array[i]; 
     columnNumber++; 
     columnLetter = GetColumnLetter(columnNumber); 
    } 
} 

string GetColumnLetter() 
{ 
    int dividend = columnNumber; 
    string columnName = String.Empty; 
    int modulo; 

    while (dividend > 0) 
    { 
     modulo = (dividend - 1) % 26; 
     columnName = Convert.ToChar(65 + modulo).ToString() + columnName; 
     dividend = (int)((dividend - modulo)/26); 
    } 

    return columnName; 

} 

當然感謝GrahamGetColumnLetter方法,這可能是我見過的最天才的事情!

+0

好的。我會在打包遊戲後嘗試這種方法。去包裝! – Kaleet

+0

GetColumnLetter內的瘋狂工作!我已將我的修改發佈到代碼中。 – Kaleet

0

你並不需要一個循環。

如果arr是一個數組,然後

ActiveCell.Resize(, UBound(arr) - LBound(arr) + 1).Value = arr 
+0

好吧讓我測試這個快速 – Kaleet

+0

好吧,掛在你可以在C#中做UBound嗎? – Kaleet

+0

那麼它的工作,我用GetUpperBound和LowerBound,除了它沒有下一行。但是好的開始沒有那麼少。 – Kaleet

0

這裏是通過數組迭代

Dim x(3) As String ' your array 
x(0) = "abc" 
x(1) = "def" 
x(2) = "ghi" 
x(3) = "jkl" 

Dim r As Range ' range to paste 
Set r = ActiveCell 

For Each s In x 
    r.Value = s 
    Set r = r.Offset(,1) ' keep going right 
Next 

如果你沒有在位置以下信息可能有助於經典路線0

Dim x(4) As String ' this can actually contain 5 items, from 0 to 4 
x(1) = "abc" 
x(2) = "def" 
x(3) = "ghi" 
x(4) = "jkl" 

Dim r As Range ' range to paste 
Set r = ActiveCell 

For i = 1 To UBound(x) ' skip 0 
    r.Value = x(i) 
    Set r = r.Offset(, 1) ' keep going right 
Next 
+1

這個問題有一個C#標籤,這讓我想到OP想要通過.Net與Excel互操作,你認爲情況並非如此嗎? – JMK