X



Excel VBA 質問スレ Part49©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ bb2e-8SzA)
垢版 |
2017/06/26(月) 02:15:14.60ID:T3ylemnb0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part48
http://mevius.2ch.net/test/read.cgi/tech/1494890685/

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0565デフォルトの名無しさん (ワッチョイ a791-8s/R)
垢版 |
2017/07/26(水) 20:15:48.34ID:W1HWCg900
状態を持つ必要がある入出力関係が
独立に多数ある場合は
クラスを使うと比較的実装が簡単になるのかな?
0566デフォルトの名無しさん (ワッチョイ bf6d-1kH5)
垢版 |
2017/07/26(水) 20:17:56.75ID:rbCQuCda0
>>563
ログはlogシート一つ、3列

時間 / タイプ / 内容
7/26 20:00 log 作業開始
7/26 20:05 success 作業成功
7/26 20:07 error err.discriptionの内容
7/26 20:10 log 作業終了

で、書き込む時に毎回A列の最終行を取得し、そこに記録してる
覚える必要はないと思う
0567デフォルトの名無しさん (ワッチョイ e711-MZAo)
垢版 |
2017/07/26(水) 20:24:18.05ID:+NZ2Dbuu0
表の検索とかsqlでやる人もいるんだろうけど自分としてはクラスにしちゃうのがしっくりくるわ
配列の操作もクラスにしてると楽
あと、似たような処理で操作する対象が違うメソッドなんかは同じ名前にしても問題ないところとかも地味に便利だよ
関数だと命名に困ることがよくある
0568デフォルトの名無しさん (スップ Sdff-AsiQ)
垢版 |
2017/07/26(水) 20:30:27.76ID:ecs8OXuXd
>>560
さあ?いろいろあるでしょ
数値を放り込むとその度に回数をカウントアップし、最大値・最小値、合計、時刻を記録する、とか。
これくらいだったらワークシートでもできるけど、そういう対象が数多くなるとオブジェクト配列でやりたくなる。
どのワークシートのどこに?とか考える必要なくなるしエクセル以外のOfficeでも使えるし。
0569デフォルトの名無しさん (ワッチョイ a791-8s/R)
垢版 |
2017/07/26(水) 20:51:20.79ID:W1HWCg900
>>564
一般的な形では難しいかもしれないけど
サブクラスに相当する関数から
スーパークラスに相当する関数を呼べばいいんじゃね?

逆にスーパークラスに相当する関数に
スイッチみたいな引数を付けて
サブクラスに相当する関数に分岐するとか
0571デフォルトの名無しさん (ワッチョイ 473d-pqVL)
垢版 |
2017/07/26(水) 21:20:54.79ID:19gyZHTT0
>>558
VBAで出来ないと思っているならオブジェクト指向を何か勘違いしているからオブジェクト指向設計の本を読むといいよ。
他の言語みたいな書き方が出来ないだけで、VBAでもオブジェクト指向プログラミングは普通に出来るから。
0572デフォルトの名無しさん (ワッチョイ e711-MZAo)
垢版 |
2017/07/26(水) 21:34:48.38ID:+NZ2Dbuu0
>>570
まあ、あんまり大きなデータは扱わんからな
別に検索する形式が決まってるなら内部的にsqlで値抜き出してもいいわけだし
データの塊をオブジェクトとして扱っちゃったほうが何かまとまり感あってしっくり来るって感じかな
0582デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 00:50:19.96ID:Gu8HEug70
>>576
なぜ?
で、どうするの?
0583デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 01:05:44.74ID:Gu8HEug70
>>571
VBAと言う言語にクラスとかオブジェクト指向の概念が入っている
つまりオブジェクト指向の概念は言語にもつながる
と言う主張

一方でオブジェクト指向は設計にのみ関わる概念と言う主張もある

オブジェクト指向の概念を取り入れた言語でオブジェクト指向設計したものを実現するのと
オブジェクト指向の概念がない言語で実現するのでは
生産性とかに差が生じるだろう
0585デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 01:54:44.40ID:Gu8HEug70
>>584
各シートの統計情報を取りたい時はどうする?
例えば、セルを更新した回数、最大値、最小値、平均値
を各シート毎に知りたい時

