Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


185 / 3841 ページ ←次へ | 前へ→

【78753】Re:特定の文字列と特定の文字列の間にあ...
お礼  藁にもすがりたい者  - 17/1/13(金) 15:22 -

引用なし
パスワード
   ▼ウッシ さん:

すごいです…
望んでいた形になりました…!

説明不足の中、このようにコードを組んでいただき
本当にありがとうございます。

これで作業が格段に効率化できます。


>こんにちは
>
>Sub test()
>  Dim r As Range
>  Dim v As Variant
>  Dim e As Long
>  Dim s As Range
>  Dim t As Range
>  Dim a As Worksheet
>  Dim b As Worksheet
>  
>  Set a = Worksheets("Sheet1") 'データの有るシート
>  e = a.Range("B" & Rows.Count).End(xlUp).Row
>  If e < 7 Then Exit Sub
>  
>  Application.ScreenUpdating = False
>  For Each r In a.Range("B1:B" & e)
>    If IsNumeric(r) = False Then
>      If r <> "" Then
>        If r <> v Then
>          If IsEmpty(v) = False Then
>            Set t = r.Offset(-1)
>            Set b = Worksheets.Add(After:=ActiveSheet)
>            b.Name = v
>            a.Range(s, t).EntireRow.Copy b.Range("A1")
>            Set s = r
>          Else
>            Set s = r
>          End If
>          v = r.Value
>        Else
>          v = r.Value
>          If s Is Nothing Then
>            Set s = r
>          End If
>        End If
>      End If
>    End If
>  Next
>  
>  Set b = Worksheets.Add(After:=ActiveSheet)
>  b.Name = v
>  a.Range(s, a.Range("B" & e)).EntireRow.Copy b.Range("A1")
>  
>  Application.ScreenUpdating = True
>  
>End Sub
>
>こんな感じで動きますか?
>
>B列のデータが店名と数値で判別出来る事が前提です。
>
>▼藁にもすがりたい者 さん:
>>▼ウッシ さん:
>>
>>おはようございます。
>>説明が足りずすみません。
>>
>>店舗の一覧はなくできればコピーしたものを貼り付ける際に
>>マクロにて店舗名でシートを作成し、そのシートに貼付ができればと思っておりました。
>>
>>このような回答で大丈夫でしたでしょうか
>>
>>
>>>こんにちは
>>>
>>>店舗12店舗の一覧はどこかのシートに有りますか?
>>>
>>>マクロの中で記述しますか?
>>>
>>>
>>>▼藁にもすがりたい者 さん:
>>>>業務上、必要なデータがPDFで送られてくる為
>>>>データの加工ができずなんとか方法がないかと模索しています。
>>>>
>>>>PDFのデータをコピーしてエクセルに貼り付けた状態が以下のとおりです。
>>>>
>>>>    A    B   C   D   E   F   G   H   I
>>>> 1   文字
>>>> 2   文字
>>>> 3   文字
>>>> 4   文字
>>>> 5   数値
>>>> 6   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>>>> 7   数値  数値  数値  科目  金額 消費税
>>>> 8   数値  数値  数値  科目  金額 消費税
>>>> 9   数値  数値  数値  科目  金額 消費税
>>>>10   数値  数値  数値  科目  金額 消費税
>>>> .
>>>> .
>>>> .
>>>> .
>>>>50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>>>>51   数値  数値  数値  科目  金額 消費税
>>>>52   数値  数値  数値  科目  金額 消費税
>>>> .
>>>> .
>>>> .
>>>> .
>>>>90   数値  店名B  数値  数値  数値  数値  数値  数値  数値
>>>>91   数値  数値  数値  科目  金額 消費税
>>>>92   数値  数値  数値  科目  金額 消費税
>>>> .
>>>> .
>>>> .
>>>> .
>>>>
>>>>
>>>>やりたいことは店名Aと店名Bの間にある行をコピーして
>>>>店名Aのシートに貼り付けをしたいのです。
>>>>ただ、1店舗につきPDFが2〜3ページあり
>>>>上記のように店名Aが2ページあると店名Bまでに店名Aが2回出てきてしまい
>>>>これをマクロでどう処理すればよいかわからず…
>>>>また店舗は全部で12店舗あり、店名Lまであります。
>>>>
>>>>マクロについてもつい最近知った程度で
>>>>コードなど勉強中の身です…
>>>>ただ、この作業を効率化することが急務であり
>>>>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。
>>>>
>>>>どなたかお力添えを頂けないでしょうか…
・ツリー全体表示

