エクセルVBA-エラー処理

プログラムを作り始めて何年になるでしょうかね。就職して,2年目からですから,結構な年月になります。
当時は,PCのはじめで,やりたいことのほとんどは,BASIC と呼ばれる言語で,自作しないといけませんでし
た。そのうち,MS-DOS上で動くマルチプランやらwindoesで動くロータス123等がでてきました。確か,
ロータス123は,当時68000円か78000円ぐらいしたと記憶していました。おまけに,123は,
プロテクトがかけられていて,バックアップができませんでした。その後,コピーツール等がでてきて,バッ
クアップはできるようになりました。
それにしても,高かったです。ただ,自分でもプログラムを作ってましたので,それが作成されるまでの労力
を考えると,決して高くないと思ってました。素人の自分が作るプログラムと,その高いプログラムはどこが
ちがうのでしょうか。もちろん完成度もあるのですが,素人とプロでは,エラー処理が格段に違います。プロ
は,考えるすべてのエラー処理をしていますが,素人の私が作るものは,動けばいい,というレベルのもので
す。
ただ,作るにあたっては,最低限の処理が必要になります。たとえは今,仕事のお手伝い関係で自作している
エクセルvbaのサーチのプロシャージャ(プログラム)でも,目的の項目がサーチできなかった時は,どうす
るかの処理ぐらいは必要になってきます。
そんな訳でエラーの時に,

XFD1048576

を返すものを作りました。この数字はなにかというと,
エクセルの表の最右列・最下段のセルということで,一番端っこのセルの番地を表す数字です。なぜ,この
この数字を使ったのかと言うと,昔BASICでプログラムをくんでいた時のなごりで,エラー処理に普段
出てこない,9999とか言う数字を使った名残です。(確か何年構えに2000年問題ということで,
話題になりましたね。これも。エラー処理に1999という数字を使っていて,ためですね)
ところが,デバックしているときにまたまた,はまりました。わざとエラーを起こしても,XFDが返って
こないのです。返ってくるのは,16384という数字が返ってきてしまいます。あれこれやりましたが,
肝心なこと忘れてました。使ったのは,Column というプロパティですが,当たり前ですが,このプロパテ
ィは,数字を返すものでした。ネット検索で,

Split(Columns(列番号).Address, “$”)(2)

のようにやって,やっと目的のXFDが返ってきました。長かったです。

下記がXFD1048576を返す,関数です,といってもぱくりです。

Public Function Search(ByVal rng As Range, ByVal keyWord As Variant, ByVal Whole As Boolean)
   Dim r As Range
    If Whole Then
        For Each r In rng
            If r.Value = keyWord Then
                Set Search = r
                Exit Function
            End If
        Next
    Else
        For Each r In rng
            If InStr(r.Value, keyWord) > 0 Then
                Set Search = r
                Exit Function
            End If
        Next
    End If

    Set Search = Range("XFD1048576")←←エラー処理です。
            
End Function

デバックに使ったプロシャージャです。

MsgBox Split(Columns(Search(rng, "******", True).Column).Address, "$")(2)

芝刈りーー今年第18回目

今年18回目の芝刈り。汗をかきました。今回は,前回からちょっと間があきました。刈り後を見ると,ある
場所だけ茶色くみえるところがあります。もしかして,この部分は,成長が早くて,軸狩りになってるのでし
ょうか。ちょっとわかりませんがよく見るとサッチが軸に沢山ついているようです。
成長が終わって,茶色くなってきたら,今年は,きっちり,サッチをとりたいと思います。

「ノータッチ泡ハンドソープ」の修理

ミューズのノータッチ泡ハンドソープを使ってましたが,急に赤LEDが点滅するようになりました。ダメもと
で分解修理することにしました。
検索すると諸兄のサイトに分解方法がでてましたので,分解しました。
分解している過程で,赤外線LEDから出ている配線が,根本から断線していました。これが原因?と,手持ち
のものと交換してみました。
見事,復活。
交換した赤外線LEDをよっくみると,洗剤がかかるのか,内部まで,腐食していました。

結構故障をするようで,YouTubeにも,修理方法があれこれ,掲載されています。

修理にあたって,もとの部品を再利用するつもりでしたが,写真の左側(-側)が根本から腐食しておれてい
たので,手持ちの赤外線LEDを使いました。

芝刈りーー今年第15回目

昨日,今年15回目の芝刈りをしました。成長が鈍ってきたとはいえ,まだまだ伸びるようです。
芝刈りが終わると,全身汗びっしょりになります。

芝刈りーー今年第14回目

今年14回目の芝刈りをしました。

成長は大分ゆっくりになってきましたが,まだ,刈り跡?がはっきり分かります。
今年は,だいだい一週間おきにやっていますが,いつまでやるようでしょうかね。

芝刈りが終わると汗びっしょりになります。

芝刈りーー今年第13回目

今年13回目の芝刈りをしました。8月中旬になって,やや成長が鈍ってきました。我が家の芝は,
高麗芝(多分)とティフトンの二種類が植えてありますが,両方とも成長がやや鈍りました。また,
ティフトンの方は,サッチがたまってきたのか,床とどこと茶色になっています。今年は,サッチ
取りを十分にしませんでしたが,来年度は,しっかりとりたいと思います。

