2012-03-22

Excel VBA: Remove Empty rows


Remove active cell empty rows
------------------------------------
Sub RemoveEmptyRows()
    Dim R As Range
    Set R = Application.ActiveCell
   
    Columns(R.Column).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

2012-03-15

CentOS 6 install VMware Tools

# cd /mnt
[mnt]# mkdir cdrom
[mnt]# mount /dev/cdrom /mnt/cdrom
[mnt]# cp /mnt/cdrom/VMwareTools-8.8.2-590212.tar.gz /tmp
[mnt]# cd /tmp
[tmp]# tar zxvf VMwareTools-8.8.2-590212.tar.gz
[tmp]# cd vmware-tools-distrib/
[vmware-tools-distrib]# ./vmware-install.pl


安裝完成後可用下面指令更改設定:
vmware-config-tools.pl

2012-03-11

Get Method Name


取得目前執行的函數名稱
using System.Diagnostics;

// get call stack
StackTrace stackTrace = new System.Diagnostics.StackTrace();
// get calling method name
Debug.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);
Debug.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name);
Debug.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);

偵測到 ContextSwitchDeadlock

程式用迴圈長時間處理Excel 檔結果出現以下訊息。


偵測到 ContextSwitchDeadlock
---
CLR 在過去 60 秒一直無法從 COM 內容 0x16ce00 轉換為 COM 內容 0x16cbd8。擁有該目的內容/Apartment 的執行緒,很可能正在進行非提取等候或正在處理非常長的執行作業,而未提取 Windows 訊息。這種情況通常會對效能產生負面影響,甚至可能導致應用程式停止回應,或導致記憶體使用量持續隨時間而累積。若要避免這個問題,所有單一執行緒的 Apartment (STA) 執行緒都應該使用提取等候基本方法 (例如 CoWaitForMultipleHandles),並且在長時間的執行作業中定期提取訊息。



這個訊息只會在偵錯時出現,發佈的後並不會有,所以可以按繼績不理會。
如果確定程式沒有錯誤,又不想讓它顯示,可以透過以下選項取消讓它不顯示。
Debug -> Exceptions -> Managed Debug Assistants 去掉ContextSwitchDeadlock的勾選
偵錯 -> 例外狀況 -> Managed Debug Assistants 去掉 ContextSwitchDeadlock 的撙回項目勾選

VSTO Excel Copy row to another worksheet


//複製資料
Excel.Range srcRange = wsSrc.Rows[target.Row] as Excel.Range;
Excel.Range destRange = wsDest.Rows[dest.Row] as Excel.Range;
destRange.Value2 = srcRange.Value2;

//複製無formulas
Object template = Settings.Default.TemplatePath;
Workbook wb = Globals.ThisAddIn.Application.Workbooks.Add(template) as Workbook;
Excel.Range r = (Excel.Range)wb.Application.ActiveCell[1, "A"];
const int xlShiftDown = -4121;
Excel.Range oRow = r.EntireRow;
oRow.Insert(xlShiftDown, Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow);


//複製有formulas
Object template = Settings.Default.TemplatePath;
Excel.Workbook wb = Globals.ThisAddIn.Application.Workbooks.Add(template)
    as Excel.Workbook;
Excel.Range r = (Excel.Range)wb.Application.ActiveCell[1, "A"];
Excel.Range oRow = r.EntireRow;
oRow.Select();
oRow.Copy();
Excel.Range rg = (Excel.Range)rg[2, "A"];
rg.Select();
rg.PasteSpecial(Excel.XlPasteType.xlPasteAll,
    Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
    Type.Missing,
    Type.Missing);
wb.Application.CutCopyMode = Excel.XlCutCopyMode.xlCopy;

2012-03-10

Excel.Range To Array, Array To Excel.Range

Range to Array



        private void btnRange2Array_Click(object sender, EventArgs e)

        {
            Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
            Excel.Range r = ws.get_Range("A1", "B3");
            System.Array arr = (System.Array)r.Value2;
            string[] ar= new string[arr.Length];
            int i = ar.GetLowerBound(0);
            foreach (var item in arr)
                ar[i++] = item!=null? item.ToString():String.Empty;

            txtResults.Text = String.Join(",", ar);

        }



Array to Range




        private void btnArray2Range_Click(object sender, EventArgs e)
        {
            string[,] arr = new string[,] { {"AA", "BB"}, {null,"DD"},{"EE","FF"}};
            Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
            Excel.Range r = ws.get_Range("A1", "B3");
            r.Value2 = arr;
        }


enum to string


VSTO 的 Excel有個  XlCellType 如同下面的定義:


public enum XlCellType
{
      xlLastCell,
      xlBlanks,
      ....      ,
      .... 以下省略
}

我想要將它轉成字串並加入控制項中。
所以透過下面的方法可以達成我要的轉換,下面的語法中 cbCellType 是 DropDownList( WinForm 用 ComboBox).

            cbCellType.Items.Clear();
            // Conversion from Enum to String 
            foreach (string item in Enum.GetNames(typeof(Excel.XlCellType)))
                cbCellType.Items.Add(item);



  