【78752】Re:特定の文字列と特定の文字列の間にあ...
お礼  藁にもすがりたい者  - 17/1/13(金) 15:20 -

引用なし
パスワード
   ▼独覚 さん:

大変申し訳ございませんでした。
私としてはそのような意味はまったく含んでいなかったのですが
正しい日本語の使い方も再度しっかり学びたいと思います。

ご指摘頂きありがとうございました。


>▼藁にもすがりたい者 さん:
>>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。
>
>全く質問に関係ないところで済みませんが人に質問したり頼んだりする場合に「藁にもすがる」は言わないほうがいいですよ。
>
>「藁にもすがる」って「何の役にも立たないものにまで頼りにする」という意味なので
>そう言われると気を悪くする人もいますので。
・ツリー全体表示

【78751】Re:特定の文字列と特定の文字列の間にあ...
発言  β  - 17/1/13(金) 14:35 -

引用なし
パスワード
   ▼藁にもすがりたい者 さん:

元シート(コードでは "Sheet1") の店名ですが、
必ずしも、まとまって(固まって)出現しないというケースも想定しますと
以下にしておいたほうが安全ですね。

Sub Test2()
  Dim r As Range
  Dim a As Range
  Dim d As Range
  Dim i As Long
  Dim dic As Object
  Dim nm As String
  Dim pos As Range
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")
    Set r = .Range("B6", .Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants, xlNumbers)
    
    For Each a In r.Areas
      Set d = a.Offset(-1).Resize(a.Rows.Count + 1)
      nm = d(1).Value '店名
      If Not dic.exists(nm) Then '初めて出現?
        dic(nm) = True
        If Not IsObject(Evaluate(nm & "!A1")) Then 'シート無し?
          Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = nm
        End If
        With Sheets(nm)
          .Cells.ClearContents
          Set pos = .Range("A1")
        End With
      Else
        Set pos = Sheets(nm).Range("A" & Rows.Count).End(xlUp).Offset(1)
      End If
      d.EntireRow.Copy pos
    Next
    
  End With
End Sub
・ツリー全体表示

【78750】Re:特定の文字列と特定の文字列の間にあ...
発言  β  - 17/1/13(金) 14:16 -

引用なし
パスワード
   ▼藁にもすがりたい者 さん:

B列が店名なのか数値なのかの判断が必要ですが、店名は【文字列】、それ以外は数値という決めつけです。

Sub Test()
  Dim r As Range
  Dim a As Range
  Dim d As Range
  Dim i As Long
  Dim dic As Object
  Dim nm As String
  Dim pos As Range
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")
    Set r = .Range("B6", .Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants, xlNumbers)
    
    For Each a In r.Areas
      Set d = a.Offset(-1).Resize(a.Rows.Count + 1)
      nm = d(1).Value '店名
      If Not dic.exists(nm) Then '初めて出現?
        dic(nm) = True
        If Not IsObject(Evaluate(nm & "!A1")) Then 'シート無し?
          Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = nm
        End If
        With Sheets(nm)
          .Cells.ClearContents
          Set pos = .Range("A1")
        End With
      End If
      d.EntireRow.Copy pos
      Set pos = pos.Offset(d.Rows.Count)
    Next
    
  End With
End Sub
・ツリー全体表示

【78749】Re:特定の文字列と特定の文字列の間にあ...
発言  独覚  - 17/1/13(金) 11:08 -

引用なし
パスワード
   ▼藁にもすがりたい者 さん:
>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。

全く質問に関係ないところで済みませんが人に質問したり頼んだりする場合に「藁にもすがる」は言わないほうがいいですよ。

「藁にもすがる」って「何の役にも立たないものにまで頼りにする」という意味なので
そう言われると気を悪くする人もいますので。
・ツリー全体表示

【78748】Re:特定の文字列と特定の文字列の間にあ...
回答  ウッシ  - 17/1/13(金) 9:55 -

引用なし
パスワード
   こんにちは

