[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーホームにカレンダを表示したい』(唯一無二)
Excel2003 WindowsXPを使用しています。 よろしくお願いします。
本学校で色々検索したり、教えて頂いて自動で見やすいカレンダを表示させ 色々な場面で活用させて頂いています
A B C D E F G 1 2012 3 2 日 月 火 水 木 金 土 3 1 2 3 4 4 5 6 7 8 9 10 5 11 12 13 14 15 16 17 6 18 19 20 21 22 23 24 7 25 26 27 28 29 30 31 8 9 A1に関数で今の年(yyyyy)B1に今の月(mm)が表示しています 各セルには日付が表示しています 本日は3月10日(土曜日)です。関数の構文でセルの色が黄色になります。
関数やセルの書式設定で 基本的には A3:A9(日)の文字は赤 G3:G(土)の文字は青 別のセルの祝日一覧を配置しており 祝日の文字は赤(20日:春分の日)表示
本日(2012年3月10日<土>)セルは黄色(10日)になっています。
上記のようなカレンダをシート上に表示させ「図のリンク貼り付け」でシートの任意の ところに貼り付け,便利に使わせて頂いています。 今日の質問ですが、このカレンダを「図のリンク貼り付け」の状態をユーザーホーム上に表示したいと思い質問させて頂きました。 まず、出来るか否かですが、出来るのでしたらどのようにすればいいかを教えて頂け ないでしょうか。 どうしても表示の整形がうまくいきません。見にくくてすみませ んが よろしくお願いします。
ユーザーフォーム上に、指定領域のセルを指定して「図としてリンク貼付」を行うことはできない(と思う)ので あくまで、その時点での状態を取り込むことでよければ以下のような方法が考えられる。 実際には、ユーザーフォーム表示中にカレンダーがかわるということはないと思うので、それで充分のような気がする。
1.通常の図として取り込む 2.シート上のカレンダー領域の各セル(56セル)を、ユーザーフォーム上のLabelコントロールに色書式も考慮して転記。 56個のラベルをデザインで配置しておくことが面倒ならコード内で8行、7列のラベルを自動生成することもできる。
上記、いずれも、必要なら、ユーザーフォームにコマンドボタンを配置して、再取り込みをさせることもできる。
(ぶらっと)
あまり使用するメリットはありませんが >このカレンダを「図のリンク貼り付け」の状態 表示だけで良いのなら(古すぎて知らないかもしれないが)ダイアログシート なら貼り付け可能です。 (PON)
画像として取り込む方法は、(PON)さんのコメント、私のコメントなど、いくつか方法があるけど 「遊び」で、私のコメントの2.を。 カラッポのユーザーフォームを用意して、そのユーザーフォームモジュールに以下を。 このフォームがモードレス表示されていて、ユーザーフォーム表示中にカレンダー領域の内容が変更された場合に その変更の状態を再度取り込む必要があれば、ユーザーフォームの「セル枠以外のところ」をクリック。
Private Sub UserForm_Initialize()
Dim h As Double, w As Double, l As Double, t As Double
Dim i As Long, j As Long
h = Me.InsideHeight / 8
w = Me.InsideWidth / 7
For i = 1 To 8
l = 0
For j = 1 To 7
With Me.Controls.Add("Forms.Label.1", "lbl_" & i & "_" & j)
.Left = l: .Top = t: .Width = w: .Height = h
l = l + w
.SpecialEffect = fmSpecialEffectSunken
.TextAlign = fmTextAlignCenter
End With
Next
t = t + h
Next
Call ReMake
End Sub
Private Sub UserForm_Click()
Call ReMake
End Sub
Sub ReMake()
Dim h As Double, w As Double, l As Double, t As Double
Dim i As Long, j As Long
Dim myStr As String
Dim myBColor As Long
Dim myFColor As Long
For i = 1 To 8
For j = 1 To 7
With Sheets("Sheet1").Cells(i, j)
myStr = .Text
myBColor = .Interior.Color
myFColor = .Font.Color
End With
With Me.Controls("lbl_" & i & "_" & j)
If Len(myStr) = 0 Then
.Visible = False
Else
.Visible = True
.BackColor = myBColor
.ForeColor = myFColor
.Caption = myStr
End If
End With
Next
Next
End Sub
(ぶらっと)
もし、そのユーザーフォームにほかのものもあって、「カレンダーも」表示させるのなら、 Frame1を、カレンダーを表示させたい場所に配置して以下。 なお、再取り込みはCommandButton1を押して実行。
Private Sub UserForm_Initialize()
Dim h As Double, w As Double, l As Double, t As Double
Dim i As Long, j As Long
With Me.Frame1
h = .InsideHeight / 8
w = .InsideWidth / 7
.Caption = ""
End With
CommandButton1.Caption = "最新の状態を反映"
For i = 1 To 8
l = 0
For j = 1 To 7
With Me.Frame1.Add("Forms.Label.1", "lbl_" & i & "_" & j)
.Left = l: .Top = t: .Width = w: .Height = h
l = l + w
.SpecialEffect = fmSpecialEffectSunken
.TextAlign = fmTextAlignCenter
End With
Next
t = t + h
Next
Call ReMake
End Sub
Private Sub CommandButton1_Click()
ReMake
End Sub
Sub ReMake()
Dim h As Double, w As Double, l As Double, t As Double
Dim i As Long, j As Long
Dim myStr As String
Dim myBColor As Long
Dim myFColor As Long
For i = 1 To 8
For j = 1 To 7
With Sheets("Sheet1").Cells(i, j)
myStr = .Text
myBColor = .Interior.Color
myFColor = .Font.Color
End With
With Me.Controls("lbl_" & i & "_" & j)
If Len(myStr) = 0 Then
.Visible = False
Else
.Visible = True
.BackColor = myBColor
.ForeColor = myFColor
.Caption = myStr
End If
End With
Next
Next
End Sub
(ぶらっと)
そのほか、ListViewコントロールを使う方法もあるし、また2003までなら、SpreadSheetコントロールを使う方法もあるね。
(ぶらっと)
ぶらっとさん、PONさん。 ご支援頂きありがとうございます。 教えて頂いた方法、具体的にどうすればいいのかわかりませんので もう少し、自分で確認してから再度質問させて頂きます。 とりあえず、お礼だけですすが、きありがとうございました。 (唯一無二)11日11:45
図形としてユーザーフォームに貼り付ける方法です。 ユーザーフォームを一つ用意してください(UserForm1)。 コントロールは、コードで配置しますから、何も配置しないでください。
では、コードです。
標準モジュールに
Sub 図の表示()
Const Graghfl = "graph.gif"
Dim pic As Object
Dim rng As Range
Set rng = Range("A1:G7")
With ActiveSheet.ChartObjects.Add(100, 100, rng.Width, rng.Height)
.Activate
.Chart.ChartArea.Border.LineStyle = 0
.Chart.ChartArea.ClearContents
.Chart.ChartArea.Select
rng.Copy
Set pic = .Chart.Pictures.Paste
pic.Width = .Width
pic.Height = .Height
.Height = pic.Height + (.Chart.ChartArea.Top) * 2
.Width = pic.Width + (.Chart.ChartArea.Left) * 2
.Chart.Export ThisWorkbook.Path & "\" & Graghfl
.Delete
End With
With UserForm1
.imgpath = ThisWorkbook.Path & "\" & Graghfl
.imgwidth = rng.Width
.imgheight = rng.Height
.imginst
.Width = rng.Width + 10
.Height = rng.Height + 200
.Show vbModeless
End With
Kill ThisWorkbook.Path & "\" & Graghfl
End Sub
UserForm1のモジュールに
'=============================================
Option Explicit
Public imgpath As Variant
Public imgwidth As Single
Public imgheight As Single
Sub imginst()
On Error Resume Next
Dim img1 As Control
Set img1 = Controls("image1")
If Err.Number <> 0 Then
Set img1 = Controls.Add("Forms.Image.1", "image1", True)
End If
On Error GoTo 0
With img1
.Picture = LoadPicture(imgpath)
.Left = 0
.Top = 0
.Width = imgwidth
.Height = imgheight
End With
End Sub
アクティブシートのA1:G7にカレンダーがあるとします。
尚、ThisWorkbook.Path を使っていますから、一度保存してから、 実行してみてください。
APIを使えば、ファイルを介さなくても可能ですが、こっちの方が 簡単なので今回は、ファイルを介しました。
ichinose@グラフィックフィルタが壊れてた、コードを書いて試してよかった
他の板で恐縮ですが、API部分は↓の藤代千尋さんの最後のレスのコードをそのまま利用 http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200901/09010018.txt
長いけどAPI部分は、そのままコピペして使い回せるので、実は楽ちん。 最後のPrivate Sub UserForm_Initialize()を適当にアレンジして使用して下さい。
Option Explicit
Private Const CF_METAFILEPICT = 3
Private Const CF_ENHMETAFILE = 14
Private Declare Function OpenClipboard Lib "user32.dll" _
(ByVal hWnd As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" _
(ByVal wFormat As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" _
(ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" _
(ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
Private Declare Function DeleteEnhMetaFile Lib "gdi32" _
(ByVal hemf As Long) As Long
Private Const vbPicTypeEMetafile = 4
Private Type TPICTDESC
cbSizeofStruct As Long
picType As Long
hImage As Long
Option1 As Long
Option2 As Long
End Type
Private Type TGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(1 To 8) As Byte
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(lpPictDesc As TPICTDESC, _
RefIID As TGUID, _
ByVal fPictureOwnsHandle As Long, _
ByRef IPic As stdole.IPictureDisp) As Long
Public Function Clipboard_GetMetafile() As stdole.IPictureDisp
Dim hemf As Long
Dim TPICTDESC As TPICTDESC
Dim TGUID As TGUID
Set Clipboard_GetMetafile = Nothing
If IsClipboardFormatAvailable(CF_ENHMETAFILE) = False Then Exit Function
If OpenClipboard(CLng(0)) = False Then Exit Function
hemf = GetClipboardData(CF_ENHMETAFILE)
If hemf = 0 Then
Call CloseClipboard
Exit Function
End If
hemf = CopyEnhMetaFile(hemf, vbNullString)
Call CloseClipboard
If hemf = 0 Then Exit Function
With TPICTDESC
.cbSizeofStruct = Len(TPICTDESC)
.picType = vbPicTypeEMetafile
.hImage = hemf
End With
With TGUID
.Data1 = &H7BF80981
.Data2 = &HBF32
.Data3 = &H101A
.Data4(1) = &H8B
.Data4(2) = &HBB
.Data4(3) = &H0
.Data4(4) = &HAA
.Data4(5) = &H0
.Data4(6) = &H30
.Data4(7) = &HC
.Data4(8) = &HAB
End With
Call OleCreatePictureIndirect(TPICTDESC, TGUID, True, Clipboard_GetMetafile)
End Function
'********以下を必要に応じて修正する******************
Private Sub UserForm_Initialize()
Sheets("Sheet1").Range("A1:G7").CopyPicture _
Appearance:=xlScreen, Format:=xlPicture
Picture = Clipboard_GetMetafile()
PictureSizeMode = 3 '1:fmPictureSizeModeStretch, 3:fmPictureSizeModeZoom
End Sub
こんばんは (UO3)です。 (HNは、この場所でよかったですか?) いつも、楽しく拝見しています。
私からも、過去にエキスパートさんから教えていただいたコードをアップさせていただこうとしましたら (マナ)さんから、ほぼ同じ運びのものがアップされていました。 記憶では、私のものは、藤代千尋さんではなく(藤代千尋さんにも、常日頃ご指導いただいていますが) 別の方からのご指導でしたけど。
ユーザーフォームにImage11を配置してください。 シートのA1:G8がカレンダー領域のようですので、その領域をイメージにして取り込みます。 (マナ)さんのコードと同じく、Image1の大きさに合わせてZoomしていますので、見栄えがいいように、Image1の大きさは、調整願います。
ユーザーフォームモジュールに以下を貼り付けてお試しください。
Option Explicit
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type UPICDESC
Size As Long
Type As Long
hPic As Long
hPal As Long
Reserved As Long
End Type
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (picdesc As UPICDESC, RefIID As GUID, ByVal fPictureOwnsHandle As Long, ipic As IPicture) As Long
Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
Private Declare Function DeleteEnhMetaFile Lib "gdi32" (ByVal hmf As Long) As Long
Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As Long
Private Declare Function CopyImage Lib "user32" (ByVal Handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Const CF_ENHMETAFILE = 14
Const PICTYPE_ENHMETAFILE = 4
Const CF_BITMAP = 2 '=xlBitmap
Const PICTYPE_BITMAP = 1
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = 4
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Sub UserForm_Initialize()
Dim im As Object
Dim h As Long
Dim w As Long
Sheets("Sheet1").Range("A1:G8").CopyPicture 'シート名は実際のものに変更願います
With Image1
.PictureSizeMode = fmPictureSizeModeZoom
Set .Picture = GetPicture(xlPicture)
End With
End Sub
Private Function GetPicture(ByVal Format As XlCopyPictureFormat) As IPicture
Dim Handle&, desc As UPICDESC, id As GUID
If OpenClipboard(0&) > 0 Then
If Format = xlBitmap Then
Handle = CopyImage(GetClipboardData(CF_BITMAP), IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Else
Handle = CopyEnhMetaFile(GetClipboardData(CF_ENHMETAFILE), vbNullString)
End If
CloseClipboard
End If
If Handle = 0 Then Exit Function 'イメージ取得失敗
IIDFromString StrConv("{7BF80981-BF32-101A-8BBB-00AA00300CAB}", vbUnicode), id
With desc
.Size = Len(desc)
.Type = IIf(Format = xlBitmap, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE)
.hPic = Handle
End With
'Pictureオブジェクトを作成
OleCreatePictureIndirect desc, id, 1, GetPicture
If GetPicture Is Nothing Then
If Format = xlBitmap Then DeleteObject Handle Else DeleteEnhMetaFile Handle
End If
End Function
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.