enum轉換字串的程式碼是:


string name= Enum.GetName(typeof(Excel.XlCellType),  XlCellType.xlLastCell );

那你現在如果有一個 enum  的字串叫 "xlLastCell" 我想要將它轉成 Enum 值,則可以使用以下方法將它轉換成 Enum。

// Conversion from String to Enum
Excel.XlCellType celltype = (XlCellType)Enum.Parse(typeof(XlCellType), "xlLastCell");   

2012-03-01

英文 星期

常用的星期英文縮寫:
星期一:Mon.=Monday
星期二:Tues.=Tuesday
星期三:Wed.=Wednesday
星期四:Thur.=Thurday
星期五:Fri.=Friday
星期六:Sat.=Saturday
星期天:Sun.=Sunday英語日期中的大寫、縮寫

英文 十二個月

一月Jan. January 
二月Feb. February 
三月Mar. March 
四月Apr. April 
五月May. May 
六月June. June 
七月July. July 
八月Aug. Aguest 
九月Sept. September 
十月Oct. October 
一月Nov. November 
十二月Dec. December
縮寫:正規的英語中六月、七月不縮寫,九月的縮寫是4個字母,其他月份3個字母。 


January--1月
在羅馬傳說中,有一位名叫January的守護神,生有先後兩副臉,一副回顧過去,一副要眺望未來。人們認為選擇他的名字作為除舊迎新的第一個月月名,很有意義。英語January,便是由這位守護神的拉丁文名字January演變而來的。

February--2月
每年2 月初,羅馬人民都要殺牲飲酒,歡慶菲勃盧姆節。這一天,人們常用一種牛、草製成的名叫Februa的鞭子,抽打不育的婦女,以求懷孕生子。這一天,人們還要懺悔自己過去一年的罪過,洗刷自己的靈魂,求得神明的饒恕,使自己成為一個貞潔的人。英語2月February,便是由拉丁文Februar-ius (即菲勃盧姆節)演變而來。


March---3月
3月,原是羅馬舊曆法的1 月,新年的開始。凱撒大帝改革曆法後,原來的1月變成3月,但羅馬人仍然把3 月看做是一年的開始。另外,按照傳統習慣,3月是每年出征远战的季節。為了紀念戰神瑪爾斯,人們便把這位戰神的拉丁名字作為3月的月名。英語3月March,便是由這位戰神的名字演變而來的。


April--4月
羅馬的4月,正是大地回春.鮮花初綻的美好季節。英文4月April便由拉丁文April(即開花的日子)演變而來。


May--5月
羅馬神話中的女神瑪雅,專門司管春天和生命。為了紀念這位女神,羅馬人便用她的名字--拉丁文Maius命名5月,英文5月May便由這位女神的名字演變而來。


June--6月
羅馬神話中的Junius,是眾神之王,又是司管生育和保護婦女的神。古羅馬對她十分崇敬,便把6月奉獻給她,以她的名字--拉丁文Junius來命名6 月。英語6月June便由這位女神的名字演變而來。也有學者認為,Junius可能是古代拉丁家族中一個顯赫貴族的姓氏。


July--7月
羅馬統治者Julius Caesar被刺死後,著名的羅馬將軍馬克·安東尼建議將凱撒大帝誕生的7月,用凱撒的名字--拉丁文Julius(即朱里斯)命名之。這一建議得到了元老院的通過。英語7月July由此演變而來。


August--8月
Julius Caesar死後,由他的甥孫屋大維續任羅馬皇帝。為了和凱撒齊名,他也想用自己的名字來命名一個月份。他的生日在9月,但他選定8月。因為他登基後,羅馬元老院在8 月授予他Augustus(奧古斯都)的尊號。於是,他決定用這個尊號來命名8月。原來8月比7月少一天,為了和凱撒平起平坐,他又決定從2月中抽出一天加在8月上。從此,2月便少了一天。英語8月August便由這位皇帝的拉丁語尊號演變而來。


September--9月
老曆法的7月,正是凱撒大帝改革曆法後的9月,拉丁文Septem是"7"月的意思。雖然曆法改革了,但人們仍襲用舊名稱來稱呼9月。英語9月September便由此演變而來。


October--10月
英語10月,來自拉丁文Octo,即"8"的意思。它和上面講的9月一樣,曆法改了,稱呼仍然沿用未變。


November--11月
羅馬皇帝奧古斯都和凱撒都有了自己名字命名的月份,羅馬市民和元老院要求當時的羅馬皇帝梯比里烏斯用其名命名11月。但梯比里烏斯沒有同意,他明智地對大家說,如果羅馬每個皇帝都用自己的名字來命名月份,那麼出現了第13個皇帝怎麼辦?於是,11月仍然保留著舊稱Novem,即拉丁文"9"的意思。英語 11月November便由此演變而來。


December--12月
羅馬皇帝琉西烏斯要把一年中最後一個月用他情婦的Amagonius的名字來命名,但遭但元老院的反對。於是,12月仍然沿用舊​​名Decem,即拉丁文"10"的意思。英語12月December,便由此演變而來。

尊重、包容、體諒、信任。

adsense