FC2ブログ

至難 


いろいろと質問をみていると
・結果を知っていて・・・
・どういう回答が寄せられるか・・・
を楽しんでいるのかなぁ~ と思いたくなるようなものもありますね
釣り?  本当にわからないで聞いているの?

例えば
1)
文字列 "2013年10月12日(土)" なら 20131012 の8桁に、
文字列 "2013年1月18日(土)"  なら 20130118 の8桁に変換したい

2)
Dim obj As Object

Set obj = CreateObject("Excel.Application")
obj.Workbooks.Open FileName:="D:\hoge\hogehoge.xls"
上記記述で、ファイルを開いて obj を取得している・・・
ファイルの内容を随時参照/更新したいので、ファイルが開いていたら、それを参照したい

3)
変数 a = 2, b = 3 の時、掛け算を使って 1 を求めたい


回答を考えてみるとしたら、

1)
文字列 "2013年10月12日(土)" なら 20131012 の8桁に、
文字列 "2013年1月18日(土)"  なら 20130118 の8桁に変換したい

の場合、素直に考えれば、
・Date型「日付」を
・Format(日付,"yyyy年m月d日(aaa)") で表示しているのかな?(もしくは書式?)
と思うので、"(" までの左側を CDate / DateValue で変換したものを
Format で "yyyymmdd" すれば良さそうに見えます。

ただ、2013年1月18日 は金曜なので、単に日付に似せた数字が使われている・・・
と思った方が良いのかもしれませんね。
まさか、(土) に合わせて、近い 2013年1月19日 に置換えろ・・・じゃないですよね。
"(" の右側は信じるな・・・・ なら CDate / DateValue を使っても良いかもしれない・・・
安易に CDate / DateValue は使えない・・・ という解釈しておいた方が better ?
数字部分を左から順に取り出して、4桁2桁2桁に揃えた方が無難でしょうか?

ということで、RegExp を使ってやってみましょうか・・・

Public Function CalcMoji(ByVal sSrc As String)
  Dim sR As String
  Dim vAry As Variant
  Dim v As Variant
  Dim i As Long

  vAry = Array(4, 2, 2)

  sR = ""
  sSrc = StrConv(sSrc, vbNarrow)
  With CreateObject("VBScript.RegExp")
    .Pattern = "\d+"
    .Global = True
    i = 0
    For Each v In .Execute(sSrc)
      If (i > UBound(vAry)) Then Exit For
      sR = sR & Format(Int(v), String(vAry(i), "0"))
      i = i + 1
    Next
  End With
  CalcMoji = IIf(Len(sR) > 0, Int(sR), 0)
End Function

「8桁」という表現だったので、生成した文字列を Int 変換していましたが・・・
文字列のままで良ければ、そのまま CalcMoji = sR でも。
(なので、関数の型は明示してませんでした)

この方法であれば、数字間は数字じゃない文字列が入っている・・・で動きますね。
"2013.4.5" でも "2013a6b7" でも "2013あああ8aaa9" でも・・・・
ただ、"13ABCD8あいう9" では 130809 になります。
年?に相当する部分は、単純に4桁にしているので 2013 にはなりません。
また、Int(sR) で戻しているので、先頭 "00" は削られます。
(文字列で返せば、先頭の "00" は消えません)

この関数に、解釈したい文字列を与えると結果が返ります。
例えば、Excel の A1 にその文字列があったとして、B1 に =CalcMoji(A1) すれば表示されます。
ま、Access では、テキストボックスのコントロールソースに同じように記述しておけば・・・

※ 上記のコードでは不完全です
4桁2桁2桁 に揃えようとしていますが、数字部分に桁以上が設定されていたら・・・
 2013 の4桁部分が 12013 とかでは、元の桁が生きちゃいますね・・・
4桁の場合、下4桁を有効とするには
      sR = sR & Format(Int(v) Mod 10 ^ vAry(i), String(vAry(i), "0"))
とか
      sR = sR & Right(String(vAry(i) - 1, "0") & v, vAry(i))
とか
      sR = sR & Right("000" & v, vAry(i))
とかにでもすれば良いですね・・・
続きを読んでみようかな ---≫
スポンサーサイト

2013/10/27

Category: なんだかな

TB: --  /  CM: 0

top △

Excel VBA をやってみた 


問い)