後から分散とか標準偏差とかも知りたくなったらどうする?
0586(ワッチョイ 0fcf-GNib)
垢版 |
2017/07/27(木) 02:24:19.55ID:lqCZB24a0
Youtuberヒカルが月収を明らかに!!おはよう朝日です出演
https://www.youtube.com/watch?v=RLZGrqQnnZc
第1回案件王ランキング!YouTuberで1番稼いでるのは誰だ!
https://www.youtube.com/watch?v=asF2wQ2xhjY&;t=61s
ユーチューバーの儲けのカラクリを徹底検証!
https://www.youtube.com/watch?v=FUSb4erJSXE&;t=504s
【給料公開】チャンネル登録者4万人突破記念!YouTuberの月収公開!
https://www.youtube.com/watch?v=Y7DAQ0RKilM&;t=326s
誰も言わないなら俺がYouTuberのギャラ相場を教えます
https://www.youtube.com/watch?v=E4q-vaQh2EQ&;t=118s
YouTuberになりたいのは馬鹿じゃない!YouTuberになる方法
https://www.youtube.com/watch?v=Fr0WXXZRMSQ

最高月収5000万円だとさ。年収じゃなくて「月収」な
おまえらもyoutubeに動画投稿したほうがいい
顔出したくないならラファエルみたいに仮面かぶればいい
手っ取り早く視聴数稼ぐには有名ユーチューバーへの物申す系動画がオススメ
0589デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 06:25:09.17ID:Gu8HEug70
>>587
クラスってオブジェクト指向じゃないの?

上級者的に手続き型でやらないの?
0590デフォルトの名無しさん (ドコグロ MM8a-gqKx)
垢版 |
2017/07/27(木) 06:47:24.74ID:P1js1uXhM
>>582
> なぜ?

> 逆にスーパークラスに相当する関数に
> スイッチみたいな引数を付けて
> サブクラスに相当する関数に分岐するとか
サブクラスを増やす度にスーパークラスに手を入れるつもりなの?
真顔で言ってるなら単なるアホだろ w

> で、どうするの?
無理じゃね?
って書いてあるんだが...
0591デフォルトの名無しさん (ドコグロ MM8a-gqKx)
垢版 |
2017/07/27(木) 07:00:09.74ID:P1js1uXhM
>>585
> 各シートの統計情報を取りたい時はどうする?
要件次第

> 例えば、セルを更新した回数、最大値、最小値、平均値
> を各シート毎に知りたい時
更新回数以外は全セルなめて計算することもあるしイベント毎に合計、最大、最小を更新していくのもあるだろうな

> 後から分散とか標準偏差とかも知りたくなったらどうする?
そういう機能を実装するだけ
イベント以外はオブジェクト指向関係ないと思うぞ
0592デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 07:12:45.05ID:Gu8HEug70
>>590
でいちいち同じ処理をコピペするの?
0593デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 07:13:37.01ID:Gu8HEug70
>>591
生産性が違うんじゃね?
0594デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 07:15:00.43ID:Gu8HEug70
>>591
全セルなめるとか性能要件を満たせなくなる可能性が高いだろ
0596デフォルトの名無しさん (ワッチョイ db91-ntdb)
垢版 |
2017/07/27(木) 07:17:56.55ID:Gu8HEug70
>>590
サブクラスからスーパークラスを呼ぶ方は?
0597デフォルトの名無しさん (ドコグロ MM8a-gqKx)
垢版 |
2017/07/27(木) 07:37:59.47ID:P1js1uXhM
>>592
どこからコピペが出てきたのか意味不明

>>593-594
だから「要件次第」って書いてあるんだが
最初に一度はなめないといけないから一回しか呼ばれないと言う要件ならその方が効率的だし