Sub test()
  Dim r As Range
  Dim v As Variant
  Dim e As Long
  Dim s As Range
  Dim t As Range
  Dim a As Worksheet
  Dim b As Worksheet
  
  Set a = Worksheets("Sheet1") 'データの有るシート
  e = a.Range("B" & Rows.Count).End(xlUp).Row
  If e < 7 Then Exit Sub
  
  Application.ScreenUpdating = False
  For Each r In a.Range("B1:B" & e)
    If IsNumeric(r) = False Then
      If r <> "" Then
        If r <> v Then
          If IsEmpty(v) = False Then
            Set t = r.Offset(-1)
            Set b = Worksheets.Add(After:=ActiveSheet)
            b.Name = v
            a.Range(s, t).EntireRow.Copy b.Range("A1")
            Set s = r
          Else
            Set s = r
          End If
          v = r.Value
        Else
          v = r.Value
          If s Is Nothing Then
            Set s = r
          End If
        End If
      End If
    End If
  Next
  
  Set b = Worksheets.Add(After:=ActiveSheet)
  b.Name = v
  a.Range(s, a.Range("B" & e)).EntireRow.Copy b.Range("A1")
  
  Application.ScreenUpdating = True
  
End Sub

こんな感じで動きますか?

B列のデータが店名と数値で判別出来る事が前提です。

▼藁にもすがりたい者 さん:
>▼ウッシ さん:
>
>おはようございます。
>説明が足りずすみません。
>
>店舗の一覧はなくできればコピーしたものを貼り付ける際に
>マクロにて店舗名でシートを作成し、そのシートに貼付ができればと思っておりました。
>
>このような回答で大丈夫でしたでしょうか
>
>
>>こんにちは
>>
>>店舗12店舗の一覧はどこかのシートに有りますか?
>>
>>マクロの中で記述しますか?
>>
>>
>>▼藁にもすがりたい者 さん:
>>>業務上、必要なデータがPDFで送られてくる為
>>>データの加工ができずなんとか方法がないかと模索しています。
>>>
>>>PDFのデータをコピーしてエクセルに貼り付けた状態が以下のとおりです。
>>>
>>>    A    B   C   D   E   F   G   H   I
>>> 1   文字
>>> 2   文字
>>> 3   文字
>>> 4   文字
>>> 5   数値
>>> 6   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>>> 7   数値  数値  数値  科目  金額 消費税
>>> 8   数値  数値  数値  科目  金額 消費税
>>> 9   数値  数値  数値  科目  金額 消費税
>>>10   数値  数値  数値  科目  金額 消費税
>>> .
>>> .
>>> .
>>> .
>>>50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>>>51   数値  数値  数値  科目  金額 消費税
>>>52   数値  数値  数値  科目  金額 消費税
>>> .
>>> .
>>> .
>>> .
>>>90   数値  店名B  数値  数値  数値  数値  数値  数値  数値
>>>91   数値  数値  数値  科目  金額 消費税
>>>92   数値  数値  数値  科目  金額 消費税
>>> .
>>> .
>>> .
>>> .
>>>
>>>
>>>やりたいことは店名Aと店名Bの間にある行をコピーして
>>>店名Aのシートに貼り付けをしたいのです。
>>>ただ、1店舗につきPDFが2〜3ページあり
>>>上記のように店名Aが2ページあると店名Bまでに店名Aが2回出てきてしまい
>>>これをマクロでどう処理すればよいかわからず…
>>>また店舗は全部で12店舗あり、店名Lまであります。
>>>
>>>マクロについてもつい最近知った程度で
>>>コードなど勉強中の身です…
>>>ただ、この作業を効率化することが急務であり
>>>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。
>>>
>>>どなたかお力添えを頂けないでしょうか…
・ツリー全体表示

【78747】Re:特定の文字列と特定の文字列の間にあ...
回答  藁にもすがりたい者  - 17/1/13(金) 9:19 -

引用なし
パスワード
   ▼β さん:

なるほど…できあがりのイメージをお伝えしてませんでしたもんね…
すみません、なにぶん初めてこういうサイトにお世話になるため不慣れで…

出来上がりのイメージとしては
マクロを実行すると店名A〜店名Lまでのシートが作成され
それぞれのシートにデータが下記のように貼付けされていて欲しいです。


シート名:店名A
    A    B   C   D   E   F   G   H   I
