於工作需要, 所以又硬著頭皮寫出以下的EXCEL VBA , 發現不錯用, 分享出來:
Private Sub Workbook_Open()
Call ClearWorkSheet
Call CopyWorkSheet
End Sub
Sub ClearWorkSheet()
Application.DisplayAlerts = False
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "首 頁" Then
Ws.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Sub CopyWorkSheet()
Dim SRC As Workbook
Dim DES As Workbook
Dim WKS As Worksheet
'Set SRC = Workbooks.Open(ActiveWorkbook.Path & "\HKG.xls")
Set DES = ThisWorkbook
Set WKS = ThisWorkbook.Worksheets(1)
'SRC.Activate
'SRC.Worksheets.Copy BEFORE:=DES.Worksheets(1)
'SRC.Worksheets(1).Copy BEFORE:=DES.Worksheets(1)
'SRC.Close
Set fso = CreateObject("Scripting.FileSystemObject")
Dim strText As String
Dim i As Integer
Set flds = fso.GetFolder(ActiveWorkbook.Path).Files
i = 1
For Each f In flds
If f.Name <> "TARGET.xls" Then
Set SRC = Workbooks.Open(f.Path)
SRC.Worksheets.Copy BEFORE:=DES.Worksheets(1)
SRC.Close
' strText = strText & i & "." & f.Name & vbCrLf
End If
i = i + 1
Next
End Sub
2011年12月29日 星期四
2011年12月21日 星期三
C#寫入SQL字串時, 須要注意的單引號的事
商業書信時常發現有一種寫法就是Ms.Wang's .
看起來很正常, 如果Ms.Wang's 出現在程式要將這個字串寫入SQL SERVER 時, 卻發現老是出錯,寫不進入.
經過檢查, 發現是因為 問題出現在單引號上, 這個單引號會造成SQL SERVER 在解析這些字串時出現錯誤, 因為SQL SERVER 本身就是利用單引號在解析字串, 結果字串內又含有單引號造成SQL SERVER 解析出錯.
例如:
String MyStr = " Hello, This is Ms.Wang's monther ";
String MySql = "Update MyTable set Message = '" + MyStr + "' ";
當我們執行這個 SQL script 時, 經由展開, 我們發現 MySql 的內容變成.
Update MyTable set Message = ' Hello, This is Ms.Wang's monther '
有沒有發現 , 上面的這個SQL script 有三個單引號, 難怪 SQL SERVER 會出現錯誤.
這時改進的方法就是先將字串作檢查, 如果發現有使用到單引號, 就先作處理, 就是把一個單引號變成兩個, 這樣SQL SERVER 就知道, 這個是一個單引號, 而不是字串的結束符號.
String MySql = "Update MyTable set Message = '" + MyStr.Replace("'", "''") + "' ";
切記, 切記!!
看起來很正常, 如果Ms.Wang's 出現在程式要將這個字串寫入SQL SERVER 時, 卻發現老是出錯,寫不進入.
經過檢查, 發現是因為 問題出現在單引號上, 這個單引號會造成SQL SERVER 在解析這些字串時出現錯誤, 因為SQL SERVER 本身就是利用單引號在解析字串, 結果字串內又含有單引號造成SQL SERVER 解析出錯.
例如:
String MyStr = " Hello, This is Ms.Wang's monther ";
String MySql = "Update MyTable set Message = '" + MyStr + "' ";
當我們執行這個 SQL script 時, 經由展開, 我們發現 MySql 的內容變成.
Update MyTable set Message = ' Hello, This is Ms.Wang's monther '
有沒有發現 , 上面的這個SQL script 有三個單引號, 難怪 SQL SERVER 會出現錯誤.
這時改進的方法就是先將字串作檢查, 如果發現有使用到單引號, 就先作處理, 就是把一個單引號變成兩個, 這樣SQL SERVER 就知道, 這個是一個單引號, 而不是字串的結束符號.
String MySql = "Update MyTable set Message = '" + MyStr.Replace("'", "''") + "' ";
切記, 切記!!
2011年12月20日 星期二
差點讓我冒冷汗的 vs2005 unicode 問題.
由於VS2005 一直號稱沒有UNICODE 的問題, 所以我一直 對於VS2005 UNICODE 很放心的. 不料在作一次展示時. 卻發現 "堃", "浜" 等字, 寫入至 SQL SERVER 時出現 ??.
一開始以為 是 SQL SERVER 上該欄位沒有使用 NVARCHAR 的關係, 不料把欄位改成 NVARCHAR 後, 執行程式, 寫入上面兩個字時, 仍出現? .
於是我開始冒冷汗, 難道是我搞錯了嗎? 還好有Google 大神的幫忙, 最後才發現. 原來是在SQL SERVER 要寫入含有 上面提到的這些特別字時, 須要在 寫入字串的單引號前加入一個 N 字, 這樣這些字才不會變成亂碼寫入到資料庫.
例如:
UPDATE AA SET NAME = N'王堃浜' <== 如果 少了N , 則寫入到SQL SERVER 的字仍會是亂碼.
真是........
如果是用 C#, 則可以參考下面寫法:
string MySql = "UPDATE MYTABLE SET ";
MySql += " NAME = N'" + txtNAME.Text.Trim() + "' ";
MySql += " WHERE CODE = '" + txtNO.Text.Trim() + "' ";
注意上面的例子, 在字串單引號前,記得要加N指明這個是UNICODE 的字串, 這樣就可以存入UNICODE 的字元到SQL SERVER 內.
一開始以為 是 SQL SERVER 上該欄位沒有使用 NVARCHAR 的關係, 不料把欄位改成 NVARCHAR 後, 執行程式, 寫入上面兩個字時, 仍出現? .
於是我開始冒冷汗, 難道是我搞錯了嗎? 還好有Google 大神的幫忙, 最後才發現. 原來是在SQL SERVER 要寫入含有 上面提到的這些特別字時, 須要在 寫入字串的單引號前加入一個 N 字, 這樣這些字才不會變成亂碼寫入到資料庫.
例如:
UPDATE AA SET NAME = N'王堃浜' <== 如果 少了N , 則寫入到SQL SERVER 的字仍會是亂碼.
真是........
如果是用 C#, 則可以參考下面寫法:
string MySql = "UPDATE MYTABLE SET ";
MySql += " NAME = N'" + txtNAME.Text.Trim() + "' ";
MySql += " WHERE CODE = '" + txtNO.Text.Trim() + "' ";
注意上面的例子, 在字串單引號前,記得要加N指明這個是UNICODE 的字串, 這樣就可以存入UNICODE 的字元到SQL SERVER 內.
2011年11月25日 星期五
Android學習筆記-GDD02 解題
package COM.TQC.GDD02;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class GDD02 extends Activity {
public static final String PREF_NAME = "GDD02_PREF";
public static final String key01 = "key01";
public static final String key02 = "key02";
public static final String key03 = "key03";
// 加入以下的 constant
public static final int MODE_WORLD_WRITTABLE = 0;
private EditText EditText01;
private EditText EditText02;
private EditText EditText03;
// 多加入一個 button 宣告
private Button bt;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取出所有元件
EditText01 = (EditText) findViewById(R.id.editText1);
EditText02 = (EditText) findViewById(R.id.editText2);
EditText03 = (EditText) findViewById(R.id.editText3);
bt = (Button) findViewById(R.id.button1);
// 由 SharedPreferencs 取出內容,
SharedPreferences st = getSharedPreferences(PREF_NAME,0);
String value01 = st.getString(key01, "");
String value02 = st.getString(key02, "");
String value03 = st.getString(key03, "");
// Assigne 至 EditText 內
EditText01.setText(value01);
EditText02.setText(value02);
EditText03.setText(value03);
// button 指定 OnClickListener
// 背下這個語法
bt.setOnClickListener(new Button.OnClickListener()
{
// 沒有 @Override
// 記得用 public void
public void onClick(View v)
{
finish();
}
}
);
}
// 記得用 @Override
// 得要用 protected void
// 同時要作 super.onStop();
@Override
protected void onStop() {
super.onStop();
SharedPreferences st = getSharedPreferences(PREF_NAME,MODE_WORLD_WRITTABLE);
SharedPreferences.Editor editor = st.edit();
editor.putString(key01, "" + EditText01.getText());
editor.putString(key02, "" + EditText02.getText());
editor.putString(key03, "" + EditText03.getText());
editor.commit();
}
}
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class GDD02 extends Activity {
public static final String PREF_NAME = "GDD02_PREF";
public static final String key01 = "key01";
public static final String key02 = "key02";
public static final String key03 = "key03";
// 加入以下的 constant
public static final int MODE_WORLD_WRITTABLE = 0;
private EditText EditText01;
private EditText EditText02;
private EditText EditText03;
// 多加入一個 button 宣告
private Button bt;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取出所有元件
EditText01 = (EditText) findViewById(R.id.editText1);
EditText02 = (EditText) findViewById(R.id.editText2);
EditText03 = (EditText) findViewById(R.id.editText3);
bt = (Button) findViewById(R.id.button1);
// 由 SharedPreferencs 取出內容,
SharedPreferences st = getSharedPreferences(PREF_NAME,0);
String value01 = st.getString(key01, "");
String value02 = st.getString(key02, "");
String value03 = st.getString(key03, "");
// Assigne 至 EditText 內
EditText01.setText(value01);
EditText02.setText(value02);
EditText03.setText(value03);
// button 指定 OnClickListener
// 背下這個語法
bt.setOnClickListener(new Button.OnClickListener()
{
// 沒有 @Override
// 記得用 public void
public void onClick(View v)
{
finish();
}
}
);
}
// 記得用 @Override
// 得要用 protected void
// 同時要作 super.onStop();
@Override
protected void onStop() {
super.onStop();
SharedPreferences st = getSharedPreferences(PREF_NAME,MODE_WORLD_WRITTABLE);
SharedPreferences.Editor editor = st.edit();
editor.putString(key01, "" + EditText01.getText());
editor.putString(key02, "" + EditText02.getText());
editor.putString(key03, "" + EditText03.getText());
editor.commit();
}
}
Android 學習筆記(GDD01解題)
1. main.xml 使用 AbsoluteLayout放入以下元件:
textView1 取用 strings 的 title. ==> 計算你/妳的BMI值
textView2 取用 strings 的 text3 ==> 男性/女性
textView3 取用 strings 的 text1 ==> 身高(m):
textView4 取用 strings 的 text2 ==> 體重(kg):
height(EditText)
weight(EditText)
button1 直接在 text輸入'計算'
RadioGroup (horizontal)下放入兩個RadioButton text 分別為男性(male)及女性(female),
男性的RadioButton要Checked="true"
2. 實作 GDD01.java 的 onClick 事件
//從輸入介面中取出了的身高、體重值,要將身高、體重值傳送給 child_Activity 後作計算
etheight = (EditText) findViewById(R.id.height);
double height = Double.parseDouble(etheight.getText().toString());
etweight = (EditText) findViewById(R.id.weight);
double weight = Double.parseDouble(etweight.getText().toString());
String Sex="";
rb1 = (RadioButton)findViewById(R.id.male);
rb2 = (RadioButton)findViewById(R.id.female);
if (rb1.isChecked())
{
Sex = "M";
}
else
{
Sex = "F";
}
//這些附加在 Intent 上的訊息都儲存在 Bundle 物件中
Intent intent = new Intent();
intent.setClass(GDD01.this, GDD01_child.class); ==> 注意裡使用 intent.setClass()
Bundle b = new Bundle();
b.putDouble("height", height);
b.putDouble("weight", weight);
b.putString("Sex", Sex);
//透過「intent.putExtras(bundle)」敘述,將「bundle」 物件附加在 Intent 上,隨著 Intent 送出而送出
intent.putExtras(b);
startActivityForResult(intent,0); ==> 注意這裡使用 startActivityForResult(intent,0)
3. GDD01_child.java 要實在三個Function
BMI格式化 / 取得 BMI / 依 BMI取得建議值.
BMI 格式化 使用 JAVA 的 DecmialFormat 功能.
private String format(double num)
{
DecimalFormat nf = new DecimalFormat("0.00");
String s = nf.format(num);
return s;
}
計算BMI
private String getBMI(double height, double weight)
{
double BMI_value = weight / ( height * height);
String aa = getStrig(R.string.report_result);
String bb = format(BMI_value);
return aa + bb;
}
取出建議值
//依BMI值取得建議
private String getAdvice (String Sex, double height, double weight)
{
double BMI_MAX;
double BMI_MIN;
double BMI = weight / ( height * height);
if (Sex.equals("M")){
BMI_MAX = 25.0;
BMI_MIN = 20.0;
}
else
{
BMI_MAX = 22.0;
BMI_MIN = 18.0;
}
if (BMI>BMI_MAX)
{
return getString(R.string.advice_heavy);
}
else if (BMI<BMI_MIN)
{
return getString(R.string.advice_light);
}
else
{
return getString(R.string.advice_average);
}
}
4. 在 androidManifest.xml
內要加上 GDD01_child 的activity , 差點忘了! 重要
<activity android:name="GDD01_child"></activity>
textView1 取用 strings 的 title. ==> 計算你/妳的BMI值
textView2 取用 strings 的 text3 ==> 男性/女性
textView3 取用 strings 的 text1 ==> 身高(m):
textView4 取用 strings 的 text2 ==> 體重(kg):
height(EditText)
weight(EditText)
button1 直接在 text輸入'計算'
RadioGroup (horizontal)下放入兩個RadioButton text 分別為男性(male)及女性(female),
男性的RadioButton要Checked="true"
2. 實作 GDD01.java 的 onClick 事件
//從輸入介面中取出了的身高、體重值,要將身高、體重值傳送給 child_Activity 後作計算
etheight = (EditText) findViewById(R.id.height);
double height = Double.parseDouble(etheight.getText().toString());
etweight = (EditText) findViewById(R.id.weight);
double weight = Double.parseDouble(etweight.getText().toString());
String Sex="";
rb1 = (RadioButton)findViewById(R.id.male);
rb2 = (RadioButton)findViewById(R.id.female);
if (rb1.isChecked())
{
Sex = "M";
}
else
{
Sex = "F";
}
//這些附加在 Intent 上的訊息都儲存在 Bundle 物件中
Intent intent = new Intent();
intent.setClass(GDD01.this, GDD01_child.class); ==> 注意裡使用 intent.setClass()
Bundle b = new Bundle();
b.putDouble("height", height);
b.putDouble("weight", weight);
b.putString("Sex", Sex);
//透過「intent.putExtras(bundle)」敘述,將「bundle」 物件附加在 Intent 上,隨著 Intent 送出而送出
intent.putExtras(b);
startActivityForResult(intent,0); ==> 注意這裡使用 startActivityForResult(intent,0)
3. GDD01_child.java 要實在三個Function
BMI格式化 / 取得 BMI / 依 BMI取得建議值.
BMI 格式化 使用 JAVA 的 DecmialFormat 功能.
private String format(double num)
{
DecimalFormat nf = new DecimalFormat("0.00");
String s = nf.format(num);
return s;
}
計算BMI
private String getBMI(double height, double weight)
{
double BMI_value = weight / ( height * height);
String aa = getStrig(R.string.report_result);
String bb = format(BMI_value);
return aa + bb;
}
取出建議值
//依BMI值取得建議
private String getAdvice (String Sex, double height, double weight)
{
double BMI_MAX;
double BMI_MIN;
double BMI = weight / ( height * height);
if (Sex.equals("M")){
BMI_MAX = 25.0;
BMI_MIN = 20.0;
}
else
{
BMI_MAX = 22.0;
BMI_MIN = 18.0;
}
if (BMI>BMI_MAX)
{
return getString(R.string.advice_heavy);
}
else if (BMI<BMI_MIN)
{
return getString(R.string.advice_light);
}
else
{
return getString(R.string.advice_average);
}
}
4. 在 androidManifest.xml
內要加上 GDD01_child 的activity , 差點忘了! 重要
<activity android:name="GDD01_child"></activity>
2011年11月24日 星期四
Android 學習筆記(GDD03解題)
GDD03 解題重點:
補充說明.
GDD03_child 由原圖換另一張圖.
1. image.xml 加 一個 ImageView ID定為 ImageView01. 同時將圖片拉進去.
2. AndroidManifest.xml 加入以下設定: (記得用操作才不會放錯位置 )
加入一個 uses permission :
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
加入一個 Activity
<activity android:name="Image"></activity>
加入一個 receiver ( 內含一個 SMS_RECEIVED的 intent-filter )
<receiver android:name="SMSreceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
3. 實作 receiver 內的 onReceive()事件.
public void onReceive(Context context, Intent intent)
{
Intent i = new Intent(context,Image.class); ==> 由context 轉至 Image.class
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ==> 是產生一個新的TASK
context.startActivity(i); ==> 啟動
}
補充說明.
GDD03_child 由原圖換另一張圖.
1. image.xml 加 一個 ImageView ID定為 ImageView01. 同時將圖片拉進去.
2. AndroidManifest.xml 加入以下設定: (記得用操作才不會放錯位置 )
加入一個 uses permission :
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
加入一個 Activity
<activity android:name="Image"></activity>
加入一個 receiver ( 內含一個 SMS_RECEIVED的 intent-filter )
<receiver android:name="SMSreceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
3. 實作 receiver 內的 onReceive()事件.
public void onReceive(Context context, Intent intent)
{
Intent i = new Intent(context,Image.class); ==> 由context 轉至 Image.class
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ==> 是產生一個新的TASK
context.startActivity(i); ==> 啟動
}
2011年11月23日 星期三
SQL 改欄位大小, 又遇到個小鐵板
分類: SQL 程式開發
2011/11/23 15:00
原本想說把某個欄位大小由24 改為25 , 應該是個小事情, 結果一作才發現又是"鐵板"一塊.
原因是這些欄位有可能在不同的TABLE 會互相作關聯, 同時也有可能是PRIMARY KEY.
不得己, 改用SQL 語法,見招拆招:
1.這種情況最好了,
----------------------------------------------------------------------------------
alter table DJ_TABLE ALTER COLUMN ABC CHAR(25)
因為沒有任何限制
----------------------------------------------------------
2.下面這個就有點麻煩, 因為是個FOREIGH KEY 的欄位
作法:
先把這個 FOREIGN KEY DROP 掉
再調整欄位大小
最後再把 FOREIGH KEY ADD回去
----------------------------------------------------------
ALTER TABLE VOY DROP CONSTRAINT [IX_ABC]
alter table ABC_TABLE ALTER COLUMN ABC_COLUMN CHAR(25)
alter table ABC_TABLE ADD CONSTRAINT [IX_ABC] UNIQUE NONCLUSTERED
(
[ABC_COLUMN] ASC,
[DEF_COLUMN] ASC,
[GHI_COLUMN] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
----------------------------------------------------------
3.最後這毎更麻煩, 因為是個PRIMARY KEY 的欄位
作法:
先把這個 FOREIGN KEY DROP 掉
再調整欄位大小 , 記得要作 NOT NULL , 因為 PRIMARY KEY
最後再把 PRIMARY KEY ADD回去
----------------------------------------------------------
alter table V_TABLE DROP CONSTRAINT [PK_V_TABLE]
alter table V_TABLE ALTER COLUMN NAME CHAR(25) NOT NULL
alter table V_TABLE ADD CONSTRAINT [PK_V_TABLE] PRIMARY KEY CLUSTERED
(
[CODE] ASC,
[NAME] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
----------------------------------------------------------
訂閱:
文章 (Atom)