[[20180614113857]] 『図の挿入時、前回挿入写真の位置に戻りたい』(できそこないちゃん) ページの最後に飛ぶ

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

 

『図の挿入時、前回挿入写真の位置に戻りたい』(できそこないちゃん)

お世話になっております。
図(写真)の挿入時、たくさんの写真の中からプレビューで選んで挿入しているのですが、
挿入ボタンを押すたび、毎回毎回挿入元フォルダの一番上から選ぶことになってしまい、時間がかかります。
挿入ボタンを押すと、前回挿入した写真の位置にカーソルをもっていけたらスムーズなのですが
何か方法ありますでしょうか。

vbaのコードでもよいのですが、ご教授いただけたらと存じます。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Excel標準の「挿入」−「図」ならば、連続して作業する際は、前回のフォルダと同じ場所が表示されますよ?

もし、現状既にマクロで図形挿入しているならば、コードを見せてもらわないとです。
(???) 2018/06/14(木) 12:02


一度に、複数選んで挿入したらいいんじゃないんでしょうか?

(まっつわん) 2018/06/14(木) 12:19


???さん まっつわんさん
返信ありがとうございます。

今のコードは
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim filename As String
    If Target.Count <> 9 Then Exit Sub
    filename = Application.GetOpenFilename(Title:="写真を選択", MultiSelect:=False)
    On Error Resume Next
    If Dir(filename) <> "" Then
        Set myShape = ActiveSheet.Shapes.AddPicture( _
        filename:=filename, _
        LinkToFile:=False, _
        SaveWithDocument:=True, _
        Left:=Target.Left, _
        Top:=Target.Top, _
        Width:=Target.Width, _
        Height:=Target.Height)
    End If
    Target.Offset(, 1).Value = Split(filename, "\")(UBound(Split(filename, "\")) - 1)
End Sub

という感じです。
複数選択はしない使い方にしておりまして、、、。

フォルダは前回のフォルダが表示されますが
フォルダではなくてフォルダの中に入っている写真を
特大アイコンのプレビューにて選ぶ際、
たくさん写真があると毎回毎回そのフォルダプレビューのときに
前回選んだ画像の位置(上下カーソル)ではなくて一番上の画像からまた探しださなくてはならないので
前回選んだ画像の位置を記憶することはできないかなぁと思った次第です。

(できそこないちゃん) 2018/06/14(木) 13:05


GetOpenFilenameを使う以上無理です。

ぱっと思い浮かぶのは
1.エクスプローラからDragDropでパスを受け取る仕組みを作るとか
2.フォルダ内の写真全てを作業用シートに整列して貼り付けるマクロ(検索すると結構出てきます)とシート上に貼り付けられた写真の中からユーザーが選んだ写真をコピーしてくるマクロ
などが考えられます。

どっちにしろ結構大掛かりな仕掛けになりそうですね。
(名無し) 2018/06/14(木) 13:22


なるほど、ファイル指定の問題でしたか。 ダイアログ選択ならば、確かに、また開くと先頭のファイルから表示してしまいますね。 VB.NET等のListViewならば、エクスプローラ風の表示にしておいて、ダブルクリックで次々に画像選択すると…、なんてコーディングもできそうですが、ExcelのListViewではサムネイル表示できないし…。 かなり難しいでしょう。 VB.NETで作成して、Excelを外部オブジェクトとして開いて、これに選択画像を貼っていく、という方が簡単なくらいかと思います。

しかし、現状のコードを、複数選択可能にするだけなら即できますが、いかがでしょう?(ついでに、フォルダ名表示が9個あるのも無駄と思ったので、1つにしています。おそらく、セル連結していて問題無かったのでしょうけど)

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim filename As Variant
    Dim myShape As Object
    Dim i As Long

    If Target.Count <> 9 Then Exit Sub

    filename = Application.GetOpenFilename(Title:="写真を選択", MultiSelect:=True)
    If TypeName(filename) = "Variant()" Then
        For i = 1 To UBound(filename)
            Set myShape = ActiveSheet.Shapes.AddPicture( _
                filename:=filename(i), _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=Target.Left, _
                Top:=Target.Top + Target.Height * (i - 1), _
                Width:=Target.Width, _
                Height:=Target.Height)
            Cells(Target.Row + (i - 1) * 3, Target.Column + 3).Value = Split(filename(i), "\")(UBound(Split(filename(i), "\")) - 1)
        Next i
    End If
 End Sub
(???) 2018/06/14(木) 14:25

???さん

ありがとうございます。できました!!

>複数選択可能にするだけなら即できますが
意図を汲んでくださりありがとうございます
こういうことがしたかったのです!!!

ついでといっては大変おこがましいお願いではございますが、
この複数写真を挿入する際、写真と写真の間は一行空けたいのです。
その場合はどのようにしたらよろしいでしょうか。
おこがましくてすみません。

(できそこないちゃん) 2018/06/14(木) 14:57


1行空けるお手軽案ですが、Top:=Target.Top + Target.Height * 4 / 3 * (i - 1) に変えるとか。 同様に、フォルダ名は行位置を Target.Row + (i - 1) * 4 に変えれば良いですね。 または、いっそセルの行位置を先に計算するように変えるとか。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim filename As Variant
    Dim i As Long
    Dim iR As Long
    Dim vw As Variant

    If Target.Count <> 9 Then Exit Sub

    filename = Application.GetOpenFilename(Title:="写真を選択", MultiSelect:=True)
    If TypeName(filename) = "Variant()" Then
        For i = 1 To UBound(filename)
            iR = Target.Row + (i - 1) * 4
            ActiveSheet.Shapes.AddPicture _
                filename:=filename(i), _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=Target.Left, _
                Top:=Cells(iR, 1).Top, _
                Width:=Target.Width, _
                Height:=Target.Height
            vw = Split(filename(i), "\")
            Cells(iR, Target.Column + 3).Value = vw(UBound(vw) - 1)
        Next i
    End If
 End Sub
(???) 2018/06/14(木) 15:13

???先生、できました
たいへんありがとうございました
(できそこないちゃん) 2018/06/14(木) 15:32

たびたび失礼いたします。

画像選択時に、選んだ順で貼り付けたい場合のコードを考えています。
調べたところBubbleSort fName, Trueを消去すればよいとあったのですが
これに値するコードがどこかわかりません。

お時間あるときにご回答いただければ幸いです。
宜しくお願いします。
(できそこないちゃん) 2018/06/18(月) 16:52


選んだ順は、今のダイアログでは難しいと思います。 後ろから選んだとしても、返ってくる配列は表示上の並び順になってしまいますから。 コード上で、ダイアログ表示から戻ったところで止めてみて、ローカルウィンドウでfilenameの中身を確認してみてください。 なので、選択順にしたければ、ダイアログのようなものを自作するしかないでしょう。 諦めて、小分けして貼るのがよろしいかと。

そして、見つけた情報というのは、これですか? [[20150831074248]]
これは、得られたファイル名群をソートしていますが、昇順にするか降順にするか切り替えているのであり、非ソートにはできないかと。
(???) 2018/06/18(月) 17:31


選択時に順番を選ぶのは諦めて、貼り付けた後の画像を貼った行を簡単に入れ替えるためのマクロを別途作ったほうが簡単だと思いますよ。
(名無し) 2018/06/18(月) 17:38

コメント返信:

[ 一覧(最新更新順) ]


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