IOT再びーESP32編(14)ーーー静電容量水位計に向けてーーADS1115-

超音波センサーによる水位計は,測定が安定しないので,ひとまず休止して,静電容量測定による水位計をい
じってみたいと思います。それにともなって,ESP32は,ADC機能がいまいちということなので,ADC の基
盤,ADS1115をいじってみることにしました。

この基盤は,分解能が16ビットありますので,結構精密に変換できて,接続もI2Cなので,4本だけ接続す
ればいいので,お手軽です。また,ESP32 用にライブラリーもあるので,お手軽です。ただ,本当に理解す
るには,ライブラリーを使わないで,使われているIC に直接書き込みをした方がいいのでしょうね。ちょっ
と,それは気力がないので,ライブラリー使用です。
例のごとくブレッドボードで,ESP32,ADS1115,SSD1306,レベルシフター,を配線しました。
ADS1115とSSD1306はI2C接続なので,並列につなげればいいので,お手軽です。

それほど時間はかかりませんでしたが,ADS1115 の配線でちょっとはまりました。スケッチ例の注意には記
載があったのですが,測定できるのは,ADS1115の Vdd+0.3Vmax の記載があるのをみおとしてました。
5Vラインを測定しても,約 4.0V の表示かできないので,あれこれやりました。
すぐに原因判明しました。
SSD1306の電源に合わせて 3.3V で動作させてました。急遽,レベルシフターをいれて,5Vで動作させる
と,正しく測定できました。写真は,乾電池を測定してるところです。はっきりしませんが,OLED には,
1.63 Vと表示されてます。

まだ,やっていませんが,差動入力にすると,プラスマイナスを逆につないでも,マイナス何ボルトの表示
が可能です。
今回使ったスケッチですが,このスケッチは,測定に必要ない余分なヘッダーファイルをインクルードしていま
す。

// 必要なライブラリのインクルード
#include  <wifi.h>
#include  <wire.h>
#include  <adafruit_gfx.h>
#include  <adafruit_ssd1306.h>
#include  <adafruit_ads1x15.h>

//ADS1115 ADS(0x48);
Adafruit_ADS1115 ads;

byte hdr, data_h, data_l, chksum;
String inputString = "";
 

// ピンの定義
#define wifyOn 4 // wify 接続OK
#define wifyOff 2 // wify 未接続
#define OLED 18 // OLDE 表示・非表示

//OLED
#define OLED_RESET     -1 
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// WiFi接続情報--固定アドレス用
const char* ssid = "***********";
const char* password = "***********";
const IPAddress ip(192, 168, 2, 30);
const IPAddress gateway(192, 168, 2, 2);
const IPAddress subnet(255, 255, 255, 0);
const IPAddress dns1(192, 168, 2, 2);


// セットアップ関数
void setup() {
  //入出力ピン設定
  pinMode(wifyOn, OUTPUT);
  pinMode(wifyOff, OUTPUT);
  pinMode(OLED,INPUT_PULLUP);
  
  digitalWrite(wifyOn, LOW);
  digitalWrite(wifyOff, HIGH);

  Serial.begin(115200); // シリアル通信の開始
  Serial2.begin(9600,SERIAL_8N1,16,17);
  ads.begin();

//OLED開始
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();

 //OLED初期設定
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("Wify set"));
  display.display(); 

 
  // WiFi接続
  if (!WiFi.config(ip,gateway,subnet,dns1)){
      Serial.println("Failed to configure!");
  }
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }

  digitalWrite(wifyOn, HIGH);
  digitalWrite(wifyOff, LOW);

  display.clearDisplay();
  display.setCursor(0, 0);
  display.print(F("Wify con"));
  display.display();

}

// メインループ
void loop() {

 digitalWrite(wifyOn, HIGH);
  digitalWrite(wifyOff, LOW);
  
  ads.setGain(GAIN_TWOTHIRDS);
  
  int16_t adc0;
  float volts0;
 
  adc0 = ads.readADC_SingleEnded(0);
  volts0 = ads.computeVolts(adc0);
  
  Serial.print("AIN0: "); 
  Serial.print(adc0);
  Serial.print("  ");
  Serial.print(volts0);
  Serial.println("v");

  display.clearDisplay();
  display.setCursor(0, 0);
  display.println(adc0);
  display.print(volts0);
  display.print("v");
  display.display();

  delay(500);

  digitalWrite(wifyOn, LOW);
  digitalWrite(wifyOff, HIGH);
  
  delay(500);
}


 

芝刈りーー今年第12回目

昨日の夕方,今年12回目の芝刈りをしました。今年は,まめに芝刈りができています。
一週間過ぎてしまうと,成長期なので,結構伸びます。

 

だいたいは,芝刈り機でできるのですが,際は,電動のナイロンコードの刈り払い機でやってます。一週間で
結構のびるので,そのままにしておくと,とんでもないことになります。

 

 

昨日もゴミ袋,一袋になりました。これ,なかなか堆肥になりませんが,堆肥にすると,結構な量になります
ね。残念ながら,堆肥にするスペースがないので,毎回,燃えるゴミにだしてます。