2012-02-13 11:51

Excel 提醒重複輸入相同的資料

先來瞭解一下 COUNTIF 的使用方式,以下是 Office 官方的片段說明:
計算某範圍內符合某搜尋準則的儲存格個數。
語法:COUNTIF(range,criteria)
range
是您想計算符合準則之儲存格個數的儲存格範圍。
criteria
是用以決定是否要列入計算的搜尋準則,可以是數字、表示式或文字。例如,criteria 可以是 32、"32"、">32" 或 "apples"。


只要在『資料驗證』中加入重複資料檢查的條件,就可以自動提醒重複輸入相同的資料,不囉唆!看圖說故事吧!

先將 A 欄整個選取,然後『資料 -> 驗證』


設定 -> 選擇『自訂』 -> 公式 =COUNTIF(A:A,A1)=1


在『錯誤提醒』中填寫想要的提示訊息


增加一個相同的資料來測試一下
2012-02-13 10:48

Excel 使用[自動篩選]找出重複的資料

先來瞭解一下 COUNTIF 的使用方式,以下是 Office 官方的片段說明:
計算某範圍內符合某搜尋準則的儲存格個數。
語法:COUNTIF(range,criteria)
range
是您想計算符合準則之儲存格個數的儲存格範圍。
criteria
是用以決定是否要列入計算的搜尋準則,可以是數字、表示式或文字。例如,criteria 可以是 32、"32"、">32" 或 "apples"。


只要能算出重複的數量,就可以使用『自動篩選』來找出重複資料了,所以需要額外的欄位來計算重複的數量,太多廢話了,還是看圖說故事吧!

在B欄加入公式=COUNTIF(A:A,A2)


選擇B1這個欄位,然後『資料 -> 篩選 -> 自動篩選


接著在篩選選項中選擇『(自訂...)


將重複數量大於 1 的項目篩選出來


很簡單就可以找出重複的資料了
2012-02-13 10:16

Excel 標記重複的資料

先來瞭解一下 COUNTIF 的使用方式,以下是 Office 官方的片段說明:
計算某範圍內符合某搜尋準則的儲存格個數。
語法:COUNTIF(range,criteria)
range
是您想計算符合準則之儲存格個數的儲存格範圍。
criteria
是用以決定是否要列入計算的搜尋準則,可以是數字、表示式或文字。例如,criteria 可以是 32、"32"、">32" 或 "apples"。


透過『設定格式化的條件』就可以很容易做到『標記重複資料』,接著就來看圖說故事吧!

先將 A 欄整個選取,然後『格式 -> 設定格式化的條件


選擇『公式為』,再輸入 =COUNTIF(A:A,A1)>1,在設定要套用的『格式


在『圖樣』中將背景設定為紅色


然後就可以看到有重複的資料就被標示為紅色底色了
2012-02-01 15:18

[VBA] Office Excel 2003 連接 Web Service

參考來源:Excel 透過 VBA 呼叫 Web Service

首先需要加入 Soap Library
在『Visual Basic編輯器』中:工具 -> 設定引用項目 -> 勾選『Microsoft Office Soap Type Library v3.0』

  1. '連接 EpgSoap 
  2. Set EpgSoap = New SoapClient30 
  3. EpgSoap.MSSoapInit ("http://webservices.daehosting.com/services/isbnservice.wso?WSDL") 
  4.  
  5. '請求 EpgSoap 
  6. MsgBox EpgSoap.IsValidISBN10("986-7889-18-5") 
  7.  
  8. '關閉 EpgSoap 
  9. Set EpgSoap = Nothing 
2012-02-01 14:05

[PHP] 用 SoapServer 建立 Microsoft Office Research Service

這裡我用 Webservice Helper 來處理 WSDL 的問題,所以範例也是 Base 在 Webservice Helper 上面,在開始前請檢查是否有 php_soapphp_xsl 這兩個套件。