>>596
それになんの意味があるんだ?
マジでオブジェクト指向の基礎からやり直した方がいいレベルだぞ
0599デフォルトの名無しさん (アウアウエー Sae2-kGGk)
垢版 |
2017/07/27(木) 08:16:42.60ID:LMuXn2N9a
>>575
結局それだと要らんもんまで呼び出したり不便なんだよ
やれんことはないけど不便
オーバーロードもやれんことはないけど実装がめんどくさい
使いたい場面は結構出てくると思うけどね
インターフェースもなんかスマートじゃないし
0605デフォルトの名無しさん (JP 0H76-ZO1u)
垢版 |
2017/07/27(木) 10:55:11.44ID:ZNB0F0Q0H
>>604
> これはあなたが作者さんなの?
いや、俺じゃないよ
コードサンプルとして読んでみたらってこと

あとこれとか
https://github.com/jpimbert/VBAToolKit/tree/master/Source/VbaUnit

OOの知識があって、いわゆる「インターフェース継承」を視野に入れれば、かなりのことができる
さらに、WithEventsを使えば双方向データバインディングなんかも実装できる
0610デフォルトの名無しさん (アウアウエー Sae2-kGGk)
垢版 |
2017/07/27(木) 13:24:05.39ID:LMuXn2N9a
>>603
いやだからさ
俺の言いたいこと伝わらないし理解する気無いよね
こっちはマッチしか無いから仕方なくマッチ使ってんの
不満だからって努力を放棄してるわけじゃないからな?
ただどう考えても手間だろ
そんだけの話
0612デフォルトの名無しさん (ササクッテロル Spb3-ntdb)
垢版 |
2017/07/27(木) 14:43:39.94ID:DPiXNUUHp
>>597
意味がわからない?
学びなおした方が良いぞ
0614デフォルトの名無しさん (ワッチョイ ea06-HJpE)
垢版 |
2017/07/27(木) 16:44:21.21ID:7xCZa4oD0
だからさぁお前らは雑談したいだけだろ?スレ立ててそこでやれっつーの
クソうぜぇ
0617デフォルトの名無しさん (スップ Sd8a-y7IM)
垢版 |
2017/07/27(木) 17:11:23.71ID:yI2DKD3yd
使いたいときに便利な機能を自由につまみ食いできるのがいいライブラリだと思っているんだが、
オブジェクト指向のライブラリって少しおせっかいというか世界観を押し付けてくるところがある。
会員にならないと利用できないサービスみたいな感じ。
自分で作ったものを自分で利用する分には当然問題ないんだけどね。
VBAの言語機能の弱さを考えると、クラス間の関連のある体系的な使い方を実現するのは厳しいだろう。
0620デフォルトの名無しさん (アウーイモ MM9f-k5Qo)
垢版 |
2017/07/27(木) 19:42:01.40ID:xCwJ4jCdM
某サイトを参考にメールを一括作成するVBAを書いています。
createitemfromtemplateの行で「実行時エラー13 型が一致しません」というエラーが出ます。
どうやらcreateitemfromtemplateがうまく機能していないようなのですが、解決方法を教えていただけませんでしょうか。
よろしくお願いいたします。
※「Microsoft Outlook 14.0 Object Library」の参照設定はONになっています。
-----------------------------------
Sub main()

Dim OL As New Outlook.Application
Dim M As MailItem

Dim MaxRow: MaxRow = Range("A1").End(xlDown).Row

For i = 2 To MaxRow
Set M = OL.createitemfromtemplate("D:\本文.msg")

M.To = Cells(i, 列.件名).Value
M.Subject = Cells(i, 列.件名).Value
M.Attachments.Add "D:\" & Cells(i, 列.添付ファイル).Value
M.HTMLBody = Replace(M.HTMLBody, "●●", Cells(i, 列.氏名).Value)
M.SaveAs "D:\" & Cells(i, 列.企業名).Value & "_" & Cells(i, 列.氏名).Value & ".msg"
Next

End Sub
-----------------------------------
0621デフォルトの名無しさん (ワッチョイ 6623-V1Wy)
垢版 |
2017/07/27(木) 20:32:44.20ID:60P4ZjAM0
>>620
msdnのリファレンスをみると
Outlookテンプレート(.oft)を指定しろって書いてあるので
怒られているとおり、型がちがうのでしょう。

CreateItemメソッドを使えばいいんじゃないでしょうか。
0623620 (アウーイモ MM9f-k5Qo)
垢版 |
2017/07/27(木) 22:07:28.99ID:xCwJ4jCdM
>>621
返信ありがとうございます!!
すみません、CreateItemでも変わらずエラーでした・・。
ちなみに下記のように.oftを指定しても同じでした。
これは本当に不思議です・・・。