1   数値  店名A  数値  数値  数値  数値  数値  数値  数値
2   数値  数値  数値  科目  金額 消費税
3   数値  数値  数値  科目  金額 消費税
4   数値  数値  数値  科目  金額 消費税
5   数値  数値  数値  科目  金額 消費税
6   数値  数値  数値  科目  金額 消費税
7   数値  数値  数値  科目  金額 消費税
8   数値  数値  数値  科目  金額 消費税
9   数値  数値  数値  科目  金額 消費税
10   数値  数値  数値  科目  金額 消費税
.
.
.
.
50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
51   数値  数値  数値  科目  金額 消費税
52   数値  数値  数値  科目  金額 消費税


ここまでできればあとは関数で必要な情報を抜き出せるので
なんとかここまでをマクロで作業できると非常にありがたいです。

不慣れでマクロもわかっていないような者ですが
こちらの方々のお力が借りられたら幸いでございます。

宜しくお願いいたします。


>▼藁にもすがりたい者 さん:
>
>なかなかレスがつきませんねぇ。
>
>元シートのレイアウトの提示はあるのですが、その結果の 店名A と 店名B の
>できあがりイメージも具体的なレイアウトとして提示されてはいかがでしょう。
>
>そうすると、回答がつきやすいと思います。
・ツリー全体表示

【78746】Re:特定の文字列と特定の文字列の間にあ...
回答  藁にもすがりたい者  - 17/1/13(金) 9:06 -

引用なし
パスワード
   ▼ウッシ さん:

おはようございます。
説明が足りずすみません。

店舗の一覧はなくできればコピーしたものを貼り付ける際に
マクロにて店舗名でシートを作成し、そのシートに貼付ができればと思っておりました。

このような回答で大丈夫でしたでしょうか


>こんにちは
>
>店舗12店舗の一覧はどこかのシートに有りますか?
>
>マクロの中で記述しますか?
>
>
>▼藁にもすがりたい者 さん:
>>業務上、必要なデータがPDFで送られてくる為
>>データの加工ができずなんとか方法がないかと模索しています。
>>
>>PDFのデータをコピーしてエクセルに貼り付けた状態が以下のとおりです。
>>
>>    A    B   C   D   E   F   G   H   I
>> 1   文字
>> 2   文字
>> 3   文字
>> 4   文字
>> 5   数値
>> 6   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>> 7   数値  数値  数値  科目  金額 消費税
>> 8   数値  数値  数値  科目  金額 消費税
>> 9   数値  数値  数値  科目  金額 消費税
>>10   数値  数値  数値  科目  金額 消費税
>> .
>> .
>> .
>> .
>>50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>>51   数値  数値  数値  科目  金額 消費税
>>52   数値  数値  数値  科目  金額 消費税
>> .
>> .
>> .
>> .
>>90   数値  店名B  数値  数値  数値  数値  数値  数値  数値
>>91   数値  数値  数値  科目  金額 消費税
>>92   数値  数値  数値  科目  金額 消費税
>> .
>> .
>> .
>> .
>>
>>
>>やりたいことは店名Aと店名Bの間にある行をコピーして
>>店名Aのシートに貼り付けをしたいのです。
>>ただ、1店舗につきPDFが2〜3ページあり
>>上記のように店名Aが2ページあると店名Bまでに店名Aが2回出てきてしまい
>>これをマクロでどう処理すればよいかわからず…
>>また店舗は全部で12店舗あり、店名Lまであります。
>>
>>マクロについてもつい最近知った程度で
>>コードなど勉強中の身です…
>>ただ、この作業を効率化することが急務であり
>>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。
>>
>>どなたかお力添えを頂けないでしょうか…
・ツリー全体表示

【78745】Re:特定の文字列と特定の文字列の間にあ...
発言  β  - 17/1/13(金) 8:56 -

引用なし
パスワード
   ▼藁にもすがりたい者 さん:

なかなかレスがつきませんねぇ。

元シートのレイアウトの提示はあるのですが、その結果の 店名A と 店名B の
できあがりイメージも具体的なレイアウトとして提示されてはいかがでしょう。

そうすると、回答がつきやすいと思います。
・ツリー全体表示

【78744】Re:特定の文字列と特定の文字列の間にあ...
質問  ウッシ  - 17/1/13(金) 8:55 -

