Excel VBA質問箱 IV

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

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


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

【79907】Re:指定のフォルダから画像を取込むマクロ
発言  γ  - 18/5/22(火) 20:43 -

引用なし
パスワード
   > fileNameには一体、どういったパスが入ることに なるでしょうか?
結果だけ知りたいのであれば、ステップ実行して、
myPath.Items.Item.Path が何になるのか、
fileName = Dir(myPath.Items.Item.Path + "\")
に何が入るのかは、ご自分で確認できるはずです。
特にこうしたところで質問するまでもないですね。

言ってみれば、これは1つのイディオムみたいなものなので、
そのまま使って便利ですね、で普通は終わりですが、
さらに詳しく知りたいということなら、
Shellオブジェクトをご自分で調べて下さい。
言うまでもなくこれはVBAの外にあるものです。

"Shell.Application" でネット検索して調べてください。

最初にヒットする牟田口さんのサイトの記事
ht tp://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shellfol.htm
を参考にして下さい。

1つずつ階層を降りていけば、
myPath.Items.Item.Path
の意味が分かると思います。

通常のようにプロパティでつながっていれば、
ローカルウインドウで下に降りていけますが、
この場合は、オブジェクトを返すメソッドで階層を降りていっているので、
ローカルウインドウでは降りていけません。
したがって、ネットでヘルプ・解説記事をよむのが一番です。

この構文の意味がわかっても、それを色々な形で応用するという場面は
さほどないように思いますが、好奇心を満たすことも必要でしょう。

# その構文の意味を知るよりも、インデントを正確につける作法を身につけた方が
# 数倍意味があることだと思います。いかがですか?
# また、文字列の連結は + ではなく、きちんと & を使った方がよいです。
・ツリー全体表示

【79906】Re:VBA配列への格納方法
発言  よろずや  - 18/5/22(火) 19:29 -

引用なし
パスワード
   ▼mk さん:
>[A1]に該当する項目が多々ある為、処理時間を考えて
>配列を使用したいのですが良い方法はないでしょうか?
2つのシート上の配列は、同じ形なのでしょうか?
そのセル範囲を明確にしてください。
・ツリー全体表示

【79905】Re:VBA配列への格納方法
質問  mk  - 18/5/22(火) 17:53 -

引用なし
パスワード
   よろすや さん

回答ありがとうございます。

[A1]に該当する項目が多々ある為、処理時間を考えて
配列を使用したいのですが良い方法はないでしょうか?
・ツリー全体表示

【79904】Re:VBA配列への格納方法
回答  よろずや  - 18/5/22(火) 17:12 -

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

>Set Sh1Range = Sh1.Range("A1")
>
>Sh1Range.Copy Sh2.Range("B1")

Sh2.Range("B1").Value = Sh1.Range("A1").Value
・ツリー全体表示

【79903】VBA配列への格納方法
質問  mk  - 18/5/22(火) 13:50 -

引用なし
パスワード
   セルに表示された値のみを配列へ格納するにはどうしたら良いのでしょうか?

Sheet1の[A1]に数式[=100+200+A2](A2=300)が入力されている場合
この計算結果のみを配列へ格納してからSheet2の[B1]へ表示させようと思い下記の様なコードを作成してみました。

Sub rei()

Dim Sh1Range As Variant

Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet2")

Set Sh1Range = Sh1.Range("A1")

Sh1Range.Copy Sh2.Range("B1")

End Sub

結果Sheet2の[B1]には[600]という数値ではなく数式[=100+200+A2]が表示されてしまいました。
拙い文章ではありますが回答願います。
・ツリー全体表示

【79902】指定のフォルダから画像を取込むマクロ
質問  hiro  - 18/5/21(月) 22:38 -

引用なし
パスワード
   ExcelVBA 修行中のものです。お世話になります。
さて、標題のとおり画像を取り組むマクロをネットで拾ってきて、使っているのですが、いまいち理解できない部分がありますので質問させて頂きます。
※マクロ自体は正常に稼働します。

【不明な部分】
fileName = Dir(myPath.Items.Item.Path + "\")

この部分ですが、fileNameには一体、どういったパスが入ることに
なるでしょうか?

ちなみに前段の・・・・
' フォルダ選択画面を表示
Set shell = CreateObject("Shell.Application")
Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
Set shell = Nothing

では、「C:\画像フォルダ」 を選択しております。


【マクロの全文】

' 指定したフォルダにある画像ファイルを読み込み、EXCELに貼り付ける。
'
Sub EggFunc_pasteDirImage()

' 変数定義
Dim fileName As String
Dim targetCol As Integer
Dim targetRow As Integer
Dim targetCell As Range
Dim shell, myPath
Dim pos As Integer
Dim extention As String
Dim isImage As Boolean

' 選択セルを取得
targetCol = ActiveCell.Column
targetRow = ActiveCell.Row

' フォルダ選択画面を表示
Set shell = CreateObject("Shell.Application")
Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
Set shell = Nothing
  
' フォルダを選択したら...
If Not myPath Is Nothing Then
    
fileName = Dir(myPath.Items.Item.Path + "\")
    
Do While fileName <> ""
     
' ファイル拡張子の判別
isImage = True
pos = InStrRev(fileName, ".")
If pos > 0 Then
Select Case LCase(Mid(fileName, pos + 1))
Case "jpeg"
Case "jpg"
Case "gif"
Case Else
isImage = False
End Select
Else
isImage = False
End If
      
' 拡張子が画像であれば
If isImage = True Then
        
' 貼り付け先を選択
Cells(targetRow, targetCol).Select
Set targetCell = ActiveCell
        
' 画像読込み
ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select
        
' 画像が大きい場合、画像サイズをセル幅に合わせる
If Selection.Width > targetCell.Width Or Selection.Height > targetCell.Height Then
If Selection.Width / targetCell.Width > Selection.Height / targetCell.Height Then
Selection.Height = Selection.Height * (targetCell.Width / Selection.Width)
Selection.Width = targetCell.Width
Else
Selection.Width = Selection.Width * (targetCell.Height / Selection.Height)
Selection.Height = targetCell.Height
End If
End If
               
' 貼り付け先行を+1
targetRow = targetRow + 1
        
End If
fileName = Dir()
    
Loop
    
MsgBox "画像の読込みが終了しました"
 
End If

End Sub
・ツリー全体表示

【79901】Re:シート内にセル参照があるか調べる方法
質問  ペーターパン  - 18/5/21(月) 12:24 -

引用なし
パスワード
   ▼マナ さん:
>▼ペーターパン さん:
>>
>>具体的にはシート全体でセル参照を禁止したいです。
>
>数式入力を禁止というわけではない?
>
>例えば、
>=A1*1
>のようなのはOKでしょうか。

マナさん

お返事が遅くなり申し訳ありません。
数式入力はOKです。
セル参照のみを禁止したいです。
・ツリー全体表示

【79900】Re:PivotCache.Create で type mismatch...
お礼  hoyahoyamachine  - 18/5/21(月) 12:10 -

引用なし
パスワード
   ▼マナ さん:
>▼hoyahoyamachine さん:
>
>ht tps://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/pivotcaches-create-method-excel?f=255&MSPPError=-2147217396
>
>ここでは、
>
>> 文字列を使用してブック、ワークシート、およびセル範囲を指定するか、
>> 名前付き範囲を設定して名前を文字列として渡すことをお勧めします。
>> Range オブジェクトを渡すと、"型の不一致" エラーが予期せず発生します。
>
>としか記載されていませんが
>検索すると、↓を指定している事例ばかりでしたので、
>ReferenceStyle:=xlR1C1
>
>もし、うまくいかない場合は、試してみてください。

たいへんご丁寧なアドバイスありがとうございました。

ピボットテーブル作成のマクロ記録を眺めると、SourceTypeとTableDestinationは外部参照かつR1C1形式の文字列で記録されおり、
貴方アドバイスの二条件を追加した以下のコードでうまくいきました。

Set pvtCache = Workbooks("RSB.xlsm").PivotCaches.Create( _
          SourceType:=xlDatabase, _
          SourceData:=DBTop.CurrentRegion.Address(External:=True, ReferenceStyle:=xlR1C1), _
          Version:=xlPivotTableVersion12)

Set pvtTbl = pvtCache.CreatePivotTable( _
          TableDestination:=tblTop.Address(External:=True, ReferenceStyle:=xlR1C1), _
          TableName:="PReport", _
          DefaultVersion:=xlPivotTableVersion12)

他のコード上にあるメッソドでも範囲指定のパラメータにRangeオブジェクトを書いていて、本来エラーだけどもエラーが発生していない場合があるかもしれないと、ナニゲに思った次第です。
・ツリー全体表示

【79899】Re:PivotCache.Create で type mismatch...
発言  マナ  - 18/5/20(日) 10:08 -

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

ht tps://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/pivotcaches-create-method-excel?f=255&MSPPError=-2147217396

ここでは、

> 文字列を使用してブック、ワークシート、およびセル範囲を指定するか、
> 名前付き範囲を設定して名前を文字列として渡すことをお勧めします。
> Range オブジェクトを渡すと、"型の不一致" エラーが予期せず発生します。

としか記載されていませんが
検索すると、↓を指定している事例ばかりでしたので、
ReferenceStyle:=xlR1C1

もし、うまくいかない場合は、試してみてください。
・ツリー全体表示

【79898】Re:PivotCache.Create で type mismatch...
発言  マナ  - 18/5/19(土) 21:54 -

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

>SourceDataの引数に(Range).Addressを追加しました。

external:=true が必要では?
・ツリー全体表示

【79897】Re:PivotCache.Create で type mismatch...
発言  hoyahoyamachine  - 18/5/19(土) 20:21 -

引用なし
パスワード
   ▼γ さん:
>ヘルプを確認して
>他の定数がないか確認してください。
>私のはExcel10なので試せません。

ご教示ありがとうございます。
いまほど SourceDataの引数に .Addressを書き加え担当からの返信を待っているところです。
進展あれば一連のスレッドにご報告いたします。
・ツリー全体表示

【79896】Re:PivotCache.Create で type mismatch...
発言  hoyahoyamachine  - 18/5/19(土) 19:53 -

引用なし
パスワード
   ▼マナ さん:
>▼hoyahoyamachine さん:
>
>たぶん、
>
>ht tp://www.excel.studio-kazu.jp/kw/20180116191515.html

参考になりました。
SourceDataの引数に(Range).Addressを追加しました。

当然のことながら手元のExcel2016ではエラー発生はなかったので、問題のあったPC(Excel2013)で確認するよう依頼します。

引き続き後程報告いたします。
・ツリー全体表示

【79895】Re:PivotCache.Create で type mismatch...
発言  マナ  - 18/5/19(土) 18:59 -

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

たぶん、

ht tp://www.excel.studio-kazu.jp/kw/20180116191515.html
・ツリー全体表示

【79894】Re:PivotCache.Create で type mismatch...
発言  γ  - 18/5/19(土) 18:19 -

引用なし
パスワード
   ヘルプを確認して
他の定数がないか確認してください。
私のはExcel10なので試せません。
・ツリー全体表示

【79893】Re:PivotCache.Create で type mismatch...
発言  hoyahoyamachine  - 18/5/19(土) 17:49 -

引用なし
パスワード
   ▼γ さん:
>Version:=xlPivotTableVersion12
>のあたりでしょうか。
>xlPivotTableVersion14
>を試してみてはいかがでしょう。

さっそくの回答ありがとうございます。
試してみましたが同じ結果でした。

いま海外でそろそろ対象PCから離れることになります。
引き続きご教示いただいた場合には返信が遅れますことをお含みおきください。

帰国してExcel2013が会社内にあれば試してみようと思います。
・ツリー全体表示

【79892】Re:PivotCache.Create で type mismatch...
発言  γ  - 18/5/19(土) 17:35 -

引用なし
パスワード
   Version:=xlPivotTableVersion12
のあたりでしょうか。
xlPivotTableVersion14
を試してみてはいかがでしょう。
・ツリー全体表示

【79891】PivotCache.Create で type mismatch エ...
質問  hoyahoyamachine  - 18/5/19(土) 17:07 -

引用なし
パスワード
   いろいろ調べているのですが、手掛かりがつかめません。初めての質問ですがよろしくお願いいたします。

下記コードのPivotCache.Createで Runtime error '13' type mismatch が返ります。
Excel2013英語版(Win7 32bit)、1台のPCで発生し、同2016(Win10 64bit)日本語版の2台のPCでは発生しません。
アドイン上にコードはあり、ブックRSB.xlsm上のシートDBのレコード数が変化するデータベースからシートPRへピボットテーブルを出力する手順です。

Sub SampleCode()
Dim pvtCache As PivotCache
Dim pvtTbl As PivotTable
Dim DBTop As Range
Dim tblTop As Range

Set DBTop = Workbooks("RSB.xlsm").Sheets("DB").Range("A1")
Set tblTop = Workbooks("RSB.xlsm").Sheets("PR").Range("A1")

Workbooks("RSB.xlsm").Sheets("PR").Cells.Delete

Set pvtCache = Workbooks("RSB.xlsm").PivotCaches.Create( _
          SourceType:=xlDatabase, _
          SourceData:=DBTop.CurrentRegion, _
          Version:=xlPivotTableVersion12)

Set pvtTbl = pvtCache.CreatePivotTable( _
          TableDestination:=tblTop, _
          TableName:="PReport", _
          DefaultVersion:=xlPivotTableVersion12)
....
End Sub

原因の絞り込みに関するヒントなどのご教示をいただけると助かります。
・ツリー全体表示

【79890】Re:画像付データベース
回答  γ  - 18/5/19(土) 11:34 -

引用なし
パスワード
   コメントにはリンク貼り付けのようなことができないとすれば、
画像を直接、リンク貼り付けして、
そのVisibleプロパティをコントロールしたらどうですか?

SelectionChangeプロシージャの中で、
それぞれの画像について、
・Tagetが画像のTopLeftCellとBottomRightCellで決まる範囲と
 共通領域をもつなら、画像のVisibleプロパティを True(つまり表示)
・そうでないなら、画像のVisibleプロパティを False(つまり非表示)
という処理を実行します。

手元で実行していないので、
・所要時間
・使い勝手
はわかりませんが、
ひとつのアイデアとして検討してみてはどうでしょうか。


追記:
(1)セル選択のつど処理は動きますが、さほど重い処理になる予感はしません。
(2)多数のシートに分かれているなら、Workbook_SheetSelectionChangeを
  使うことになるでしょう。
・ツリー全体表示

【79889】画像付データベース
質問  そば  - 18/5/18(金) 23:50 -

引用なし
パスワード
   簡単なデータベースをつくりました。
レコード一つ一つに画像を付けたいと思いまして、
コメント欄に画像を貼りつける機能をマクロで加えました。
こうすればカーソルを持っていくだけで、画像が表示されるからです。

その機能自体はうまくいったのですが、
レコードが3000を超えてくると、
データが重くなってしまい、
開くまでに5分以上かかるようになってしまいました。

画像データはjpegで、ファイルサイズも小さくしているつもりです。

画像データを別フォルダに保存して、
リンクを貼り付ければ一応解決するのですが、
カーソルを持っていくだけで、画像が表示されるようにしたいです。

なにかいいアイデアがあるでしょうか?
よろしくお願いします。
・ツリー全体表示

【79888】Re:シート内にセル参照があるか調べる方法
発言  マナ  - 18/5/18(金) 19:49 -

引用なし
パスワード
   ▼ペーターパン さん:
>
>具体的にはシート全体でセル参照を禁止したいです。

数式入力を禁止というわけではない?

例えば、
=A1*1
のようなのはOKでしょうか。
・ツリー全体表示

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