PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

【VBA】セルが空白かどうかを正確に判定する

VBAでセルが空白かどうかを正確に判定する

VBAでは、空白であることを以下のようにすることが一般的かもしれません。

If Cells(1,1) = "" Then
    Debug.Print("空白です")
Else
    Debug.Print("空白ではありません")
End If

しかし、これでは漏れが出来ることがあります。

代表的な例としては、数式が入力されていた場合はセルが空白ではないと判定されてしまいます。

そこで、以下のように判定することで空白セルを漏れなく判定することができるようになります。

If Not xWs.Cells(1, 1).HasFormula Then
    If xWs.Cells(1, 1).Value = "" Then
        Debug.Print("空白です")
    else
        Debug.Print("空白ではありません")
    End If
else
    Debug.Print("数式が入力されています")
End If

このほか、セルの値がエラー値が返ってくる場合などがありますが、ここでは省略します。

Nature Remoが届いたのでレビューします。

こんにちは、PeaceJetです。

この度、NatureRemoが家に届いたのでレビューしてみたいと思います。

前回の記事では、センサーの不具合が発見されたということで発売を見送るということでした。
peacejet.hatenablog.com

ところが、後日、不具合の原因を突き止め改良版を販売するとのお知らせがありました。
そこで、さっそく注文をしてみました。
10月発売ということで、wktkしながら待っていたのですが、昨日無事到着しました。

配送

自社での配送ではなく、Amazonの倉庫を借りているのか定かではありませんが、配送はAmazonからの発送となっていました。

開封

まずは、箱の前景からです。


次は、箱の背面です。


裏面には、「スマートエアコンで快適な生活を」と書かれているとおり、本体でのエアコン操作が主なミッションとなっているようです。

内箱

内箱は以下のように、ロゴが刻印されていました。

Amazonのフラストレーションフリーパッケージのような薄手のボール紙で作られていてエコな感じがあります。
これも、この会社が掲げるビジョンが背景になっているのかもしれないですね。

2011年3月、東南アジアの僻地にある炭鉱を小型セスナ機で訪問した。そこで空から見た景色は今でも鮮明に記憶している。大自然の中にひっそりとたたずむ小さな街並み、その横にある地面を剥ぎ取ったような石炭鉱山の情景。想像を超える巨大な掘削・輸送機、炭鉱の現場で巨大な機材と奮闘する炭鉱夫。その景色を見た時に大きな違和感を感じたのをよく覚えている。ホテルに戻ると福島原発事故のニュースが届いた。当たり前のように使っていた電気、それを支えてきた中央集権的な原子力発電や石炭火力発電の歪みを目の当たりにして、分散化電源の普及を支える事業を立ち上げたいと思った(Founder and CEO / 塩出 晴海)。

nature.global

箱出し


箱から、パーツなどを取り出したところです。

  • 両面テープ
  • USBケーブル
  • USB電源プラグ
  • 本体
  • 説明書

以上の構成でした。
USBケーブルは意外と長く、1.5メートルくらいあって壁などに設置する際にはちょうどいい長さと思います。
ただ、両面テープの粘着がイマイチでした。
壁に貼り付けたところ、自重で落下してしまったのです。
そこで、ニトムズのはがせる両面テープに張り替えたところ落下の被害は減りました。

両面テープを貼り付け。


上記は、はじめから付属していた3Mの両面テープを貼り付けたところです。

これまで、様々なブログなどで言われていたとおりエアコンを操作することがミッションとなっているようです。

セットアップ

本体を操作するのは、スマホから専用のアプリを介して行います。
セットアップは非常に簡単で、アプリをダウンロードし、電源プラグにさしたUSBケーブルを本体と接続すると、本体が点滅し始めます。
その後は、アプリの案内にしたがって家庭用のWi-Fiの情報を入力すると完了します。

登録

シーリングライトのリモコンを登録してみました。

壁への取り付け

サルバドール・ダリが好きなので、ポストカードを飾っています。
本体の大きさはポストカードよりも小さく小ぶりです。

感想

Wi-Fi接続時だけでなく、4G回線からでも使うことが出来るので外出先から操作することが出来ます。
ですので、家に着く直前に暖房入れたり、部屋の明かりを点けたりと様々に応用する事ができます。
それから、赤外線のパワーが強いように感じます。
たしか、3方向に赤外線を飛ばすようになっていたかと思いますが、対象機器の裏側にRemo本体が居ても十分にリモコンとして機能します。

改善してほしい点

そもそも、スタートアップから始まったものだし、これからというところもあるのでしょうけれども。
クラウドへ接続が出来ませんでした」というメッセージが出て、リモコンとして機能しなくなりました。
リセットして、再度、登録などをやりなおしを行いました。

今後

今後は、API公開など開発への夢が広がります。
続報などありましたら、またブログに書くかもしれません。

ここまで読んでいただき、ありがとうございました。

【JQuery】全てのセレクトボックスが選択されているか判定する。

複数のセレクトボックス

