カテゴリー: VisualBasicApplication

  • 【MS-Access開発】レポート機能はとっても便利!

    ゆうパック「代引き用送り状」が無くなったので郵便局に依頼!

    で、新しく持ってきた送り状を見てビックリ 😮

    もぉ〜、また書式が変わってる!
    前回、2015年9月から5ヶ月しか経ってないのに・・・・:-(

    「こら郵便局、レイアウト変え過ぎだぞ!」

    また、自作「送り状印字」プログラムを修正しなければ!

    新旧はこんなにレイアウトが違う!
    MS-Access開発:レポート機能が絶対便利

    2015年9月版のAccessレポートデザイン画面
    MS-Access開発:レポート機能が絶対便利

    1時間かけて作り直した2016年2月版がこれ
    MS-Access開発:レポート機能が絶対便利

    やれやれ、こう頻繁に書式を変えられては余計な手間が増えるばかり。

    それにしてもライバル会社は、こんな時どうしてるんだろう?

    例え小さなプログラム修正でも外注すれば10万円くらいは請求されるはず!

    僕が嫌いな、超使いにくい「ゆうパック」送り状発行専用ソフトを使っているのかな?

    ちなみにMS-Accessプログラマー歴15年の私、Access開発の中でもレポート機能が一番好きなんです。
    VBAを駆使すれば何だって動的に変えられる!
    罫線の長さ・太さ・種類、フォントサイズ・色、オブジェクトの表示・非表示・・・・

    面白いので、複雑なレポートの作成依頼が来れば来るほど燃えます 😀

    一時期、FileMaker開発の勉強をしてた時、FileMaker系掲示板に「Accessは使いにくくてクソ」みたいな書き込みが多数ありました。

    あんな開発しづらいFileMakerを愛用し、こんなに開発しやすいAccessをバカにする人ってどんな奴!?
    とっても不思議 🙄

  • 【vba覚書】サブフォームを参照

    4月になり、だんだん暖かくなってきた!

    早く通販サイト「徳島オンラインショップ」の品揃えを充実させなば・・・

    と思い、仕事の合間に作り始めたのがYahooショッピング商品管理アクセスプログラム。

    でも、あれ、VBAが浮かばない!
    しばらく新規開発をしてなかったら基本的なものまで忘れてしまった!

    サブフォームへの参照方法を覚書に書いておこう

    Forms、Form、!マーク、.ピリオドの位置をいつも間違えます 😮

    認めたくないが、もしかして歳:-?

    [vb]Dim myTXT As String
    myTXT = Forms![親フォーム].Form![子フォーム]![code]

    MsgBox myTXT[/vb]

  • 【vba覚書】vbaからbatファイルを実行

    App Inventorの拡張版サービス「AI2LiveComplete」でハンディーターミナルアプリ開発を始めて3週間。

    商品マスタをAI2LiveCompleteを使いSQLiteへbulk importさせるSQLファイルを自動生成するAccessプログラムを制作。

    VBAのTextStreamで作られたファイルがs-Jisの為、文字化け発生!
    このプログラムに、nkf.exeを使ったS-Jis→UTF8キャラ変換するバッチファイルも同時に作る機能を追加。

    [vb] C:\Progra~1\Common~1\nkf.exe -Sw "Access製S-JISファイル99.txt" > "UFT変換後ファイル99.txt"
    [/vb]

    そして、最後にこのバッチを自動実行。

    あれ、VBAからバッチファイルってどうやって実行してたっけ?

    とネット検索・・・・・

    [vb]Dim FileNameBAT As String
    FileNameBAT = "c:katabemasterSjis2UTF.bat"
    Shell ("cmd.exe /K " & FileNameBAT & <font color="red">""</font>)
    [/vb]

    ちなみに、ダブルクーテンションマーク”のエスケープは、ダブルクーテンションマークを2回続けることでした。
    シングルクーテンションマークだと動きません。

  • 【vba】恐怖「AOIndexは、このテーブルのインデックスではありません」を修復

    がーん、MS-Accessで作った見積作成システムから恐怖のメッセージが出た:-o

    「AOIndexは、このテーブルのインデックスではありません」

    このメッセージ、Accessファイルが壊れたことを意味します。

    運が良ければ「最適化・修復」機能を実行すれば直る時もある。
    直らない場合、空Accessファイルを作り、そこからインポート機能を使って必要なデータを吸い上げる。
    それでもダメな場合、技術力の無い私は「データは死んだ」と諦めていました。

    しかし、それでは困ると営業から怒られ、改めて「AOIndexは、このテーブルのインデックスではありません」ファイルからのデータサルベージ方法をgoogle検索。

    すると、有った:-D

    [Fixing Corruption: ’AOIndex’ is not an Index in this table–DataGnostics]

    DataGnosticsと言う会社が、’AOIndex’ エラーを修復する
    無料ソフト「FixBadAOIndex.mdb」を公開してました!

    1)知らない会社の知らないAccessファイルなので、まずはウィルススキャン。

    スキャン結果は「脅威無し」

    2)Access起動時に自動実行されるスクリプトを無効化する手順。

    「Shift」キーを押しながらmdbファイルをダブルクリックしてファイルを開いてみる。

    VBAスクリプトはこんな感じ。
    自称Accessプログラマー歴もうすぐ20年の私ですが、書いていることがほとんど分かりません。
    ただ、システムを壊す、ファイルを消すような箇所は無いような・・・・・

    恐る恐る開いたVBAスクリプト1:怪しい部分は無いようです。

    恐る恐る開いたVBAスクリプト2:怪しい部分は無いようです。

    早く直してと営業にせっつかれ、怪しいスクリプトもなさそうなので、思い切って「FixBadAOIndex.mdb」を実行。

    処理時間0.5秒以下

    あれ、もう終わったの?
    やったー、Accessファイルが直りました!(^o^)/
    ありがとうDataGnostics!

    [about–DataGnostics]

    ちなみにDataGnosticsの会社説明ページによると、データベースデザインリーダー:Dirk GoldgarさんはMicrosoft Access Most Professional(MSアクセスでもっとも重要な人物)世界80人の内の1人なんだそうです。

    スゲー!
    Dirk Goldgarさんのサイン欲しい!
    一緒に写真撮りたい! 😆

  • 【ネット店長】「ゆうパック」代引き送り状プリントソフト開発

    通販を始めて半年が過ぎましたが、売上は・・・・・
    当店の最大の欠点は取扱商品の少なさと、包装・のしサービスに未対応なことだと思います。

    そのハンディを他のサービス向上でちょっとでも埋められないかと頑張っているのが出荷スピード。
    もらった注文は在庫があれば即荷造り。準備出来次第に郵便局に集荷依頼をかけています。

    これは休日でも実践中。
    私が会社へ商品を取りに行ける日なら、その日の内に出荷作業をし郵便局へ持ち込みます。

    誰もいない休日の出荷作業で欲しかったのが「ゆうパック送り状プリントソフト」
    そこで、MS-Accessで作ってみました。
    予定では開発時間2時間のつもりが、ちょっとしたトラブルで4時間以上かかってしまいました。

    僕の休日が減っていく😮

    出来栄えは、それなりの自信作。
    私、MS-Accessの機能の中でレポートが一番好きなんです。
    VBAでガリガリ書くと、文字数でフォントサイズを変えたり、表示・非表示のコントロールが出来たり。
    かなり複雑なことでも比較的簡単に出来るんですよ。

    入力画面はこんな感じ

    レポートのデザインビュー

    プレビューさせるとこんな感じ

    ざっくり版のレポートが出来たら、コピー用紙に試し印字しながら印字位置を調整。
    ほぼ場所が確定したところで、今度は実際の送り状で試し印字。
    ちょっとずつ印字位置をずらしながら各数字が所定の枠に入るように最終調整。

    何度も試し印字した送り状

    この種のレポートで一番時間を食うのが、数字をバラバラに分解し、決まった枠に印字させること。
    分解するのは「相手先郵便番号」「送り主郵便番号」「代引き口座番号」「代引き請求額」

    「相手先郵便番号」「送り主郵便番号」「代引き口座番号」は固定長なので使うのはMID関数。
    非連結テキストボックスを必要な数だけ作り1桁ずつずらしながら数字を取り出し、所定位置に並べていきます。
    [vb]’代引き口座番号の7桁目ならこんな関数
    ’7桁目から1桁取り出した数字
    =MID([代引き口座番号],7,1)
    [/vb]

    難しいのが「代引き請求額」。桁数が固定してないので2工夫必要
    まず、1の桁、10の桁、100の桁、1000の桁と右から取り出す。

    1000の桁なら、Right([金額],4)で右から4桁取り出し、その数列をLeft関数で左1桁だけ取り出す。
    繋ぐと”=Left(Right([金額],4),1)”が1000の桁の数字です。

    このままプログラムを走らせると、4900円なら4桁以上(1000の桁、10000の桁、100000桁)が
    全て同じ数字”4″になってしまい444900円と印刷されてしまいます。

    そこで2つ目の工夫。
    VBAの登場。
    1:すべての数字を、まず非可視に設定。
    2:請求金額の桁数を求め
    3:桁数より小さい金額テキストボックスだけ可視=True変えていく

    これで、「ゆうパック代引き送り状プリントソフト」が完成かな! 🙂

    「わぁーい、完成だ!」と思ったら、がーん!

    郵便局にやられた!送り状が2種類あるぞ

    最後の1枚をテスト印字に使った(23-NOZ)と新しく郵便局が持ってき(25-NOZ)

    泣き、23-NOZ用レポートが完成したのに用紙を使いきった!

    やれやれ、次は25-ZON用レポートの製作かよ・・・・:-(

    これが苦労して作った「ゆうパック:代引き送り状レポート(25-ZON版)」

  • 【vba+xml+google地図】ver3で都道府県が取れた!

    中元と歳暮商戦だけ動かす自作MS-Accessの地図ソフト
    (住所→緯度経度→地図HTML作成)。

    毎回、Google Maps APIの仕様変更でシーズン最初の実行は、エラー発生でクラッシュ!

    でも、2014年中元商戦開始で動かすと、「あれ!」、拍子抜けの正常終了。
    2013年歳暮シーズン以降にGoogle Maps APIの仕様変更は無かったみたい(ホッ)

    だったら時間に余裕が出来たので前回解決できなかった不具合に再チャレンジ!
    今度こそXMLから都道府県を取り出せないかな!?

    Google Maps API Ver2のXMLには”prefecture”ノードが有り、それを取れば都道府県がすぐに分かりました。

    ちなみに下のXMLデータが、Google Maps API Ver3で返ってきた形部商事の住所検索結果
    [vb]<?xml version="1.0" encoding="UTF-8"?>
    <GeocodeResponse>
    <status>OK</status>
    <result>
    <type>sublocality_level_5</type>
    <type>sublocality</type>
    <type>political</type>
    <formatted_address>Obara-144-1 Fukuicho, Anan, Tokushima, Japan</formatted_address>
    <address_component>
    <long_name>1</long_name>
    <short_name>1</short_name>
    <type>sublocality_level_5</type>
    <type>sublocality</type>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>144</long_name>
    <short_name>144</short_name>
    <type>sublocality_level_4</type>
    <type>sublocality</type>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>Obara</long_name>
    <short_name>Obara</short_name>
    <type>sublocality_level_2</type>
    <type>sublocality</type>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>Fukuicho</long_name>
    <short_name>Fukuicho</short_name>
    <type>sublocality_level_1</type>
    <type>sublocality</type>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>Anan</long_name>
    <short_name>Anan</short_name>
    <type>locality</type>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>Tokushima</long_name>
    <short_name>Tokushima</short_name>
    <font color="red"><type>administrative_area_level_1</type></font>
    <type>political</type>
    </address_component>
    <address_component>
    <long_name>Japan</long_name>
    <short_name>JP</short_name>
    <type>country</type>
    <type>political</type>
    </address_component>
    <geometry>
    <location>
    <lat>33.8455715</lat>
    <lng>134.6262605</lng>
    </location>
    <location_type>APPROXIMATE</location_type>
    <viewport>
    <southwest>
    <lat>33.8442225</lat>
    <lng>134.6249115</lng>
    </southwest>
    <northeast>
    <lat>33.8469205</lat>
    <lng>134.6276095</lng>
    </northeast>
    </viewport>
    </geometry>
    </result>
    </GeocodeResponse>[/vb]

    Google Maps API Ver3では、複数存在するaddress_componentノードで、
    typeノード=’administrative_area_level_1’なのが都道府県。

    と言うことはXMLデータのフィルタリング方法を勉強しなければ。
    早速、私の師Google様にお伺いを立てながら右往左往・・・・:-(

    都道府県の値を持ってる要素(ノード)は、
    /GeocodeResponse/result/address_component
    /long_name

    検索方法は、検索したい要素(ノード)を”[]”内で指定するそうなのでGoogle Mapsの場合はこんな感じかな?
    [/GeocodeResponse/result
    /address_component/type=’administrative_area_level_1’]

    この2つを相対パスで繋ぐとこうなる。これで動くのかな?

    /GeocodeResponse/result/address_component
    /long_name[../type=’administrative_area_level_1’]

    やった、都道府県を取りだせた😀

    これで「都道府県ごとの配送先分布地図HTMLファイル生成」機能が再び動かせる!(良かった)

    [vb]…..
    Dim myF As Integer
    Dim myKEN, myFormatAddress, myCity, myLng, myLat,myPref5 As String

    myF = 0
    myKEN = ""
    myCity = ""
    myFormatAddress = ""
    myLng = ""
    myLat = ""
    myPref5=""

    For Each Node In XDoc.selectNodes
    ("/GeocodeResponse/result/address_component
    /long_name[../type=’administrative_area_level_1’]")
    ’都道府県administrative_area_level_1
    myKEN = Node.Text
    Next

    For Each Node In XDoc.selectNodes
    ("/GeocodeResponse/result/address_component
    /long_name[../type=’locality’]")
    ’市locality
    myCity = Node.Text
    Next

    For Each Node In XDoc.selectNodes
    ("/GeocodeResponse/result/formatted_address")
    ’住所formatted_address
    myFormatAddress = Node.Text
    Next

    For Each Node In XDoc.selectNodes
    ("/GeocodeResponse/result/geometry/location/lng")
    ’経度
    myLng = Node.Text
    Next

    For Each Node In XDoc.selectNodes
    ("/GeocodeResponse/result/geometry/location/lat")
    ’緯度
    myLat = Node.Text
    Next

    myPref5 = Left(myPref, 5)

    Select Case myPref5
    Case "Tokus"
    rs![都道府県] = "徳島県"
    Case "Kagaw"
    rs![都道府県] = "香川県"
    Case "Kochi"
    rs![都道府県] = "高知県"
    Case "Ehime"
    rs![都道府県] = "愛媛県"
    Case Else
    rs![都道府県] = "四国外"
    End Select

    …..[/vb]

    地図ソフトが動けば配送準備は数日で完了。
    そして、いよいよリアルジョブ、中元の配達だ! 🙂

    出来るだけ早くお客様へオーダー通りの商品を無事お届け出来るよう頑張らねば 。

    それにしても、軟弱な独学VBAプログラマーにとってXMLの取り回しは超難しいよ!
    この数日で髪の毛が百本ぐらい抜けた気がする・・ 😮

  • 【vba】Yahooショッピング商品マスタ登録用CSV書出システム

    不信が続くネットショップを立て直そうと試行錯誤。
    やっぱり、徳島の大野海苔、半田そうめん、金ちゃんラーメンだけでは取扱アイテムが少なすぎるよな・・・ 😕

    と言うことで、商品登録をしやすくするためにMS-Accessで「Yahooショッピング商品マスタ登録用CSV書出システム」を作ってみました。

    Yahooショッピング商品マスタCSV書出システム

    Yahooショッピングの商品マスタはエクスポートデータもインポート用データも改行コード混じりのCSVファイル。
    この改行コードの処理に手間取り開発が遅れていたプログラムがようやく完成!

    これでYahooショッピングに、新規商品をガンガン登録しちゃおうかな 🙂

    まずは半田素麺を買ってくれたお客様へ「加賀屋醤油 阿波の恵みめんつゆ」「すだち風味めんつゆ」を提案してみよう。

  • 【vba】任意フォルダを開く

    AccessでCSVファイルを書き出した後、その保存先フォルダーを開くには

    [vb]Dim MyOpenFolder As String

    DoCmd.TransferText acExportDelim, "商品エクスポート定義", "Q01商品ex", "c:katabeyahoo商品.csv", True, ""

    MyOpenFolder = "c:katabe"
    Shell "explorer " & MyOpenFolder, vbNormalFocus
    [/vb]

    新しいDBを開発中。

    阿南市にデカいイオン系量販店がオープンし地元小売店と卸問屋は七色吐息。
    そこで、新しい販路を求め完全無料と宣伝してる「Yahooショッピング」を申し込みました。

    でも、初めて行うネットショップの準備がうまく出来ず申し込みから1か月過ぎても何も出来ていない。

    一番苦労してるのが商品説明文とキャッチコピー。
    文才の無い私、書いては消しを繰り返しまったく先へ進めません。

    そこで作戦変更、Yahooショッピングに商品・カテゴリー用CSVファイル一括登録機能があるのでこれを利用することに。

    その専用Accessの開発を今始めました。
    さて、いつ完成出来るんだろう?

    これが完成すれば、商品登録はあとから一括登録する段取りで、取りあえずはショッピングサイトの構成を考える余裕が出来る。

    「Yahooから5月31日までに開店しないと申し込みは取り消すぞ」とメールが来たばかり。
    あと1か月でAccessを開発し、サイト構成を考え、そして最後の山、しゃれたデザインが僕に出来るんだろうか・・・・

    なによりも宅配代1000円プラスした価格で商品を買ってくれるお客様はいるのだろうか?
    取りあえずは早くAccessを完成させないと 🙁

    Yahooショッピング商品管理Accessシステム開発中

  • 【棚札発行】FileMakerGOで集めてAccessでプライスカード印字

    4月1日、消費税が8%へ上がる準備で3月中はバタバタ続き。
    その一つが、サービスで作る得意先のプライスカード。

    作業手順は下記のよう

    1.FileMakerGO「なんちゃってハンディーターミナル」アプリの棚卸機能を使いデータ収集
    集める店頭売価は5%の内税価格

    棚卸アプリで棚札データ収集
    消費税8%で棚札再発行:棚卸アプリで棚札データ収集

    2.集めたデータをPCメールへ送信しAccessで処理
    AccessVBAでメールを受信し添付ファイルを取り出し改行コードをCRからCRLFへ変換するプログラムは開発済み

    3.店頭で集めた5%の内税価格を8%内税価格に変換する更新クエリを実行

    使い捨ての更新クエリーを実行
    消費税8%で棚札再発行:税込5%を税込8%へ再計算するための更新クエリ

    [vb]int(([売価OLD]/1.05)*1.08)+0.5)[/vb]

    4.下処理が終わった棚札生データをプライスカード印刷Accessへインポート
    下はそのプログラムの操作画面。

    プライスカード印字画面(MS-Access)
    消費税8%で棚札再発行:プライスカード印字画面(MS-Access)

    プライスカードは4種類:「本体価格+税:基本」「本体価格+税:横広」「内税」「税別」
    背景色は3種類:青、緑、ピンク

    5.下はプライスカードレポートのデザインビュー

    消費税8%で棚札再発行:プライスカードレポートのデザインビュ

    背景色を変えるVBA
    [vb]Select Case Trim(Forms![Fプライスカード]![コンボ色])
    Case "緑"
    Me!背景色ボックス.BackColor = "14286822" ’キャベツ緑
    Case "ピンク"
    Me!背景色ボックス.BackColor = "15852031" ’ピンク
    Case Else
    ’初期値の青
    Me!背景色ボックス.BackColor = "16777190" ’初期値青
    End Select
    [/vb] 印字領域からはみ出さない様、売価が4桁以上だとフォントサイズを小さくしています。この処理は、商品名でも行っています。
    [vb]If Me![売価] >= 1000 Then
    Me![売価].FontSize = 16
    Else
    Me![売価].FontSize = 20
    End If
    [/vb] JANコードの桁数を取り、JANコード13桁とJANコード8桁の表示非表示をコントロール。
    [vb]If myJanLength = 8 Then
    Me![JAN13].Visible = False
    Me![JAN8].Visible = True
    Else
    Me![JAN13].Visible = True
    Me![JAN8].Visible = False
    End If
    [/vb] 税込プライスカードはこんな感じ
    消費税8%で棚札再発行:税込プライスカード。色は3色

    税別プライスカード:幅広はこんな感じ
    消費税8%で棚札再発行:外税プライスカード:ワイド版

    完成したプライスカードはこんな感じです。
    自作プログラムで作ったプライスカード

    いやー、プライスカードの発行は大変です。
    3月、4月で作った棚札は3,000枚以上。
    データ集め、下処理、印刷とすごい手間なのに費用はもらえないサービス

    お願いお役人の皆さん、プライスカードは外税と法律で決めてください。
    この作業が10%の時にもあると思うと気が重いです。

    まぁ、MS-Accessがあれば少々の無理難題でも比較的簡単に対応できてしまうんですけど・・(プログラム的には) 🙂

    個人的にMS-Accessの一番便利だと思っているのはレポート周りなんです。
    裏でVBAをガリガリかけばすご〜く複雑なレポートが簡単に出来るんですよ 😀

    ネット上で見かける「Accessはクソ、FileMaker最高」と書いてる人たちに、Accessレポート機能の奥深さを知っていただきたいな・・・

  • 【vba】改行コード付きCSVファイルのインポート

    苦戦が続くネットショップ!
    通販がこんなに難しいなんて・・・・:-o

    地元の商品「半田そうめん」「大野海苔」「金ちゃんラーメン」だけを売るのでは店の存在感を出せないのか・・・

    思い切って本業で扱っている数百種類の商品もネットで売ってみようかな?

    もしそれをするなら問題がある。
    それは、Yahooショッピングの管理画面「ストアクリエイターPro」の商品登録画面の使い勝手がとっても悪いこと。
    1品登録するのに数分、10品登録するだけで1時間以上かかってしまう。

    さてどうしよう?

    と考えても、結局やることはいつも同じ。
    こんな時には、私の相棒MS-Accessでデータベース開発。
    「ストアクリエイターPro」CSVファイル商品登録用ファイルを生成するローカルシステムを作ってみるか。

    CSVファイルのインポート・エクスポートシステムはたくさん開発したので作る自信はある。

    と思ったら・・・・予想以上に難しい:-o
    問題は、CSVファイルファイルに混ざってる改行コード

    Yahooショッピング商品詳細ページ:商品説明文「explanation」
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    CSVファイルをテキストエディタで開くと「explanation」は改行付き
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    まず試したのがAccessのインポート機能。
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    でも、これを使うとなぜか改行が無い!
    フォームを作り開いてみてもやっぱり改行が消えている!
    これでは、改行付きの原稿をPCで書きCSVファイルへ書き出すことが面倒(困った)
    改行コードはどこに行ってしまったんだろう?

    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    そこで作戦変更。

    TextStreamでファイルを開きsplitでカンマ毎に切り出すことにしました。
    仕事の合間にTextStreamと格闘しながら3日かけてプロトタイプが完成。

    苦労したのが、行末の処理。
    行末にはカンマが無いので、最終項目を取ろうとすると次行の先頭項目まで取ってきてしまう。

    そこで、もう一手間。
    最終項目だけは、もう一度、今度は改行コードでsplitし最終項目と次行の先頭項目の2つに分けることでこの問題をクリア。
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    やったー、完成した!
    早速、テスト開始。

    あれ!

    がーん、テストデータだと動くのに実データだとエラーで止まる!
    原因を調べると、metaタグ「meta-key」に項目分離と関係無いカンマがたくさん存在している!

    そうだよな、「meta-key」にはカンマは必須の記号!
    商品説明文ならカンマを使わないよう運用で対応できるが、「meta-key」に半角カンマは絶対必要だよな・・・

    んんん、また袋小路モード:-(

    さてどうしよう?
    とにかくMETAタグにカンマが有る以上TextStreamは使えない。
    改めて初心に戻りAccessのCSVインポート機能で取り込んだテーブルをボーと眺めていると・・・・

    「もしかして」とひらめいた!

    改行コードが有るのに改行しない不具合は、過去に何度も経験済み。
    UNIXかMACのファイルをPCで開いた時と同じだ!

    そこでフォームにボタンを追加しReplace関数でCRとLFをCRLFに書き換えるスクリプト書き、実行。

    すると、LFをCRLFに変換させた時に改行が表れました 🙂
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    やっぱり改行コード(LF)はそこに有ったんだ(ほっ)
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    試しに更新クエリーで全レコードの改行コードをLF→CRLFに一括変更してみると、すごい全レコードが書き換わった!
    「ストアクリエイターPro」CSVファイル作成プログラムを開発しようかな・・

    これでYahooショッピング商品管理データベースを開発する目途が立ちました:lol:

    では、作りはじめるか・・・・・
    何としても2015年度のYahooショップ「徳島オンラインショップ」を売れる店に改革しなければ!

    次は、商品用の撮影キットを買う予定。
    でも、種類が多すぎてどれを買っていいか分からない 😕
    写真撮影は、VBAより難しいです:-(

  • 【vba】熨斗シール印刷プログラムを作ってみました

    1年目は、鳴かず飛ばずだった通販サイト(残念)
    やっぱ、ネット小売りは難しいな・・・・・:-(

    2年目は何かテコ入れしなければと準備を始めたのが「熨斗サービス」。

    そして買ったのがこれ、蝶結びの熨斗シール。
    シール1枚:縦125×横51mm、それが1シートに5枚並んでシートサイズ:縦140×横270mm
    VBAで熨斗シール印刷プログラム開発

    早速、AccessVBA開発。
    操作画面はこんな感じ
    VBAで熨斗シール印刷プログラム開発

    開発は簡単だろうと始めたら、これが意外に面倒でした。
    熨斗シールって、小口シールとは全然別物 😮

    小口シールは、少々ズレれも問題無い。
    シール内にすべての要素が収まっていればOK。

    でも熨斗は見た目が重要!
    水引の結び目のど真ん中に文字を入れるのが超難しい。

    最初、MS-Officeの新規ラベルウィザードで熨斗シールを登録。
    でも、これで印刷すると微妙に文字がずれるんです。
    VBAで熨斗シール印刷プログラム開発

    そこで作戦変更。
    B5サイズの空リポートを作り、その上に5枚分のテキストボックスを前もって並べました。
    印刷は5枚単位で行う仕様です。
    これなら、一度調整すればズレることは有りません。
    VBAで熨斗シール印刷プログラム開発

    で、完成!(かな?)
    「なんだ簡単じゃん」と思いきや・・・これ表書き、お名前とも4文字がMAXなんです。
    表書きは4文字で行けそうだけど、名前の文字数は少なすぎかな 😕

    そこでVBAの出番!
    文字数を3段階に分け、文字数に応じてフォントサイズを変えるスクリプトを書きました。

    [名前1].FontSize = FontSizeXSmall

    でも、ここで別の問題が!
    VBAでフォントサイズを変えると、文字の中心線が左にズレてしまう 🙁
    それを回避するためにもう1行追加。
    フォントを小さくすることで左にズレる文字を、テキストボックスごと右に移動させるスクリプト!

    [名前1].Top = [名前1].Top + TOPXposition

    スクリプト前半部がこれ
    VBAで熨斗シール印刷プログラム開発

    スクリプト動作後のプレビューがこれ
    テスト印字に漢字「中」を並べたのは、中央に縦棒があるから。
    VBAで熨斗シール印刷プログラム開発

    プレビューと実際の印字位置にもズレがあり、テスト印刷を何度も繰り返しました。

    VBAで熨斗シール印刷プログラム開発

    最大文字数、フォントサイズ、移動幅のベストな組み合わせを探し続けた結果・・・・
    がーん、何度やっても丁度良い数字にたどり着かない。

    こっちを増やせば、あっちがズレる 😮
    私に粘り強さが足りないのかも・・・・・

    で結論としては、名前書きは諦めました。
    表書きのみ対応で、今年の中元商戦を戦おうと思います:-)

    実際に印刷したのがこれ
    VBAで熨斗シール印刷プログラム開発

    お名前の中心位置にこだわらなければ3時間で完成する簡単な開発だったはず!
    右往左往の3日間は何だったんだろう・・・・・・・ 😕

    さてと、今年こそネット通販を軌道に乗せねば。

  • 【vba+pop3開発】Accessでpop3メール受信クライアント作り

    連携出来ない僕のFileMakerGO「なんちゃってハンディーターミナル」アプリと基幹業務システム。

    FileMakerGOから受注データをメール送信。
    そのメールを受信し、添付ファイルを取出、改行コードCRをCRLFに置換、そして指定フォルダへコピーするにはどうすれば・・・・・

    取りあえずMS-Accessでメール受信機能を作れないか検討。
    VBAから実行できそうなコマンドラインのpop3メール受信クライアントをGoogle検索。

    日本語検索では見つからず、英語検索してようやくヒット1件「popclient.exe」!(意外と少なかったです)

    [Command Line Pop Client (Free)–CODEODE]

    「c:pop3」フォルダを作りダウンロードファイルを解凍。

    pop3受信サーバにハンディーターミナルアプリ専用メールアドレスを作り、そのサーバ情報を設定用XMLファイルに保存。

    実行ファイル:c:pop3popclient.exe
    設定ファイル:c:pop3fmGOconfig.xml
    メール保存先:c:pop3mail
    添付ファイル保存先:c:pop3attachFiles
    VBAで処理後のファイル保存先:c:pop3importedFiles

    さて、受信できるかな?
    FileMakerGOからテスト受注データを送信。
    設定ファイル名を引数にしてpopclient.exeをDOS窓で実行!

    c:pop3popclient.exe -configfile fmGOconfig.xml

    おおおーーー受信した、すげー便利!

    添付ファイル保存先「c:pop3attachFiles」にファイルが2つ出来ました。
    2つともファイル名がユニーク(=唯一無二)になるように意味を持たない長い文字列が末尾に付加されている。

    1つはFileMakerGOで生成した受注明細の固定長ファイル。
    もうひとつは「iPodから送信」と書かれただけのテキストファイル。
    VBAから実行したpopクライアントが受信したメールの添付ファイル

    受注ファイル名の先頭6文字の「FMGoHT」を探し、改名しながら処理フォルダーへ移動するVBAを考えてみました。

    概要
    1:「c:pop3attachFiles」内をdirして先頭6文字が「FMGoHT」のファイルを探す
    2:そのファイルを処理しやすいtxt拡張子付ファイル名に改名
    3:処理フォルダー「C:pop3importedFiles」へ移動する

    後は、nkf.exeで改行コードを変換しサーバへ移動すれば完成。

    [vb]’popclient.exeを起動するバッチファイル
    Shell "c:pop3
    eceive_fmGOmail.bat"

    Const PathSource As String = "C:pop3attachFiles"
    Const PathDistin As String = "C:pop3importedFiles"

    Dim i As Long
    Dim myDir As String
    Dim myFile As String
    Dim mySourceFiles As String
    Dim myDistinFiles As String

    myDir = Dir(PathSource & "*")

    Do While myDir <> ""

    i = i + 1
    If Left(myDir, 6) = "FMGoHT" Then

    myFile = Left(myDir, 23)
    mySourceFiles = PathSource & myDir
    myDistinFiles = PathDistin & myFile & ".txt"
    Name mySourceFiles As myDistinFiles

    ここで改行コードをCRからCRLFに変換
    サーバ上の指定フォルダーへ移動

    End If

    myDir = Dir

    Loop

    kill PathSource & "*"

    MsgBox "全部で" & i & "個のファイルをインポートしました。"[/vb]

    このスクリプトを完成させればFileMakerGOハンディーターミナルアプリと基幹業務サーバの連携が出来るようになるよな・・・
    でも、出来ればFileMakerGOが改行コードCRLFのファイルが作れ、FTPクライアント機能があれば便利なんですけどね。

  • 【vba】nkf+Accessで改行コードCR→CRLF置換

    FileMakerGOからエクスポートしたテキストファイルの改行コードはCR。
    そのデータを加工する専用MS-Access開発の為、改行コードの変換出来るコマンドラインソフトを検索。

    一番良さそうだったのがUNIXコマンド:nkfのWindows移植版。

    [文字コード変換コマンドの nkfの使い方と実例をまとめました。]

    VBAから実行させたいこの下記のコマンド
    [vb]C:Progra~1Common~1
    kf
    kf.exe -s -Lw –overwrite FileMakerGO出力ファイル.txt[/vb]

    最初、VBAのshellでトライしましたがエラーが消えず断念 😮
    次に、VBAからWindows Script Host (WSH)経由で実行を試みましたがこれも失敗 😮

    exeの後ろに長いオプションが有る時は、いつも失敗している私:-(

    今回も、いつもの最終手段。
    FileSystemObjectでDOSのバッチファイルを作り、その中に長いオプション付きコマンドを書込み保存。
    それをCMD.exeで実行。

    やった、動いた!
    やっぱこの方法が一番確実。枯れた技術、万歳 😀

    [vb]Private Sub btn改行コード変換_Click()

    Dim myEexFile As String
    Dim myOption As String
    Dim myFMGOfile As String
    Dim myCOMMAND As String

    myEexFile = "C:Progra~1Common~1
    kf
    kf.exe"
    myOption = "-s -Lw –overwrite"
    myFMGOfile = Me![txtFileMakerGOファイル名] myCOMMAND = myEexFile & " " & myOption & " " & myFMGOfile

    Dim FSO As New FileSystemObject
    Dim st As TextStream
    Set st = FSO.CreateTextFile("C:katabefmgoCR2winCRLF.bat")

    st.WriteLine ("@echo off")
    st.WriteLine ("@echo off")
    st.WriteLine ("echo ———————————————")
    st.WriteLine ("echo ★一瞬で見えないメッセージ★")
    st.WriteLine ("echo iPhone、iPod作成受注データを取り込み")
    st.WriteLine ("echo 改行コードCRLFへ変更します ")
    st.WriteLine ("echo ———————————————")
    st.WriteLine (myCOMMAND)
    st.WriteLine ("exit")
    st.Close

    Shell ("cmd.exe /K C:katabefmgoCR2winCRLF.bat")

    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM JANlistテーブル"
    DoCmd.SetWarnings True

    DoCmd.TransferText データインポートします:-)

    End Sub[/vb]

    完成はしたもののオフコンとの連携が解決できず誰も使っていない
    FileMakerGOアプリ「なんちゃってハンディーターミナル」。

    それとは逆に、評判がイイのが単純に情報を集めるデータコレクタ機能 🙂
    「バーコードスキャン、数量、単価、保存」を繰り返すシンプルな画面で、データ加工は専用MS-Acess。

    nkf.exeを使った改行コード変換は、この専用Accessのインポート部分です。

    このデータコレクター機能+加工用Accessがあれば、消費税アップ時に依頼されるであろうプライスカード再発行業務が少し効率よく出来ると思います。

    それにしても、プライスカードは外税にすべきですよね!?

    消費税アップごとに何百枚、何千枚の内税プライスカードを作り変えてたら時間と経費が猛烈に掛かり中小企業はつぶれてしまう。
    それをお役人は分かってくれてるのかな・・・ 😕

    その上で、軽減税率を本気で導入するつもりなんだろうか?
    オフコン屋に見積りさせたら、商品分類ごとで税率を変えるプログラムは複雑で会社が潰れそうな高い見積額になりそうなんですけど・・・・。
    どこの政党だ、熱心に・・・

  • 【目指せ格上開発者】ADOレコードセットをフォームに連結

    FileMakerの勉強を通して再認識することは
    「なんてMS-Accessは多機能なんだ!まるで底無し」 😆

    と言っても、私は超初心者級のJetオンリーのプログラマ。

    FileMakerの開発が終わったら、格上開発者を目指しSQLサーバの開発を勉強したくなりました。
    まぁ、小さな田舎企業なんで仕事はJetで事足りるんですけど・・・

    [ADO レコードセットにフォームを連結する方法–microsoft]

    知りませんでした、ADOのレコードセットをフォームに張り付けられるなんて!
    人生、死ぬまで勉強ですね 😮

    [vb]Private Sub Form_Load()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    ’Use the ADO connection that Access uses
    Set cn = CurrentProject.AccessConnection

    ’Create an instance of the ADO Recordset class,
    ’and set its properties

    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM T分類"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .Open
    End With

    ’Set the from’s Recordset property to the ADO recordset

    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing

    End Sub[/vb]

    Access歴十数年、たくさんのmdbを作り、Jetデータベースエンジンならよほどでなければ何でも作れると自負している私。
    でも、「Access=JETエンジン」と思い込んでる無知なFileMaker屋がネットに書いたAccessの悪口を読むたび、自分はそのJetレベルの存在なんだと恥ずかしく感じるようになりました。

    ビッグデータ時代、次世代のデータベース技術が次々登場する中、せめてSQLサーバの開発テクニックは取得しなければと急に焦りを感じています。

    JetもFileMakerも、どんなに勉強してもJetかFileMaker止まり!

    その先を目指さなければ時代に取り残されてしまう・・・ 😮

  • 【VBA+XML】Google Maps APIがver3にアップしてる!また動かないよ・・

    中元シーズンと歳暮シーズンの年に2度だけ動かす自家製配達先地図生成ソフト(MS-
    Access製)を半年ぶりで使うと・・・・

    あれ、また動かない:-o

    調べてみると「Google Maps API ウェブ サービス」のVer2は終了し、最新はVer3。
    プログラムの書き直しが必要みたい・・・

    半年ごとに仕様が変わるGoogleサービスに合わせてプログラムを書き換えるのは、ちょっとシンドイです。

    変更点は2つ:
    1:問い合わせURLの変更
    2:XMLレイアウトの変更

    “1:問い合わせURLの変更

    [Google Maps API ウェブ サービスver3]
    [Geocoding API Ver2(動かなくなった古いバージョン)]

    上の仕様ページを参考にプログラムを下記のように変更するとエラーが無くなりました。

    でも緯度経度に住所欄が空白のまま(何故) 🙁

    [vb]’2013中元商戦で動いてたVer2用URL
    myURL = "http://maps.google.com/maps/geo?&q="

    ‘2013歳暮商戦ではVer3に代わり下記のようにスクリプトを変更
    myURL ="http://maps.googleapis.com/maps/api/geocode/xml?A&sensor=true&address="[/vb]

    落としたXMLデータから緯度・経度、住所の情報が取り出せていない。
    原因をいろいろ調べて見ると、あれVer2とVer3のデータレイアウトが全く違う:-o

    “2:XMLレイアウトの変更
    [XPath による XML の処理—- Google Maps API ウェブ サービス]

    ver2の時は都道府県、市、町名、番地が別々のタグだったので下記のようにXPathで直接取り出せました

    [vb]For Each Node In
    XDoc.selectNodes("/kml/Response/Placemark/AddressDetails/Country/AdministrativeArea/AdministrativeAreaName")
    ’ ’都道府県
    myPOINT = myPOINT & "," & Node.Text
    Next

    For Each Node In
    XDoc.selectNodes("/kml/Response/Placemark/AddressDetails/Country/AdministrativeArea/Locality/LocalityName")
    ’市
    myPOINT = myPOINT & "," & Node.Text
    Next

    For Each Node In
    XDoc.selectNodes("/kml/Response/Placemark/AddressDetails/Country/AdministrativeArea/Locality/DependentLocality/DependentLocalityName")
    ’町名
    myPOINT = myPOINT & "," & Node.Text
    Next

    Each Node In
    XDoc.selectNodes("/kml/Response/Placemark/AddressDetails/Country/AdministrativeArea/Locality/DependentLocality/Thoroughfare/ThoroughfareName")
    ’番地
    ’ myPOINT = myPOINT & "," & Node.Text
    Next
    [/vb]

    でもVer3用は住所のパーツが全部同じ「address_componentタグ」に変更。
    「/GeocodeResponse/result/type」がpremiseかpoliticalで住所パーツの順番
    が変化し僕のプログラムがうまく動かない・・・(困った)

    premise」=建物特定された場合:
    (0)type(1)経度(2)緯度(3)Japan(4)〒県(5)市(6)町(7)番地(8)
    political」=おおよその位置:
    (0)type(1)経度(2)緯度(3)町(4)市(5)県

    試行錯誤しながらXPath先を下記のように変更しました。

    [vb]For i = 0 To UBound(mySplitData)

    If mySplitData(0) = "premise" Then

    Select Case i
    Case 1
    ’緯度
    myLAT = mySplitData(1)
    Case 2
    ’経度
    myLNG = mySplitData(2)
    Case 4
    ’都道府県
    myPref = Trim(mySplitData(4))
    If Left(myPref, 1) = "〒" Then
    myPref = Trim(Mid(myPref, 11, 200))
    End If

    Case 5
    ’市
    myCity = Trim(mySplitData(5))
    Case 6
    ’町名
    myTown = Trim(mySplitData(6))
    Case 7
    ’ストリート
    myStreet = Trim(mySplitData(7))
    End Select

    Else

    Select Case i
    Case 1
    ’緯度
    myLAT = Trim(mySplitData(1))
    Case 2
    ’経度
    myLNG = Trim(mySplitData(2))
    Case 5
    ’都道府県
    myPref = Trim(mySplitData(5))
    Case 4
    ’市
    myCity = Trim(mySplitData(4))
    Case 3
    ’町名
    myTown = Trim(mySplitData(3))
    Case 6
    ’ストリート
    myStreet = Trim(mySplitData(6))
    End Select

    End If

    Next i
    [/vb]

    不具合がいくらか残ったままですが取りあえずVer3対応地図アプリ完成!?
    悲しいかな本業は卸業。取りえず地図が出ればOK:-)
    プログラムの完成度を突き詰める時間的余裕はありません。

    ver2からver3へプログラムを書き換えようやく地図が!あれ、マークの色が渋くなってる!

    これでやっとスタート地点。
    早速、商品の配達を始めなければ仕事が終わらない 😮

  • 【vba覚書】SQLを実行

    VBAからSQLを実行する時にコピペする雛形

    [vb]Dim mySQL as String

    mySQL = "UPDATE 一時テーブル SET 処理対象F = False WHERE JANコード=’1234567890123’"

    DoCmd.SetWarnings False
    DoCmd.RunSQL "delete from 一時テーブル"
    DoCmd.RunSQL mySQL
    DoCmd.OpenQuery "アクションクエリー名"
    DoCmd.SetWarnings True
    [/vb]

  • 【VBA覚書】テーブルを開く

    このスクリプトをコピペすればテーブルをレコードセット化出来る。

    [vb]Function dbRSopen()

    Dim cn As ADODB.Connection
    Set cn = Application.CurrentProject.Connection
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Open "対象テーブル", cn, adOpenKeyset, adLockOptimistic

    Do While rs.EOF = False

    rs![変更したい項目] = DLookup("新しい値", "元テーブル", "ID=" & rs![ID])
    rs.Update

    rs.MoveNext
    Loop

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

    End Function
    [/vb]

  • 【vba】ダブルクリックでGoogle検索

    アクセスVBAで作った棚卸一覧表
    MS-Accessで作った棚卸画面。JANをダブルクリックでGoogle検索

    棚卸データに未登録JANが含まれる場合、商品名が空白になってしまう。

    そんな時、JANコード欄をダブルクリックで商品情報をGoogle検索する棚卸フォームを作ってみました。

    このVBAで、JANコード欄をダブルクリックするとJANコードをGoogle検索し、下部のWEBブラウザーコンポーネントに表示します。

    [vb]Private Sub JAN_DblClick(Cancel As Integer)

    Call seekGoogle(Me![JAN])

    End Sub

    Private Sub seekGoogle(myKEY As String)

    Dim myURL As String
    myURL = "http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIC_jaJP309JP309&q=" & myKEY

    Me![MyWebBrowser].Navigate myURL

    End Sub
    [/vb]

    ページを1つ戻るVBA
    [vb]Me![MyWebBrowser].GoBack
    [/vb]

  • 【vba】Google Static Maps ver2の36個の壁を小手先で超える!

    2013年中元商戦開始とともに分かった「Google Static Maps ver.2」の最大36個の壁。

    【VBA】Google Static Mapが表示されないよ!

    地図に出せるのが最大36個では少なすぎる・・・(困った)

    困った、困った、困った、腹減った、困った・・・・・、ひらめいた:-D

    1ページに地図を2個のせればいいんだ 😆

    1)注文リストを経度でソートしてDo Loop
    2)1から36件目は1個目のimgタグに繋いでいく
    3)37個目で、1個目のimgを閉じ、2個目のimgタグを開く
    4)37個目以降は、2個目imgへ繋ぐ
    5)2個目のimgを閉じる

    超小手先なソリューション、これぞ田舎企業のIT:-P

    小さな問屋の注文、72ヶ所(地図2枚分)以上の注文は今のところないので2013年中元シーズンの「住所録2配達先マップ」VBAは冗長性が無いけどこれでいいや 😆

    さてと、後は本業。
    リアル世界で配達をしなければ・・・

  • 【vba】Google Static Mapが表示されないよ!

    毎年2回、お中元とお歳暮シーズンにお世話になるのが「Google Static Maps」:-)

    [Static Maps API v2—google]

    5年前、配達効率を上げる為、趣味と実益を兼ねてAccessVBAで「住所録2配達先マップ」を作成。シーズンの度に改良を加え、それなりに完成度が上がってきたと自負していました。

    でも、あれ動かない!😮
    先日、2013年の中元申込みエクセルが届き、半年ぶりに動かすと地図が出ない。

    原因を調べると、2012年歳暮商戦から2013年中元商戦の間で「Google Static Maps API Ver.1」のサポートが終了していたそうな・・・

    動かなくなったver1のimgタグのsrc:
    [html] http://maps.google.com/staticmap?center=39.08284,1304.63262033262&zoom=16&size=640×640&format=jpg&maptype=mobile
    &markers=
    3133.8574584718,134.62572,bluef|
    33.86641814084,134.62262,red0|
    332.8638613,134.62267,yellowy|
    333.8300u083,134.62107,blackw|
    334.83u7454,134.621161,purples|
    353.83jh7484,134.622489,orange5|
    &key=MAPS_API_KEY&sensor=false"[/html] ver2用の書き直すと地図が出た!
    [html] http://maps.googleapis.com/<b>maps/api/staticmap</b>?center=345.84858284,130.622558162&zoom=16&size=640×640&format=jpg&maptype=mobile
    &markers=
    <b>color:blue%7Clabel:F%7C</b>3h3.5h50173,134.6252
    &markers=
    color:red%7Clabel:S%7C363.84104,134.68462
    &markers=
    color:black%7Clabel:W%7C33.81,134.6226639277
    &markers=
    color:blue%7Clabel:G%7C373.83003,13h4.6251899
    &markers=
    color:blue%7Clabel:T%7C33.8374,13hg4.62126161
    &markers=
    color:blue%7Clabel:7%7C33.84164,13f4.624999
    &sensor=false"[/html]

    さてと原因が分かったので、早速VBAをver1→ver2へ書きなおさねば(やれやれ) 🙁

    追加:
    あれ、VBAをver2用に書き換えても地図が出ない!間違ったところは無いんだけどな・・・・

    試行錯誤の結果原因判明。
    ver1では最大62個までマークが付けることが出来たのに、ver2では36個に減らされている。

    最大マーク数を減らしようやく地図が出た 🙂
    google static maps