---------------------------------------
Sub test03()

Dim OL As New Outlook.Application
Dim M As MailItem
Set M = OL.CreateItemFromTemplate("D:\本文.oft")

M.To = "aaaa@bbb.co.jp"
M.SaveAs "D:\test03.msg"

End Sub
---------------------------------------
0627デフォルトの名無しさん (ワッチョイ 6623-V1Wy)
垢版 |
2017/07/27(木) 23:04:48.75ID:60P4ZjAM0
>>623
Sub test()

Dim ol As New Outlook.Application
Dim mi As MailItem
Set mi = ol.CreateItem(olMailItem)
mi.Display

End Sub

この最小構成でメール編集画面がでるかお試しを。
出なかったら参照設定が変なのかも。
Excelのバージョンが変わると勝手に参照設定のバージョンも
変わるという罠に引っかかったことがあるので。
実行時バインディングでやってみると言う手もあり。
0628620 (アウーイモ MM9f-6wLz)
垢版 |
2017/07/27(木) 23:18:55.37ID:xCwJ4jCdM
>>627
最小構成でやってみると、やはり同じエラーでした!
これは、参照ができていないのですか??
0629デフォルトの名無しさん (オッペケ Srb3-ZCwv)
垢版 |
2017/07/27(木) 23:25:30.12ID:8/6stQ5Xr
'// 1行目の項目名が、A列から順に
'//[アドレス][件名][添付ファイルパス][本文]
'// のとき、

Dim dataSet
Dim lastRow As Long
Dim i As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
dataSet = Range(Cells(2, 1), Cells(lastRow, 4)).Value

With CreateObject("Outlook.Application")
  .GetNamespace("MAPI").GetDefaultFolder(16).Display
  For i = 1 To lastRow - 1
    With .CreateItem(olMailItem)
      .To = dataSet(i, 1)
      .Subject = dataSet(i, 2)
      .Attachments.Add dataSet(i, 3)
      .Body = dataSet(i, 4)
      .Save
    End With
  Next i
End With
0630デフォルトの名無しさん (ワッチョイ 6623-V1Wy)
垢版 |
2017/07/27(木) 23:27:06.45ID:60P4ZjAM0
>>628
よく考えたら、参照ならその前にエラーを吐きそう。
ためしに

Sub test()

Dim ol As Object
Set ol = CreateObject("Outlook.Application")
Dim mi As Object
Set mi = ol.CreateItem(olMailItem)
mi.Display

End Sub
これをOption Explicitを無効にして実行したら
どうなるでしょうか?

だめならOS再起動してみる。
どうにも理解不能なエラーがこれで直ったことがあるw。
0632620 (アウーイモ MM9f-6wLz)
垢版 |
2017/07/28(金) 00:24:24.58ID:EJW5hZGgM
>>630
試しましたが同じエラーでした。

>>631
問題なくできています。


みなさん、ご協力ありがとうございます。ご迷惑おかけしてすみません。
今気づいたのですが参照先が14.0でした。最新は15.0なんですよね?これが原因でしょうか?
0633620 (アウアウアー Sab6-6wLz)
垢版 |
2017/07/28(金) 04:23:09.57ID:Kx1QSHwna
皆様ありがとうございました! 
理由はわかりませんが突然できるようになりました!
本当にご迷惑おかけしました!
0634デフォルトの名無しさん (オッペケ Srb3-ZCwv)
垢版 |
2017/07/28(金) 04:32:44.73ID:ccATQH/dr
>>632
ごめん。コード間違ってた。orz

参照設定をoffにし、↓のコードで試してみて。

'// olMailItemを直値(0)に変えた
Dim dataSet
Dim lastRow As Long
Dim i As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
dataSet = Range(Cells(2, 1), Cells(lastRow, 4)).Value

With CreateObject("Outlook.Application")
  .GetNamespace("MAPI").GetDefaultFolder(16).Display
  For i = 1 To lastRow - 1
    With .CreateItem(0)
      .To = dataSet(i, 1)
      .Subject = dataSet(i, 2)
      .Attachments.Add dataSet(i, 3)
      .Body = dataSet(i, 4)
      .Save
    End With
  Next i