引用なし
パスワード
   こんにちは

店舗12店舗の一覧はどこかのシートに有りますか?

マクロの中で記述しますか?


▼藁にもすがりたい者 さん:
>業務上、必要なデータがPDFで送られてくる為
>データの加工ができずなんとか方法がないかと模索しています。
>
>PDFのデータをコピーしてエクセルに貼り付けた状態が以下のとおりです。
>
>    A    B   C   D   E   F   G   H   I
> 1   文字
> 2   文字
> 3   文字
> 4   文字
> 5   数値
> 6   数値  店名A  数値  数値  数値  数値  数値  数値  数値
> 7   数値  数値  数値  科目  金額 消費税
> 8   数値  数値  数値  科目  金額 消費税
> 9   数値  数値  数値  科目  金額 消費税
>10   数値  数値  数値  科目  金額 消費税
> .
> .
> .
> .
>50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
>51   数値  数値  数値  科目  金額 消費税
>52   数値  数値  数値  科目  金額 消費税
> .
> .
> .
> .
>90   数値  店名B  数値  数値  数値  数値  数値  数値  数値
>91   数値  数値  数値  科目  金額 消費税
>92   数値  数値  数値  科目  金額 消費税
> .
> .
> .
> .
>
>
>やりたいことは店名Aと店名Bの間にある行をコピーして
>店名Aのシートに貼り付けをしたいのです。
>ただ、1店舗につきPDFが2〜3ページあり
>上記のように店名Aが2ページあると店名Bまでに店名Aが2回出てきてしまい
>これをマクロでどう処理すればよいかわからず…
>また店舗は全部で12店舗あり、店名Lまであります。
>
>マクロについてもつい最近知った程度で
>コードなど勉強中の身です…
>ただ、この作業を効率化することが急務であり
>今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。
>
>どなたかお力添えを頂けないでしょうか…
・ツリー全体表示

【78743】特定の文字列と特定の文字列の間にある行...
質問  藁にもすがりたい者  - 17/1/12(木) 11:50 -

引用なし
パスワード
   業務上、必要なデータがPDFで送られてくる為
データの加工ができずなんとか方法がないかと模索しています。

PDFのデータをコピーしてエクセルに貼り付けた状態が以下のとおりです。

    A    B   C   D   E   F   G   H   I
1   文字
2   文字
3   文字
4   文字
5   数値
6   数値  店名A  数値  数値  数値  数値  数値  数値  数値
7   数値  数値  数値  科目  金額 消費税
8   数値  数値  数値  科目  金額 消費税
9   数値  数値  数値  科目  金額 消費税
10   数値  数値  数値  科目  金額 消費税
.
.
.
.
50   数値  店名A  数値  数値  数値  数値  数値  数値  数値
51   数値  数値  数値  科目  金額 消費税
52   数値  数値  数値  科目  金額 消費税
.
.
.
.
90   数値  店名B  数値  数値  数値  数値  数値  数値  数値
91   数値  数値  数値  科目  金額 消費税
92   数値  数値  数値  科目  金額 消費税
.
.
.
.


やりたいことは店名Aと店名Bの間にある行をコピーして
店名Aのシートに貼り付けをしたいのです。
ただ、1店舗につきPDFが2〜3ページあり
上記のように店名Aが2ページあると店名Bまでに店名Aが2回出てきてしまい
これをマクロでどう処理すればよいかわからず…
また店舗は全部で12店舗あり、店名Lまであります。

マクロについてもつい最近知った程度で
コードなど勉強中の身です…
ただ、この作業を効率化することが急務であり
今回、こちらのサイトにたどり着き、藁にもすがる思いでございます。

どなたかお力添えを頂けないでしょうか…
・ツリー全体表示

【78742】Re:ファルダ内の画像を任意のセルに貼り...
お礼  VBA勉強中  - 17/1/12(木) 10:00 -

引用なし
パスワード
   ▼β さん:
無事、当初予定していた意図で動きました!
ありがとうございました!
・ツリー全体表示

【78741】Re:ファルダ内の画像を任意のセルに貼り...
発言  β  - 17/1/11(水) 17:32 -

引用なし
パスワード
   ▼VBA勉強中 さん:

ごめんなさい。

画像ファイル名は 2つの値を - 連結させるんでしたね。
いつの間にか、そこを忘れていました。

