忍者ブログ
30 March

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

25 December

【ExcelVBA】ER図のパーツを作る

自分用。作成は、Office2010。

コピーするシート上にある元のシェイプグループはこんなん↓
テーブル名と、フィールド名と、それを括るものの3つで構成。


ターゲットシート(Worksheets("TgtDB"))には、ER図を作りたいテーブルの俗称とフルパスが複数入っていて、そのデータベースの中に、DBのテーブル情報をまとめたテーブル("C1")が個々に入っている、という設計です。

複製したシートの、2行目から、10個ずつ折り返しつつ、ずらずらとテーブルごとにシェイプグループを作ります。雛形が一行目に残りっぱなしですけど、それは後で手で削除します。

グループはなんか、オブジェクトじゃなくて状態?なのかなんなのか知らないんですけども(の、割にはObjectに入ったけど…)グループを入れたObjectと、グルーピングしたいシェイプのObjectをつかんでるだけでは、両方を選択することができないらしく…。

結局、個別にユニーク名を付けて、名前で選択→グルーピング、しか、今回手段が見つけられなかった感じです。
'--------------------------------------------------------------------------
'    Write by m_o_co
'--------------------------------------------------------------------------
Option Explicit

Private Const GRP_NM As String = "Gr_TBL"
Private Const TBL_TTL As String = "R_TBL_Title"
Private Const TBL_FLM As String = "R_TBL_FRAM"
Private Const FLD_NM As String = "R_FLD_NM"

Private DB As DAO.database
Private RS As DAO.Recordset

Private WB As Workbook
Private tmpShp As Object
Private wkSht As Worksheet

Private wkTblNm As String

Private cRow As Long
Private cClm As Integer

'--------------------------------------------------------------------------
Public Sub crtErPeace()

拍手

PR
16 October

【VBA/Access2010】ProcOfLineプロパティで永ルプった話。

やられちまったぜTANAKAさん…!

CodeModuleのプロパティ
http://officetanaka.net/excel/vba/vbe/05.htm

~あらすじ~

環境毎にフロントファイルを分けたり検証したりしているうちに、ソースのバージョン管理がメタメタになったm_o_coは、各プロシージャの行数を収集するため、VBEオブジェクトという未知の領域に踏み込んだ。そこで永久ループに、はまったのであった。


拍手

22 May

【Access/VBA】サブフォーム内の任意のレコードに移動する。

びゃああああ!!!解決してないぞこのスレッド!!
http://www.accessclub.jp/bbs5/0004/vba797.html

うおおお、あきらめてなるものかー!ぐぐるぐぐる

http://www.nurs.or.jp/~ppoy/access/access/acF001.html

pPoyさんありがとうpPoyさん!!!
(pPoyさんのコードや凡例はいつも超実用的で大変お世話になっております!)

やりたかったのは、特定のレコード削除後に、その削除レコードの場所から画面を大きく移動させない事。

Execute "Delete From~"する
   ①Me.Refreshする  → カーソルは保持できるが、#Deleteの枠が残る
   ②Me.Requeryする → リクエリーなんで、当然カーソルが先頭に戻る。

ひぎゃあああ!ヾ(:3ノシ )ノシ


サブフォームのステートメントからコールしたかったので、↓になりました。
Delete前に、SaveBMして、リクエリー後、MoveBMします。
'------------------------------------------------
Private BM As Variant

Private Sub SaveBM()
'=========================
'   移動先の保持 by m_o_co
'=========================

On Error GoTo Err_Me

Forms(Parent.Name).[サブフォーム名].SetFocus
DoCmd.GoToRecord , , acPrevious
BM = Me.Bookmark
DoCmd.GoToRecord , , acNext   ’ 後の処理で、カレントレコード前提で組んでるのが一杯あるので戻す。

No_Err:

Exit Sub
Err_Me:

Select Case Err.Number
Case 2105
' 先頭レコードだとエラーになるので。
BM = Null
Resume No_Err
End Select

End Sub

Private Sub MoveBM()
'=========================
'  カーソル移動 by m_o_co
'=========================

If Not IsNull(BM) Then
Forms(Parent.Name).[サブフォーム名].SetFocus
Me.Bookmark = BM
End If

BM = Null

End Sub
'------------------------------------------------

まじ、ブックマーク呪わしい。ほんと…!

拍手

28 February

【Access/VBA】備忘録)祝日マスターとそれを使ったカレンダーデータ作成

割と手が込んでて、汎用性がそれなりにあり、ソース無くなってまた組む羽目になったら面倒なので。

【参考】
【Excel Tips】成人の日や体育の日などのハッピーマンデーの日付を求めるには?
http://enterprisezine.jp/iti/detail/854
【Excel Tips】春分の日や秋分の日を求めるには?
http://enterprisezine.jp/iti/detail/865

祝日マスター
-------------------------------------------
管理No名称祝日区分振替基準日
1元旦011  0
2成人の日11 2 0
3建国記念の日0211  0
4春分の日23  INT(20.8431+0.242194*(★年-1980))-INT((★年-1980)/4)0
5昭和の日0429  0
6憲法記念日053  5
7みどりの日054  5
8こどもの日055  0
9海の日17 3 0
10敬老の日19 3 0
11秋分の日29  INT(23.2488+0.242194*(★年-1980))-INT((★年-1980)/4)0
12体育の日110 2 0
13文化の日0113  0
14勤労感謝の日01123  0
15天皇誕生日01223  0
-------------------------------------------

