[[20170107182627]] 『オブジェクトを操作する』(右近) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オブジェクトを操作する』(右近)

こんばんは。
データを作成する中で、一つ教えて頂きたいことがあり、質問させて頂きませ。

以下のように請求者と承認者の欄に、リストから選択すると、予め登録しておいたオブジェクトを挿入したいと考えておりますが、よろしくお願いします。

    C        D
1  請求   承認
2  山田   右近
3  山田   右近
4  山田   右近

C列、D列それぞれ同一の名前になります。
リストは、C列は山田、D列は右近を選択します。
オブジェクトは、印鑑形式としてますので、縦書きを円で囲んだものを考えております。
何卒よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 直接の回答ではありません。
 参考HPです。

 Office TANAKA - Excel(自動的に画像を切り替える)
http://www.officetanaka.net/excel/function/tips/tips14.htm

 Excel一般機能:画像の検索ページを作る
http://www.geocities.jp/chiquilin_site/data/050530_search.html
(カリーニン) 2017/01/07(土) 19:28

早速のご回答ありがとうございます。
リストのセルそのものに画像を挿入したいのです。
しかも、リストを選ぶ前は空欄としたいのです。
良きお知恵をお願いいたします。
(右近) 2017/01/07(土) 19:46

 このテーマを解決する方法としては、紐付いた画像を挿入するということも、もちろんありうるわけですが
 カリーニンさんが参考提示されたページのアイデア、こういった手法も、有効な方法だと思いますよ。

 方式にこだわらず、いろんんなやり方を検討することは、よりよい解決方法の模索というか、解決に至る
 早道 になるかもしれません。

 まぁ、それはさておき。

 >>リストから選択すると

 このリストとは? 入力規則でしょうか?

 >>C列、D列それぞれ同一の名前になります。

 いつも 請求者が 山田、承認者が 右近 ということですか?

 >>予め登録しておいたオブジェクトを挿入したい

 その、あらかじめ登録しておいたオブジェクト なるものは、どこに、どんな形で存在するのですか?
 また、挿入する場所と大きさは? 該当のセルの中央に、すっぽりと入るぐらいの場所と大きさと考えていいのですか?

 >>良きお知恵をお願いいたします。

 良き知恵とは?
 アイデアを提示すればいいのですか?

(β) 2017/01/07(土) 22:29


リストから選択すると
 このリストとは? 入力規則でしょうか?

はい、入力規則のリストです。

 >>C列、D列それぞれ同一の名前になります。

 いつも 請求者が 山田、承認者が 右近 ということですか?

はい、そうです。一つ完成すれば、請求者が代わったとしても流用できるのかと思います。

 >>予め登録しておいたオブジェクトを挿入したい

 その、あらかじめ登録しておいたオブジェクト なるものは、どこに、どんな形で存在するのですか?
 また、挿入する場所と大きさは? 該当のセルの中央に、すっぽりと入るぐらいの場所と大きさと考えていいのですか?

現状は、同一シート内に一つずつ作っています。
列幅3.8程度、行の高さ29程度に若干余裕をもってセルの中央にすっぽり入る程度で考えています。

 >>良きお知恵をお願いいたします。
 良き知恵とは?
 アイデアを提示すればいいのですか?

なかなか行き詰ってまして、よろしくお願いします。
(右近) 2017/01/07(土) 22:44


 >>なかなか行き詰ってまして、よろしくお願いします。 

 カリーニンさんの紹介URLの方式は、なぜ NG だったのでしょうか?
 数式等を中心にして処理するなら、紹介ページにあった方式がベストというか、それ以外では困難でしょう。

 これがNGということは、マクロで対応したいということでしょうか?

 あるいは、ネットを検索すると、印鑑押印のフリーアドインがたくさんありますが、そういったものを
 使いたいということでしょうか?

 >>一つ完成すれば、請求者が代わったとしても流用できるのかと思います。 

 まだイメージがつかめません。 
 本当に 1つのシートでは、絶対に、請求者と承認者は1人ずつでしょうか?
 行によって 請求者が 山田 であったり 鈴木 であったり、そういうことは絶対にないということですか?

 絶対に1名しかいないということなら、なぜ 『リストから選択』するのですか?