fName = Right(Pos(1).Value, 3) & Pos.Offset(1).Value & ".jpg"

これを

fName = Right(Pos(1).Value, 3) & "-" & Pos.Offset(1).Value & ".jpg"

に変更してください。
・ツリー全体表示

【78740】Re:ファルダ内の画像を任意のセルに貼り...
お礼  VBA勉強中  - 17/1/11(水) 17:23 -

引用なし
パスワード
   ▼β さん:
追記です
>    fName = Right(Pos(1).Value, 3) & Pos.Offset(1).Value & ".jpg"
ここを、
fName = Right(Pos(1).Value, 3) & "-" & Pos.Offset(1).Value & ".jpg"
に変更したところ挿入されました。
ありがとうございます!
試しに写真10枚でやってみたところ問題なく作用したようです!
本当に今日はありがとうございました!


>▼VBA勉強中 さん:
>
>セルの関係がちょっとわかりにくくなりました。
>
>実際と異なれば、適宜、数字を調整してください。
>
>Sub Test2()
>  Dim posRow As Long
>  Dim posCol As Long
>  Dim Pos As Range
>  Dim fPath As String
>  Dim fName As String
>  Dim Target As Range
>  Dim dic As Object
>  Dim cnt As Long
>  Dim sh1 As Worksheet
>  
>  Set sh1 = Sheets("Sheet1") '★対象シート
>  sh1.Pictures.Delete
>  
>  posRow = 5 '5行目
>  posCol = 4 'D列
>  Set Pos = sh1.Cells(posRow, posCol).MergeArea '最初の参照セルはD5から始まる結合セル
>  
>  Set dic = CreateObject("Scripting.Dictionary")
>  fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\画像フォルダ\" '★
>  
>  Do While Not IsEmpty(Pos)
>    fName = Right(Pos(1).Value, 3) & Pos.Offset(1).Value & ".jpg"
>    fName = Dir(fPath & fName)
>    If fName <> "" Then
>      If Not dic.exists(fName) Then
>        dic(fName) = True
>        Set Target = Pos.Offset(, 2).MergeArea
>        With ActiveSheet.Shapes.AddPicture(Filename:=fPath & fName, LinkToFile:=False, _
>          SaveWithDocument:=True, Left:=Target.Left, Top:=Target.Top, _
>          Width:=-1, Height:=-1)   '-1 元の大きさで貼り付け
>          '===============タテヨコの縮尺を保持して拡大または縮小
>          .LockAspectRatio = True   '縦横比率の維持(念のため)
>          .Width = Target.Width * 0.9
>          If .Height > Target.Height * 0.9 Then .Height = Target.Height * 0.9
>          '===============中央へ調整
>          .Top = Target.Top + Target.Height / 2 - .Height / 2
>          .Left = Target.Left + Target.Width / 2 - .Width / 2
>        End With
>      End If
>    End If
>    
>    '次の参照セル
>    If Pos.Column = 4 Then 'D列
>      posCol = 15 'O列
>      cnt = cnt + 1
>    Else
>      If cnt Mod 2 = 0 Then
>        posRow = posRow + 22
>      Else
>        posRow = posRow + 17
>      End If
>      posCol = 4  'D列
>    End If
>    
>    Set Pos = sh1.Cells(posRow, posCol).MergeArea
>  
>  Loop
>  
>End Sub
・ツリー全体表示

【78739】Re:ファルダ内の画像を任意のセルに貼り...
発言  VBA勉強中  - 17/1/11(水) 15:58 -

引用なし
パスワード
   ▼β さん:
ありがとうございます!
読みやすい上にコメントがついているので理解しやすいです
実行してみましたがやはり画像が消えるのみで挿入はされませんでした。

>    fName = Right(Pos(1).Value, 3) & Pos.Offset(1).Value & ".jpg"
pos(1)ですが(1)とはなにを意味するのでしょうか、宣言した変数の最初の1個だから(1)…ということですか?
また、確かにデスクトップ上に"画像フォルダ"を作りそこに画像が入っているのですが挿入されない状態です。一応画像フォルダのプロパティを見てみたら、
C:\Users\*****\Desktop となっていました。tが小文字なのが原因なのかなと思いつつ修正してみましたが変化はありませんでした。