祝日計算の心臓部↓
-------------------------------------------
Select Case RS(0)!祝日区分
Case 0
wkDay = RS(0)!日
Case 1
wkWeek = Weekday(DateSerial(mYear, RS(0)!月, 0), 3)
If wkWeek = 7 Then wkWeek = 0 ' エクセルと統一する為
wkDay = (7 * RS(0)!週) - wkWeek
Case 2
wkDay = Eval(Replace(RS(0)!式, "★年", mYear))
End Select
-------------------------------------------

-------------------------------------------
Public Sub Crt_Doniti(mYear As Integer)
'================================
' 土日情報
'================================
Dim DB As DAO.Database, RS As DAO.Recordset
Dim wkDay As Integer, m As Integer, i As Long, wkWeek As Long, wkDate As Date, WeekFlg As Integer


Set DB = OpenDatabase(DB_jinji, False, False, pDB_Jinji)
Set RS = DB.OpenRecordset("Select * From お休み管理用のテーブル", dbOpenDynaset)

WeekFlg = 2 ' 最初の土曜日
For m = 1 To 12

Set_SanDay:
wkWeek = Weekday(DateSerial(mYear, m, 0), WeekFlg)

Select Case wkWeek
Case 6: wkDay = 7
Case 7: wkDay = 6
Case Else: wkDay = 6 - wkWeek
End Select

For i = wkDay To Day(DateSerial(mYear, m + 1, 0)) Step 7

wkDate = DateSerial(mYear, m, i)
wkWeek = Weekday(wkDate, 2)

RS.FindFirst "日付=#" & wkDate & "#"
If RS.NoMatch Then

RS.AddNew
' (略)
RS.Update
End If

Next

' 最初の日曜日
If WeekFlg = 2 Then
WeekFlg = 3
GoTo Set_SanDay
Else
WeekFlg = 2
End If

Next

End Sub
-------------------------------------------

拍手

28 February

【Accessフォーム】怪現象、謎の「01」【追記あり】

ある日の私は、ユーザーさんに年末年始休みを登録してもらうためのカレンダーフォームを自作していた。
 各年の土日と祝日データを作成し、それを元に、ぽちぽちクリックして赤文字にして貰った日付を、テーブルにデータとして追加するのである。

 Access2003辺りからは、アクセスも条件付き書式をフォローしているが、当社でメインで活躍しているのは、Access2000。
「ここにチェックが入ってたら赤くなる文字」は、アクセスの元々の制御では作れないため、工夫が必要だ。

 日付一つに、枠を持つ黒文字のテキストボックスと、枠と背景色が透明な赤文字のテキストボックスを重ねて配置している。
 休み情報が無ければ、その日付を黒側に、あれば赤側に入れる。
 ユーザーさんがクリックしたら、日付が入っている方から、入ってない方へ値をそのまま移し、元の値を消す。

 というのが、Access2000において、値の内容で書式を変えたい時のスタンダードなやり方だと思っている。


 テストを進めるうちに、何故か木曜日の列だけ、クリック後の赤文字が「01」という表示になるバグが発生。




 ……おい、その「01」、どこから持ってきた。


 この数字は、非連結のテキストボックスへ、Day関数で持ってきたそのままを入れてるので、当然頭に0とか入らない。
 テキストボックスの書式プロパティを見ても空欄である。

 機能としては、一つの枠に、黒文字_0~41、赤文字_~、チェック_~の、三つのオブジェクトが重なって、一つの日付を扱っている。
 チェックボックスのクリック時に、チェックボックスの名前の数字を同じプログラムに渡すことで、対応したそれぞれの位置の赤文字や黒文字をコントロールしている。
つまり、このカレンダーに42個ある枠は、全て同じ制御下にあるのだ!木曜日の列の渡し値がおかしいとか、そんなことも無い。


 訳 が 分 か ら な い よ …!!


 そして、表示が01になっているテキストボックスのValue値をデバッグで見ても、正しい値が入っている。
 この画像で言うならば、「16」だ。16が入っている。しかし表示は「01」だ。

------------------------
イミディエイト
------------------------
debug.print forms("F_カレンダー").赤文字_17.value ' ←オブジェクトの連番は0番から。このカレンダーの1日は2番目から値が入っているので、16日は17番となる。
16
------------------------

 なので、チェックを外すと、黒文字の「16」になる。(正しい)


 やっぱり──訳 が 分 か ら な い よ …!!


 該当列のプロパティをチェックしたりフォームを閉じたりしているうちに、何故か、第一週と第二週が直った…。プロパティは変更していない。


 全く──訳 が 分 か ら な い よ …!!


 正常に動いている列を丸コピしてくれば、直るような気はするのだが、42個×3のオブジェクトをびっしり綺麗に並べて、全てに名前をつけるのはそれなりに手間なんである。オートで付けられていたタブストップ順も直さないといけない。
 障害が出ているのが、たかだか6個や4個とは言え、直る保証もないのにイマイチやりたくない。

 直るなら、全部直ってくれよ!たのむよー!><
-----------------------------------------------------------------

 ……なおっ、た……!

 ・前述のコピーペーストでは直らなかった(泣)
 ・2週目は、直っていたのではなく、2週目の値が一桁の時に症状が出てなかった。(一週目は二桁が入らないので症状が出なかった)

     ↓

 「エクセルで、セル幅が小さいときに*とかになるアレかー?!!!」

     ↓

 木曜日赤文字のテキストボックスの幅を広げたら直った。

 ぐすん…。気づくの遅いよバカ。
 結論としては、テキストに変換してから入れておけば、こういう表示にはならなかった気がします。
 しかしそれも、どうなのだ。内容によって、適切な手段は異なってきそう。

 ……しかし、この「01」、フォームからコピーペーストしても「01」だったぞ…?使用不可プロパティ設定してたから…?

拍手