セレクトボックスが複数ある場合で、少なくともどれか一つの値が選択されているかどうかを調べてみたいと思います。

おそらく、何種類かやり方はあるかと思っているのですが・・・。

2つの配列を作成して判定したいと思います。

<div id="select">
  <div id="SelectWrapFirst">
    <select name="first">
      <option value="">選択してください</option>
      <option value="aaa_1">aaa_1</option>
      <option value="aaa_2">aaa_2</option>
      <option value="aaa_3">aaa_3</option>
    </select>
  </div>
  <div id="SelectWrapSecond">
    <select name="second">
      <option value="">選択してください</option>
      <option value="bbb_1">bbb_1</option>
      <option value="bbb_2">bbb_2</option>
    </select>
  </div>
  <div id="SelectWrapThird">
    <select name="third">
      <option value="">選択してください</option>
      <option value="ccc_1">ccc_1</option>
      <option value="ccc_2">ccc_2</option>
    </select>
  </div>
</div>
<div>
  <button type="button" name="button">確認</button>
</div>
$(fucntion() {

  //ボタンを押して確認するようにしています。
  $('button[name="button"]').on("click", function() {
    
    //要素を入れる配列:myArray    
    var myArray = new Array();
    $("#select option:selected").map(function () {
      myArray.push($(this).val());
    });
    
    var x = new Array();
    for (var i in myArray) {
      if (myArray[i] !== "") x.push(myArray[i]);
    }
    //空文字を削除した新たな配列:x

    //$.isEmptyObject
    if ($.isEmptyObject(x) === false) {
      //なにか処理を書く。
      console.log("少なくても一つは、選択されています。")
    }

  myArray = [];

  });

});

Nature Remo 再販決定

I注目していた「Nature Remo」が再販されることになったようです。


10月を目標に調整しているとのこと。

nature.global

peacejet.hatenablog.com

【Python3】URLかどうかを調べるスクリプト

URLかどうかを調べる

Python3で、正常にアクセスできるURLであるかどうかを調べるスクリプトを書いてみました。
フォームから受け取ったURLが正常なものかを判断する際の材料として、使っています。

※追加のモジュールとしてUrllib、reが必要になります。

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import re
import urllib.request as urllib

# URLをチェックする関数
def checkURL(url):

    if re.match(r"^https?:\/\/", url):
        try:
            response = urllib.urlopen(url)
            response.close()
            return True
        except urllib.HTTPError as e:
            print ("見つかりませんでした。:  " + url)
            return "HTTPError <<Code: " + str(e.code) + ">>"
        except urllib.URLError as e:
            print ("見つかりませんでした。:  " + url)
            return "URLError <<Reason: " + str(e.reason) + ">>"
    else:
        return "URLではありません。"

url = "(対象となるURLを入力してくださいね)"
result = checkURL(url)

if result == True:
    print ("アクセスOK")
else:
    print (result)

お役に立てれば幸いです。

【Googleスプレッドシート】完全一致した行の重複を削除する方法

行自体の重複を削除する方法

f:id:PeaceJet:20170826160539p:plain
※例によって個人情報の生成は疑似個人情報データ生成サービスを使用させていただきました。

Googleスプレッドシートで、データを管理している方は多いかと思いますが。
上記のように重複している行自体を削除したいという需要は結構あるのではないかと考えています。

しかし、なかなかネットで探してもセルの重複削除自体は出てくるのですが・・・
行そのものが完全一致したものの重複を除く方法がありませんでした。

そこで、「Google Apps script duplicate delete」などと検索したところgoogleの開発者向けドキュメントサイトで見つかりましたので紹介します。

解説

  1. 使用されているセルをgetDataRangeで配列に格納(2次元配列)
  2. 配列から一つずつ取り出し、それをdata.joinして文字列とします。
  3. newDataという新しい配列を用意し、newDataの配列要素をjoinして文字列とし、data.joinと比較します。
  4. データがなければ配列に追加し、あればスルーするという動作を繰り返すことで、ユニークなデータを保持します。
  5. 最後に、シート自体をクリアして貼り付けます。
function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  //配列比較用
  var newData = new Array();
  for(i in data){
    //2次元配列の要素(配列)をrowに代入
    var row = data[i];
    var duplicate = false;
    for(j in newData){
      if(row.join() == newData[j].join()){
        //重複していた場合、true
        duplicate = true;
      }
    }
    //もしも、newDataの中にデータがなければ(duplicate=false)なら、rowを追加。
    if(!duplicate){
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

感想

対象のデータ(配列)をjoinして文字列にし、比較するというアイデアは自分になかったので新鮮でした。

参考:
Tutorial: Removing Duplicate Rows in a Spreadsheet  |  Apps Script  |  Google Developers

Nature Remo 発売延期

楽しみに待っていたNatureRemoでしたが、機器の不具合が発覚したため発売を延期するとの連絡をいただきました。

nature.global

中途半端な製品を世に出せないという思い、共感いたします。

一旦、返金となるようですが、また発売日が決まったら申し込もうと思います。