(β) 2017/01/08(日) 01:38


>以下のように請求者と承認者の欄に、リストから選択すると、
>予め登録しておいたオブジェクトを挿入したいと考えておりますが、よろしくお願いします。
誰でもいつでもどれでも選択できるようにして、
何の意味があるのですか?

かといって代案は無いのですが・・・^^;

フリーの印鑑のアドインを導入に1票

(まっつわん) 2017/01/08(日) 08:18


 申請者が申請して、承認者が承認を行うという、いわゆる【ワークフロー】のようなものを考えているのでしょうか?

 もしそうなら、印鑑云々ではなく、本当に【ワークフロー管理】をするというのがよろしいのでは?

 『無償 ワークフローソフト』あたりで検索すると、無料で使えるソフトがいくつも見つかります。

 カリーニンさん紹介のページの方式、名前列と印鑑列をわければ、使えると思うのですが、
 名前選択前は空白にしておきたいというところがネックでしょうかね?

 仮に、ゴリゴリ VBA で対応するとすれば。

 まず、シートのどこかにある印鑑群の名前を、リストから選ぶ名前と同じにしておきます。

 で、シートモジュールに。
 リストから選んだ名前の印鑑がなかった場合のエラー対応はしていません。

 しかし・・・・

 こんなことをしても、まっつわんさん指摘通り、だれでも、どの名前でも選択できるわけで
 ということは、他人の印鑑おしまくり可能。

 こういった管理に何の意味があるのかなぁ・・・・????

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Dim c As Range
    Dim spN As String
    Dim spO As String

    Set r = Intersect(Target, Columns("C:D"))
    If r Is Nothing Then Exit Sub

    For Each c In r
        spN = "sp_" & c.Address(False, False)
        spO = c.Value
        On Error Resume Next
        Shapes(spN).Delete
        On Error GoTo 0
        If Not IsEmpty(c) Then
            With Shapes(spO).Duplicate
                .Name = spN
                .Left = c.Left + c.Width / 2 - .Width / 2
                .Top = c.Top + c.Height / 2 - .Height / 2
            End With
        End If
    Next

 End Sub

(β) 2017/01/08(日) 08:28


 >>カリーニンさんの紹介URLの方式は、なぜ NG だったのでしょうか?
 数式等を中心にして処理するなら、紹介ページにあった方式がベストというか、それ以外では困難でしょう。
 これがNGということは、マクロで対応したいということでしょうか?
 あるいは、ネットを検索すると、印鑑押印のフリーアドインがたくさんありますが、そういったものを
 使いたいということでしょうか?

NGということでありません。マクロ・・・これという自分のビジョンをもてていません。申し訳ありません。
フリーアドインも使ってはみました。電子印鑑というものでした。

 >>まだイメージがつかめません。 
 本当に 1つのシートでは、絶対に、請求者と承認者は1人ずつでしょうか?
 行によって 請求者が 山田 であったり 鈴木 であったり、そういうことは絶対にないということですか?
 絶対に1名しかいないということなら、なぜ 『リストから選択』するのですか?

はい、1つのシートで請求者と承認者は1人ずつになります。
必ずしもリストでないといけないわけではありませんが、オブジェクトを挿入したいセルにオブジェクトを呼び出すための何らかの入力をする必要があるため、入力内容はすべて同じでよいので、リストが良いのかと思っただけです。

申請者が申請して、承認者が承認を行うという、いわゆる【ワークフロー】のようなものを考えているのでしょうか?

 >>もしそうなら、印鑑云々ではなく、本当に【ワークフロー管理】をするというのがよろしいのでは?
ワークフロー管理・・・

現状は、印鑑のようなオブジェクトを作成して、そのセルに必要な場合にコピーして使用しているのですが、できれば、オブジェクトそのものではなく、オブジェクトをセルごとコピーしたいのですが、その場合どうしてもオブジェクトを選択してしまいます。これをオブジェクトを選択させず、セルをフィルさせてコピーする方法はありますでしょうか?保護をかけて、セルの書式設定オン、オブジェクトの編集オフではフィルしてもコピーされません。この状態でオブジェクトもコピーすることができればとは思うのですが・・・