私の言葉足らずのために迷惑をかけてしまって本当にすみません…
・ツリー全体表示

【78738】Re:ファルダ内の画像を任意のセルに貼り...
発言  β  - 17/1/11(水) 15:25 -

引用なし
パスワード
   ▼VBA勉強中 さん:

セルの関係がちょっとわかりにくくなりました。

実際と異なれば、適宜、数字を調整してください。

Sub Test2()
  Dim posRow As Long
  Dim posCol As Long
  Dim Pos As Range
  Dim fPath As String
  Dim fName As String
  Dim Target As Range
  Dim dic As Object
  Dim cnt As Long
  Dim sh1 As Worksheet
  
  Set sh1 = Sheets("Sheet1") '★対象シート
  sh1.Pictures.Delete
  
  posRow = 5 '5行目
  posCol = 4 'D列
  Set Pos = sh1.Cells(posRow, posCol).MergeArea '最初の参照セルはD5から始まる結合セル
  
  Set dic = CreateObject("Scripting.Dictionary")
  fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\画像フォルダ\" '★
  
  Do While Not IsEmpty(Pos)
    fName = Right(Pos(1).Value, 3) & Pos.Offset(1).Value & ".jpg"
    fName = Dir(fPath & fName)
    If fName <> "" Then
      If Not dic.exists(fName) Then
        dic(fName) = True
        Set Target = Pos.Offset(, 2).MergeArea
        With ActiveSheet.Shapes.AddPicture(Filename:=fPath & fName, LinkToFile:=False, _
          SaveWithDocument:=True, Left:=Target.Left, Top:=Target.Top, _
          Width:=-1, Height:=-1)   '-1 元の大きさで貼り付け
          '===============タテヨコの縮尺を保持して拡大または縮小
          .LockAspectRatio = True   '縦横比率の維持(念のため)
          .Width = Target.Width * 0.9
          If .Height > Target.Height * 0.9 Then .Height = Target.Height * 0.9
          '===============中央へ調整
          .Top = Target.Top + Target.Height / 2 - .Height / 2
          .Left = Target.Left + Target.Width / 2 - .Width / 2
        End With
      End If
    End If
    
    '次の参照セル
    If Pos.Column = 4 Then 'D列
      posCol = 15 'O列
      cnt = cnt + 1
    Else
      If cnt Mod 2 = 0 Then
        posRow = posRow + 22
      Else
        posRow = posRow + 17
      End If
      posCol = 4  'D列
    End If
    
    Set Pos = sh1.Cells(posRow, posCol).MergeArea
  
  Loop
  
End Sub
・ツリー全体表示

【78737】Re:ファルダ内の画像を任意のセルに貼り...
発言  VBA勉強中  - 17/1/11(水) 14:34 -

引用なし
パスワード
   ▼β さん:
組みなおししていただき、ありがとうございます!
相変わらず説明不足が目立ち申し訳ありません
>▼VBA勉強中 さん:
>
>当初の説明と参照セル、貼付けセルが異なるようですね。
>(私の勘違いかもしれませんが)
>
>重複画像の扱いが、いまいちわからないのですが、以下で試してみてください。
>

こちらですが改めて説明させていただきます
参照セル:D5,D7(D5,D7ともに2列2行が結合している状態です)
貼り付けセル:F5(こちらは7列12行が結合しています)
重複画像についてはうまく説明できなくなってしまいました…
001-1~999-9まででn-nが2回以上使われないようにしたいものです。

testの実行をしてみましたがエラーはなにもなく、ひな形の写真が削除されるのみに留まりました。
また、
>当初の説明と参照セル、貼付けセルが異なるようですね。
これについてですが、私の間違いで貼り付けセルをposで扱っていました。
適当なミスをしてしまってすみません、最初の説明で合っています。
・ツリー全体表示

【78736】Re:ファルダ内の画像を任意のセルに貼り...
お礼  VBA勉強中  - 17/1/11(水) 13:54 -

引用なし
パスワード
   ▼β さん:

とても詳しくわかりやすい説明ありがとうございます
理解が少しだけ深まってきました
教えていただいたものはどれも非常に汎用性があり、今後もよく使っていく気がします。
・ツリー全体表示

【78735】Re:ファルダ内の画像を任意のセルに貼り...
発言  β  - 17/1/11(水) 13:48 -