セルA1、B1 に開始日時、終了日時がある場合、以下のように A3 ~ 対象の範囲を作成する。

 AB
12011/11/01 10:002011/11/03 10:20
2  
32011/11/01 10:00 
42011/11/01 10:05 
52011/11/01 10:10 
62011/11/01 10:15 
72011/11/01 10:20 
82011/11/02 10:00 
92011/11/02 10:05 
102011/11/02 10:10 
112011/11/02 10:15 
122011/11/02 10:20 
132011/11/03 10:00 
142011/11/03 10:05 
152011/11/03 10:10 
162011/11/03 10:15 
172011/11/03 10:20 


つまり、時刻 10:00 ~ 10:20 の間で、5分おきの時刻を作成する。
(11/1 ~ 11/3 の 10:00 ~ 10:20 のものを作成する)

というのをやってみました。

Excel は慣れていないのか・・・・セルでの表示にまどわされたり・・・・
結構しんどいですね。

一応、私が作成確認してみていたのは、Vista + Excel2007 の環境です。
続きを読んでみようかな ---≫

2011/10/04

Category: なんだかな

TB: 0  /  CM: 0

top △

帳票フォームにサブフォームを組み込んでみた その後 


帳票フォームにサブフォームを組み込んでみた をきっかけににして、
サブフォーム部分の表示を「品番ID」で絞り込んでみたり・・・・
という事で以下の記事を書いていました。(今回その確認に手間取ってました)

項目旧記事掲載タイトル
12009/11/29 帳票フォームにサブフォームを組み込んでみた(顛末記)
22009/11/29 帳票フォームにサブフォームを組み込んでみた(顛末記:完結?)
32009/11/30 帳票フォームにサブフォームを組み込んでみた(顛末記:ファイナル)

続きを読んでみようかな ---≫

2011/07/01

Category: なんだかな

TB: 0  /  CM: 0

top △

2007 で、リストボックスの動きが 


旧記事掲載:2010/07/16
動作確認用のサンプルを新しく追加しました


私のAccessの先生、それはシステムサイエンス研究所の「Access2000VBA 基本例題300」です。
私の周りには、聞けるだけの人は居なかったので、自分で試して、試して、の繰り返しでした。
Webの情報を探す・・・は、最後の手段と考えていて、大体はヘルプ等で解決できてました。

連結フォームは、握る/離す等のタイミングがイメージできなかったので、
非連結での構成(VBA記述が多くなりますが、イメージし易かったので)でやってました。
VBA自体は苦では無かったです(他言語の経験があったので)

Access2000から始めて、2003、2007を触っていくわけですが、
(自宅のパソコンでの話)
2007だけがまともに動かない、、、で、その場所を特定して、再現できるものを作りました。
これは、自分では解決できない、回避方法はあるけど・・・・、ずっとこのまま??
今日現在でも再現できるので、環境ある方は、試してみてください。

(私の環境は、Access2007+Vista です)

現象のおきる構成概要)

フォーム上のものになります。
リストボックス1つ、フォーカス移動用のコマンドボタン1つ
リストボックスは、テーブルの内容を表示し、複数選択なし

現象のおきる記述概要)

リストボックス名を「lst01」、コマンドボタン名を「btn01」とします。
リストボックスのクリック時に、以下を記述します。
Private Sub lst01_Click()
  Dim sTmp As String

  sTmp = "Before: " & Me.lst01.Column(0) & vbCrLf
  Me.btn01.SetFocus ' Focus を他のコントロールへ移動
  sTmp = sTmp & "After: " & Me.lst01.Column(0)
  MsgBox sTmp
End Sub


フォーカス移動後、値が得られない。。というもの。
移動後は、NULL になってしまいます。
(コンボボックスでは2000/2003/2007同じ動きです)

私の操作イメージ)

クリック時の処理後半で、条件によりリストボックスを非表示にする場合があるので、
処理の初めにフォーカスを外しておこう、クリックしたらフォーカスは必ず、ここ。。

回避方法)

・フォーカス移動前に、変数へ値退避
(・フォーカス移動後、リストボックスを Requery)
・フォーカス移動を非表示直前まで引っ張る

結局、非表示にしない(=フォーカス移動しない)事にしました。
続きを読んでみようかな ---≫

2011/05/14

Category: なんだかな

TB: 0  /  CM: 2

top △