(右近) 2017/01/08(日) 09:29


横から失礼します。
 
 > オブジェクトの編集オフではフィルしてもコピーされません。
 > この状態でオブジェクトもコピーすることができればとは思うのですが・・・ 
それは無理です。
オブジェクトの編集を認めていないのですから。
 
ところで、承認行為自体は誰でも可能なんですか?
セキュリティとかはどのように整理されているのですか?
 

(γ) 2017/01/08(日) 09:40


 う〜ん・・・・・

 皆さんが指摘されている、権限の問題に対して、全く検討されていないですねぇ・・・

 何かをどのように管理したい という 『要件』があって、その要件を満たすための方式、『仕様』を考える。
 もしかしたら、その仕様は要件を満たす上で、不備があるかもしれない、間違っているかもしれない。

 でも、肝心の『要件』の説明はなく、あくまで右近さんが考えた『仕様』のみが(しかも、ぼんやりと)提示されて
 テクニックとしてどうしたらいいかという質問になっています。

 こういった状況ではお手伝いをしようとしても空回りになるだけですので、 しばらくROMに回ります。

(β) 2017/01/08(日) 09:52


>現状は、印鑑のようなオブジェクトを作成して、
>そのセルに必要な場合にコピーして使用しているのですが、
>できれば、オブジェクトそのものではなく、オブジェクトをセルごとコピーしたい
あぁ、値でもいいけど、
雰囲気として「印鑑っぽい見た目だといいな♪」ということですか。

また、なにか思いつけば書きます。

(まっつわん) 2017/01/08(日) 10:50


>現状は、印鑑のようなオブジェクトを作成して、そのセルに必要な場合にコピーして
>使用しているのですが、できれば、オブジェクトそのものではなく、
>オブジェクトをセルごとコピーしたいのですが、その場合どうしてもオブジェクトを選択して
>しまいます。これをオブジェクトを選択させず、セルをフィルさせてコピーする方法は
>ありますでしょうか?保護をかけて、セルの書式設定オン、オブジェクトの編集オフでは
>フィルしてもコピーされません。この状態でオブジェクトもコピーすることが
>できればとは思うのですが・・・

つまり、如何にして手数や操作を少なくして図形のコピペをするか
というのがテーマですよね。

コピーしたい図形をクリック
 ↓
コピーした図形がマウスカーソルに追随
 ↓
貼り付けたい位置でもう一回クリック
 ↓
そこに貼りつく

というような挙動を作ってみました。

Ctrlキーを押しながらドラッグするのと大差ないうえに、
バグがあるかも知れないので、自己責任でテストしてください。

(まっつわん) 2017/01/10(火) 12:11


あぁ、コード貼ってなかった^^;

Option Explicit

Private Type POINTAPI

    x As Long
    y As Long
End Type

Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long

Private mFlg As Boolean

Sub Shapeをマウスカーソル位置にセット()

    Dim rngTopLeft As Range
    Dim shpTarget As Shape
    Dim MoP As POINTAPI
    Dim x1 As Long, y1 As Long

    If mFlg Then
        mFlg = False
        Exit Sub
    End If

    mFlg = True
    With ActiveSheet.Shapes(Application.Caller)
        .Copy
        .Parent.Paste .TopLeftCell
    End With
    ActiveCell.Select
    Set shpTarget = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
    Set rngTopLeft = ActiveWindow.VisibleRange.Range("A1")
    y1 = ActiveWindow.PointsToScreenPixelsY((rngTopLeft.Top) * 96 / 72)
    x1 = ActiveWindow.PointsToScreenPixelsX((rngTopLeft.Left) * 96 / 72)

    Do While mFlg = True
        DoEvents
        Sleep 3

        Call GetCursorPos(MoP)
        With shpTarget
            .Top = (MoP.y - y1) * 72 / 96 + rngTopLeft.Top - .Height + 15
            .Left = (MoP.x - x1) * 72 / 96 + rngTopLeft.Left - .Width + 10
        End With
    Loop
End Sub
(まっつわん) 2017/01/10(火) 12:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.