引用なし
パスワード
   ▼VBA勉強中 さん:

当初の説明と参照セル、貼付けセルが異なるようですね。
(私の勘違いかもしれませんが)

重複画像の扱いが、いまいちわからないのですが、以下で試してみてください。

Sub Test()
  Dim Pos As Range
  Dim fPath As String
  Dim fName As String
  Dim Target As Range
  Dim dic As Object
  Dim cnt As Long
  Dim x As Long
  
  With Sheets("Sheet1")  '★対象シート
    .Pictures.Delete
    Set Pos = Sheets("Sheet1").Range("E5")
  End With
  
  Set dic = CreateObject("Scripting.Dictionary")
  fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\画像フォルダ\" '★
  
  Do While Not IsEmpty(Pos)
    fName = Right(Pos.Value, 3) & Pos.Offset(2).Value & ".jpg"
    fName = Dir(fPath & fName)
    If fName <> "" Then
      If Not dic.exists(fName) Then
        dic(fName) = True
        Set Target = Pos.Offset(, 1)
        With ActiveSheet.Shapes.AddPicture(Filename:=fPath & fName, LinkToFile:=False, _
          SaveWithDocument:=True, Left:=Target.Left, Top:=Target.Top, _
          Width:=-1, Height:=-1)   '-1 元の大きさで貼り付け
          '===============タテヨコの縮尺を保持して拡大または縮小
          .LockAspectRatio = True   '縦横比率の維持(念のため)
          .Width = Target.Width * 0.9
          If .Height > Target.Height * 0.9 Then .Height = Target.Height * 0.9
          '===============中央へ調整
          .Top = Target.Top + Target.Height / 2 - .Height / 2
          .Left = Target.Left + Target.Width / 2 - .Width / 2
        End With
      End If
    End If
    
    If Pos.Column = 5 Then 'E列
      Set Pos = Pos.EntireRow.Range("P1")
      cnt = cnt + 1
    Else
      If cnt Mod 2 = 0 Then
        x = 22
      Else
        x = 17
      End If
      Set Pos = Pos.EntireRow.Range("E1").Offset(x)
    End If
    
  Loop
  
End Sub
・ツリー全体表示

【78734】Re:ファルダ内の画像を任意のセルに貼り...
発言  β  - 17/1/11(水) 12:47 -

引用なし
パスワード
   ▼VBA勉強中 さん:

まず、質問されている部分。

>2つとも CreateObjectを使われていることから画像とファイルを操作できるように
>指定してしているのかな?といった認識です。合っていますか?

そうではありません。
VBAコードを書く際に、エクセルオリジナル機能だけで処理できればいいのですが
エクセルとは別のプログラム(外部プログラム)の機能を使いたいという場合があります。

そういった場合、その外部プログラムを読みこんで、VBAから利用できるように
しなければいけません。 
それが CreateObject("定められたプログラム呼び出し文字列") です。

"WScript.Shell" は、調べられた通り、実に様々な機能を提供してくれます。
今回使ったのは、その中の SpecialFolders("特殊フォルダ指定文字列") です。

たとえば デスクトップ のパス、vista以降は c:\Users\xxxxx\DeskTop ですね。
この xxxxx は PCのWindowsログインID ですから、実行するPC毎に異なります。
また、Users というフォルダ以降、DeskTop に至るまでのパス経路も、Vista以降、
『たまたま』そういった経路になっているだけで、XP時代は、全く別物でした。
ということは、今後のWindowsバージョンアップに伴って、このパス経路そのものも
変わる可能性があります。

なので、コード内で固定せず、WScript.Shellプログラムに対して、現在のバージョンの
実行PCの環境にふさわしいパス文字列をくださいね と依頼して、その文字列を
取得しています。

"Scripting.Dictinary" は、一般に ディクショナリーといわれる機能で
文字通り 『辞書』。辞書には『見出し語』と『内容』が登録されていますね。
今回は、辞書に 抽出済み画像ファイル名を見出し語として登録しておき、
それが、すでに使われたかどうか(Existsメソッド)チェックしています。
(『内容』は、今回不要なので、いずれも True をセットしています)

追加で説明のあった件も含めて、処理コードについては、今から説明を読んでみて
取り掛かります。
・ツリー全体表示

185 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free