為了相容於 Research Service 的名稱空間,在輸出入的定義上需要在包一層資料類型,所以需要以下的類型定義:
StatusResponse.class.php
  1. <?php 
  2. /** 
  3. * Return object to Status method 
  4. */ 
  5. class StatusResponse { 
  6.    /** @var string */ 
  7.    public $StatusResult; 
  8. } 

Registration.class.php
  1. <?php 
  2. /** 
  3. * Input object to Registration method 
  4. */ 
  5. class Registration { 
  6.    /** @var string */ 
  7.    public $registrationXml; 
  8. } 

RegistrationResponse.class.php
  1. <?php 
  2. /** 
  3. * Return object to Registration method 
  4. */ 
  5. class RegistrationResponse { 
  6.    /** @var string */ 
  7.    public $RegistrationResult; 
  8. } 

Query.class.php
  1. <?php 
  2. /** 
  3. * Input object to Query method 
  4. */ 
  5. class Query { 
  6.    /** @var string */ 
  7.    public $queryXml; 
  8. } 

QueryResponse.class.php
  1. <?php 
  2. /** 
  3. * Return object to Query method 
  4. */ 
  5. class QueryResponse { 
  6.    /** @var string */ 
  7.    public $QueryResult; 
  8. } 


接著是建立 Web Service 的 Method,主要定義 Registration 跟 Query 這兩個 Method 就可以了,Registration 是用在新增 Research Service 到 Research Pane 時會呼叫的 Method,主要是提供 Research Pane 所需要的 Service 資訊。
而 Query 則是真正再處理資料查詢的 Method,而 QueryResponse 中的 domain 及 QueryId 必需與 QueryXml 中所給的相同,不然 Client 端會無法辨識回傳結果。
  1. <?php 
  2. /** 
  3. * Microsoft Office Research Service 
  4. * 
  5. */ 
  6.  
  7. class MsOfficeResearch { 
  8.  
  9.    /** 
  10.     * Entry point to test if server is alive. Will return 'ONLINE' or 'OFFLINE' 
  11.     * @param void 
  12.     * @return StatusResponse 
  13.     */ 
  14.    function Status() { 
  15.        $result = new StatusResponse; 
  16.        $result->StatusResult = 'ONLINE'; 
  17.        return $result; 
  18.    } 
  19.  
  20.  
  21.    /** 
  22.     * Basic registration entry point 
  23.     * @param Registration $registrationXml 
  24.     * @return RegistrationResponse 
  25.     */ 
  26.    public function Registration($registrationXml) { 
  27. //      debugDump('registrationXml: '.$request->registrationXml); 
  28.  
  29.        $dom = new DOMDocument(); 
  30.  
  31.        $proUpdate = $dom->createElementNS("urn:Microsoft.Search.Registration.Response",'ProviderUpdate'); 
  32.        $proUpdate->appendChild( new DOMElement('Status',"SUCCESS") ); 
  33.  
  34.        $providers = $proUpdate->appendChild( new DOMElement('Providers') ); 
  35.        $provider = $providers->appendChild( new DOMElement('Provider') ); 
  36.        $provider->appendChild( new DOMElement('Id',"{62E1D68D-E1C4-4CC5-9D0C-D4B7999C4B77}") ); 
  37.        $provider->appendChild( new DOMElement('Name',"Research Service") ); 
  38.        $provider->appendChild( new DOMElement('QueryPath',"http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']) ); 
  39.        $provider->appendChild( new DOMElement('RegistrationPath',"http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']) ); 
  40.        $provider->appendChild( new DOMElement('Type',"SOAP") ); 
  41.        $provider->appendChild( new DOMElement('Revision',"1") ); 
  42.  
  43.        $services = $provider->appendChild( new DOMElement('Services') ); 
  44.        $service = $services->appendChild( new DOMElement('Service') ); 
  45.        $service->appendChild( new DOMElement('Id',"{0297CD20-047F-4256-0104-000004040001}") ); 
  46.        $service->appendChild( new DOMElement('Name',"Research Service Name") ); 
  47.        $service->appendChild( new DOMElement('Description',"Research Service Description") ); 
  48.        $service->appendChild( new DOMElement('Copyright',"") ); 
  49.        $service->appendChild( new DOMElement('Display',"On") ); 
  50.        $service->appendChild( new DOMElement('Category',"RESEARCH_GENERAL") ); 
  51.  
  52.        $response = new RegistrationResponse; 
  53.        $response->RegistrationResult = $dom->saveXML($proUpdate); 
  54.        return $response; 
  55.    } 
  56.  
  57.  
  58.  
  59.    /** 
  60.     * Basic entrypoint for Query 
  61.     * @param Query $queryXml 
  62.     * @return QueryResponse 
  63.     */ 
  64.    function Query($queryXml) { 
  65.        if(is_object($queryXml)){ $queryXml = $queryXml->queryXml; } 
  66. //      debugDump('queryXml: '.$queryXml); 
  67.  
  68.        /*解析請求的 XML*/ 
  69.        $dom = new DOMDocument(); 
  70.        $dom->loadXML($queryXml); 
  71.        $domain = $dom->getElementsByTagName('Query')->item(0)->getAttribute('domain'); 
  72.        $queryId = $dom->getElementsByTagName('QueryId')->item(0)->nodeValue; 
  73.  
  74.        /*建立返回的結構*/ 
  75.        $packet = $dom->createElementNS("urn:Microsoft.Search.Response",'ResponsePacket'); 
  76.        $packet->setAttribute('revision',"1"); 
  77.        $response = $packet->appendChild( new DOMElement('Response') ); 
  78.        $response->setAttribute('domain', $domain ); 
  79.        $response->appendChild( new DOMElement('QueryId', $queryId) ); 
  80.        $range = $response->appendChild( new DOMElement('Range') ); 
  81.        $results = $range->appendChild( new DOMElement('Results') ); 
  82.        $content = $results->appendChild( new DOMElement('Content',"","urn:Microsoft.Search.Response.Content") ); 
  83.  
  84.        /*請求查詢*/ 
  85.        $status = "ERROR_NO_RESULTS_FOUND"; 
  86.        $queryText = trim( $dom->getElementsByTagName('QueryText')->item(0)->nodeValue ); 
  87.        if(!empty($queryText)){ 
  88. //          debugDump($queryText); 
  89.            $line = $content->appendChild( new DOMElement('P') ); 
  90.            $line->nodeValue = htmlspecialchars($queryText, ENT_QUOTES); 
  91.            $status = "SUCCESS"; 
  92.        } 
  93.  
  94.        $response->appendChild( new DOMElement('Status',$status) ); 
  95.  
  96.        /*設定回傳結構*/ 
  97.        $response = new QueryResponse; 
  98.        $response->QueryResult = $dom->saveXML($packet); 
  99.        return $response; 
  100.    } 
  101.  
  102. } 


關於資料交換的 XML 格式如下:
Registration Response XML
  1. <ProviderUpdate xmlns='urn:Microsoft.Search.Registration.Response'> 
  2.    <Status>SUCCESS</Status> 
  3.    <Providers><Provider> 
  4.        <Id>{88686849-2DD9-474d-9300-778E3336FA77}</Id> 
  5.        <Name>EpgTools</Name> 
  6.        <QueryPath>http://localhost/service.php</QueryPath> 
  7.        <RegistrationPath>http://localhost/service.php</RegistrationPath> 
  8.        <Type>SOAP</Type> 
  9.        <Revision>1</Revision> 
  10.        <Services><Service> 
  11.            <Id>63d351db-d12e-448b-8541-9f794e1ec977</Id> 
  12.            <Name>Research Service Name</Name> 
  13.            <Data>1031/1033/4</Data> 
  14.            <Description>Research Service Description</Description> 
  15.            <AboutPath>helpId:553713956</AboutPath> 
  16.            <Copyright>All content Copyright (c) 2003.</Copyright> 
  17.            <Display>On</Display> 
  18.            <Category>RESEARCH_GENERAL</Category> 
  19.            <OptionsPath></OptionsPath> 
  20.            <Parental>Unsupported</Parental> 
  21.        </Service></Services> 
  22.    </Provider></Providers> 
  23. </ProviderUpdate> 

Query XML
  1. <QueryPacket xmlns="urn:Microsoft.Search.Query" revision="1" build="(11.0.5606)"> 
  2.    <Query domain="{6E3B8AA1-5131-403E-AEF3-E7AFC2E88557}"> 
  3.        <QueryId>{5A4FD162-DB71-45BC-8721-F059D28947B3}</QueryId> 
  4.        <OriginatorId>{F6FF7BE0-F39C-4ddc-A7D0-09A4C6C647A5}</OriginatorId> 
  5.        <SupportedFormats> 
  6.            <Format revision="1">urn:Microsoft.Search.Response.Document:Document</Format> 
  7.            <Format revision="1">urn:Microsoft.Search.Response.Content:Content</Format> 
  8.            <Format revision="1">urn:Microsoft.Search.Response.Form:Form</Format> 
  9.        </SupportedFormats> 
  10.        <Context> 
  11.            <QueryText type="STRING" language="zh-tw">test</QueryText> 
  12.            <LanguagePreference>zh-tw</LanguagePreference> 
  13.            <Requery></Requery> 
  14.        </Context> 
  15.        <Range id="result"></Range> 
  16.        <OfficeContext xmlns="urn:Microsoft.Search.Query.Office.Context" revision="1"> 
  17.            <UserPreferences> 
  18.                <ParentalControl>false</ParentalControl> 
  19.            </UserPreferences> 
  20.            <ServiceData>EWATW</ServiceData> 
  21.            <ApplicationContext> 
  22.                <Name>Microsoft Office</Name> 
  23.                <Version>(11.0.5606)</Version> 
  24.                <SystemInformation> 
  25.                    <SkuLanguage>zh-tw</SkuLanguage> 
  26.                    <LanguagePack>zh-tw</LanguagePack> 
  27.                    <InterfaceLanguage>zh-tw</InterfaceLanguage> 
  28.                    <Location>TW</Location> 
  29.                </SystemInformation> 
  30.            </ApplicationContext> 
  31.            <QueryLanguage>zh-tw</QueryLanguage> 
  32.            <KeyboardLanguage>zh-tw</KeyboardLanguage> 
  33.        </OfficeContext> 
  34.        <Keywords xmlns="urn:Microsoft.Search.Query.Office.Keywords" revision="1"> 
  35.            <QueryText>test</QueryText> 
  36.            <Keyword> 
  37.                <Word>test</Word> 
  38.            </Keyword> 
  39.        </Keywords> 
  40.    </Query> 
  41. </QueryPacket> 

Query Response XML
  1. <ResponsePacket xmlns="urn:Microsoft.Search.Response" revision="1"> 
  2.    <Response domain="{6e3b8aa1-5131-403e-aef3-e7afc2e88557}"> 
  3.        <QueryId>{5A4FD162-DB71-45BC-8721-F059D28947B3}</QueryId> 
  4.        <Range><Results> 
  5.            <Content xmlns="urn:Microsoft.Search.Response.Content"> 
  6.                <any /> 
  7.            </Content> 
  8.        </Results></Range> 
  9.        <Status>SUCCESS</Status> 
  10.    </Response> 
  11. </ResponsePacket> 


範例下載:
SearchService.zip


參考資料:
Serveur SOAP en PHP 5 pour "Microsoft Office Research Service"
The Definitive Hello World Custom Research Service Tutorial
Microsoft.Search.Response.Content Schema Documentation