End With
0637デフォルトの名無しさん (ワッチョイ db11-AITk)
垢版 |
2017/07/28(金) 23:02:57.85ID:+oxMyCi10
win10
excel2016で
MSXML2.XMLHTTPを使って
responseTextでgoogle検索結果のページを取得しようとすると、
responseTextで返ってきたものが、今までwin7 excel2007などで返ってきたものと全然違うんですが、win7の時のように受け取る方法ってありませんか?

win7の時はhtmlそのものが返ってきてましたがwin10では最初の方が判読困難です。

やろうとしていることは、vbaでgoogle画像検索の結果の画像をセルに表示しようと思ってます。
0639デフォルトの名無しさん (ワッチョイ db11-AITk)
垢版 |
2017/07/30(日) 12:41:33.40ID:ND/Yhbfk0
すみません、いろいろ試してたんですが、google以外ではちゃんと同じようなものを受け取れてました。
googleでは環境によって返すものが違うのかもしれません。
その先はスレ違いになるので自分でいろいろやってみます。ありがとうございました。
0641デフォルトの名無しさん (アウーイモ MM9f-GszO)
垢版 |
2017/08/02(水) 00:57:39.97ID:O3oN8G+MM
Function Name2Adr(str As String)
Dim Cts As Folder, Ct As ContactItem
Set Cts = CreateObject("Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
Set Ct = Cts.Items.Find("[Email1DisplayName] = '" & str & "'")

If Ct Is Nothing Then Name2Adr = "不明" Else Name2Adr = Ct.Email1Address

Set Cts = Nothing: Set Ct = Nothing
End Function
↑ローカルのアドレス帳から表示名を検索しメアドを返す関数です。これはうまくいくのですが、
↓下のグローバルアドレス帳を検索するものがうまくいきません。エラーメッセージは「オブジェクトはこのプロパティまたはメソッドをサポートしていません」です。
どなたか解決法をご教示ください。よろしくお願いします。
Function gName2Adr(str As String)
Dim olApplication As Outlook.Application
Dim olNameSpace As Outlook.Namespace
Dim olAddressLists As Outlook.AddressLists
Dim olAddressList As Outlook.AddressList
Dim olAddressEntries As Outlook.AddressEntries

Set olApplication = New Outlook.Application
Set olNameSpace = olApplication.Session
Set olAddressLists = olNameSpace.AddressLists
Set olAddressList = olAddressLists.Item(2)
Set olAddressEntries = olAddressList.AddressEntries

Dim olAddressEntry As Outlook.AddressEntry
Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
If olAddressEntry Is Nothing Then gName2Adr = "不明" Else gName2Adr = olAddressEntry.Email1Address
End Function
0657641 (オイコラミネオ MMb6-Cs75)
垢版 |
2017/08/02(水) 13:14:55.44ID:1uis+HfsM
みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、

>>649
すみません、outlookのライブラリです。
よろしくお願いします。
0660641 (オイコラミネオ MMb6-Cs75)
垢版 |
2017/08/02(水) 16:56:06.29ID:uQ5PKG3iM
みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、

>>649
すみません、outlookのライブラリです。
よろしくお願いします。
0662デフォルトの名無しさん (ドコグロ MM22-gqKx)
垢版 |
2017/08/02(水) 18:28:23.95ID:i5+f8wczM
>>660
Outlook VBA スレないからまあここでもいいと思うが仕事中に軽くググった範疇だといい方法が見つからん
> Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
Items.Find( ) は Folder オブジェクトしか持ってないからここでエラーになるのは当然
グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが取得したリストの GetContactsFolder( ) を呼び出しても Nothing しか返ってこない
何か設定が要るのか根本的に頓珍漢なのかさっぱりわからん
0664620 (アウアウアー Sa83-zhMW)
垢版 |
2017/08/03(木) 06:23:52.11ID:y8hiM9O7a
>>662
ありがとうございます!勉強になります。

> グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが

↑その内容というのは、debug.printで見ることはできますでしょうか??
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況