Excel VBA 質問スレ Part49©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
!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 【IT】10代のネット環境「スマホのみ」が7割、「PCのみ」は25%にとどまる [無断転載禁止]©2ch.net
http://egg.2ch.net/test/read.cgi/bizplus/1500900491/ >>600
クラスモジュールがある以上、このスレの話題として守備範囲内 >>554
> ライター、チャッカマン、バーナーが他所であるのにマッチでも火をおこせるしこれはこれで良いもんだぞって言ってるようなもん
マッチだけでも十分OOできる
それにWithEventsもあるしね
https://github.com/rubberduck203/VBEX のソース読んだか?以外といろいろできるぞ >>603
これはあなたが作者さんなの?
興味深いが手っ取り早く知りたい
VBEX /testから読めばいいのかな? >>604
> これはあなたが作者さんなの?
いや、俺じゃないよ
コードサンプルとして読んでみたらってこと
あとこれとか
https://github.com/jpimbert/VBAToolKit/tree/master/Source/VbaUnit
OOの知識があって、いわゆる「インターフェース継承」を視野に入れれば、かなりのことができる
さらに、WithEventsを使えば双方向データバインディングなんかも実装できる >>605
うーん、、、
日本語のないかな?(ボソッ >>603
いやだからさ
俺の言いたいこと伝わらないし理解する気無いよね
こっちはマッチしか無いから仕方なくマッチ使ってんの
不満だからって努力を放棄してるわけじゃないからな?
ただどう考えても手間だろ
そんだけの話 >>610
君も俺の言いたいこと1ミリも理解しようとしてないから、お互い様だね >>597
意味がわからない?
学びなおした方が良いぞ >>612
> サブクラスに相当する関数から
> スーパークラスに相当する関数を呼べばいいんじゃね?
そこまで言うならなんの意味があるのか説明してみな だからさぁお前らは雑談したいだけだろ?スレ立ててそこでやれっつーの
クソうぜぇ >>611
使い方によってはvbaだってoopできるよ!って言いたいんでしょ? >>615
さいしょから言ってるでしょ
> オブジェクト指向にドップリしてたら使いにくいことこの上ないと思う
なことないよ 使いたいときに便利な機能を自由につまみ食いできるのがいいライブラリだと思っているんだが、
オブジェクト指向のライブラリって少しおせっかいというか世界観を押し付けてくるところがある。
会員にならないと利用できないサービスみたいな感じ。
自分で作ったものを自分で利用する分には当然問題ないんだけどね。
VBAの言語機能の弱さを考えると、クラス間の関連のある体系的な使い方を実現するのは厳しいだろう。 >>616
俺は工夫を強いられてる時点でうんちだと言っている
以上です 某サイトを参考にメールを一括作成する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
----------------------------------- >>620
msdnのリファレンスをみると
Outlookテンプレート(.oft)を指定しろって書いてあるので
怒られているとおり、型がちがうのでしょう。
CreateItemメソッドを使えばいいんじゃないでしょうか。 オブジェクト指向がどうこうって語りたいなら
オブジェクト指向
って言葉と
オブジェクト指向言語
って言葉をちゃんと区別して発言して下さい >>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
--------------------------------------- 関西のお笑いと関西のお笑い芸人も区別して語るべきなのか? 俺予想だと、2023年くらいに.NETと統合されるので、大丈夫じゃないの。 >>623
Sub test()
Dim ol As New Outlook.Application
Dim mi As MailItem
Set mi = ol.CreateItem(olMailItem)
mi.Display
End Sub
この最小構成でメール編集画面がでるかお試しを。
出なかったら参照設定が変なのかも。
Excelのバージョンが変わると勝手に参照設定のバージョンも
変わるという罠に引っかかったことがあるので。
実行時バインディングでやってみると言う手もあり。 >>627
最小構成でやってみると、やはり同じエラーでした!
これは、参照ができていないのですか?? '// 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 >>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。 >>628
まず、そのユーザーでOutlookはちゃんと動いてメールの送受信できるのか? >>630
試しましたが同じエラーでした。
>>631
問題なくできています。
みなさん、ご協力ありがとうございます。ご迷惑おかけしてすみません。
今気づいたのですが参照先が14.0でした。最新は15.0なんですよね?これが原因でしょうか? 皆様ありがとうございました!
理由はわかりませんが突然できるようになりました!
本当にご迷惑おかけしました! >>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 >>635
おはようございます!
ありがとうございます! win10
excel2016で
MSXML2.XMLHTTPを使って
responseTextでgoogle検索結果のページを取得しようとすると、
responseTextで返ってきたものが、今までwin7 excel2007などで返ってきたものと全然違うんですが、win7の時のように受け取る方法ってありませんか?
win7の時はhtmlそのものが返ってきてましたがwin10では最初の方が判読困難です。
やろうとしていることは、vbaでgoogle画像検索の結果の画像をセルに表示しようと思ってます。 そういえば responseBody しか使ったことないなあ
(adTypeBinary な ADODB オブジェクトに Write するために) すみません、いろいろ試してたんですが、google以外ではちゃんと同じようなものを受け取れてました。
googleでは環境によって返すものが違うのかもしれません。
その先はスレ違いになるので自分でいろいろやってみます。ありがとうございました。 api以外でgoogleの検索結果を取得しないほうがいい
すぐにアクセス禁止になる 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 少々長くてもわかりやすい名前をつけるのが基本だからね。
ハンガリアンよりは全然いい。 少々長くても分かりやすい名前を付ける、それがハンガリアン記法
想像してるのはたぶんシステムハンガリアン記法 変数はAddressなのにメソッド名はAdrで統一してないのは理由あるの? 変数名長いなぁ
olAppとかAdrListとかにすれば良いやん >>644
単に「ハンガリアン」と言った場合は、システムハンガリアンの意味で用いられていることが多い。
ということでどうかひとつ。 >>646
むしろ関数名を
GetNameToAdddress
にしたほうがいいかも。 >>641
Dim Cts As Folder, Ct As ContactItem
で
ユーザー定義型が定義されてません
エラーが出た >>650
まぁそうだけど、どれ参照するのか探すのめんどい
開発用に、コンポーネント参照の全選択ほしいな。それともあるんかな? >>650
649は店に来たお客さんのつもりのようだから、まともに相手する必要はないよ 単なる自己満足なんだからそこまで突っ込むなよ
どうせ永遠に平行線なんだろ? >>648
メソッドの頭文字は小文字にしたいな
あとd多いのはなんか意図あるの? >>654
ごめん、dはタイプミスだ。
メソッドの頭文字を小文字にするのは何流?
VBA流では大文字だよね。 みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、
>>649
すみません、outlookのライブラリです。
よろしくお願いします。 >>656
いや、だからメソッドをキャメルケースにするのは何流なのかなと。 >>658
javascriptはキャメルだと思う みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、
>>649
すみません、outlookのライブラリです。
よろしくお願いします。 >>659
IDの最後がvbaだ。カコイイ
なるほど、メソッドキャメルはJS流だったのね。サンクス >>660
Outlook VBA スレないからまあここでもいいと思うが仕事中に軽くググった範疇だといい方法が見つからん
> Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
Items.Find( ) は Folder オブジェクトしか持ってないからここでエラーになるのは当然
グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが取得したリストの GetContactsFolder( ) を呼び出しても Nothing しか返ってこない
何か設定が要るのか根本的に頓珍漢なのかさっぱりわからん >>662
ありがとうございます!勉強になります。
> グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが
↑その内容というのは、debug.printで見ることはできますでしょうか?? >>664
foo = bar.GetGlobalAddressList( )
をどこかに入れてfooをウォッチ式で見る >>664
Set GlobalAddressList = Namespace.GlobalAddressList( )
Debug.Print GlobalAddressList.AddressEntries.Item(1).Name
とかすれば見れるよ
全件エクスポートするサンプルとかあるので見てみて
https://www.slipstick.com/developer/code-samples/export-exchange-gal-excel/ バージョンが上がって日付時刻型の除算ができなくなりました。バリアント型にしても空になります。
対応方法はありませんでしょうか?
また、こういう仕様変更はどこで確認できますか? >>667
Dateの除算てなんのためにやるんだっけ?
CLngとかしてからじゃダメなの? >>667
エラーの出たコードを書いてみて。
あとバージョンも。2016? エラーコードは51
データ型が日付時刻の除算はエラーでる Sub foo()
bar = Date / 2
Debug.Print bar
End Sub
2010、win7だけどエラーでない ダブルにキャストしてから計算したら
ずれるのかな? >>676
Sub foo()
bar = Date / Date
Debug.Print bar
End Sub
普通に1になったけど 質問者からのエラーコードの提示がないので無駄な回答だな。 時刻を時刻で割る意義は? どんな分野で必要と成るんだ? それは知りたい バージョンが上がって…
とか言いながらバージョンを書かない馬鹿
指摘されても書かないという >>681
8時間の就業時間の間に25分掛かる作業を何回できるか見積るとか しょうもない質問はほっとけばいいんじゃ?
それとも答えたくてウズウズしてる感じ? >>683
無理くり理由をこじつけてもその程度だよな…ほんと何がしたいんだろうな 質問するのにバージョンも書かない
ID変わってるのに名無しのまま
環境書けと言ってるのに無視
こんな処理する理由は?と聞かれても無視
こんな人間の生産物を現場で使う恐怖 >>686
何のためにここで質問したのかわからないよね。
つか、俺たちが釣られただけ? 質問者が軌道修正のために必要な情報を提供しないってのはここではザラにあることだろ。
そんなのによく付き合ってられんなー >>678
dim a as date
dim b as date
dim test as date
a = time
b = time
test = a / b
でエラー出た >>693
地域オプションで先頭が数字以外になるような書式だったとか? >>693
環境書けよ
なんでエラー出たとか言うやつは環境書かないの
VBAの日付型は原則数値として扱えるはずので
日付型である事が原因でエラーが出るとは考えにくいけどなぁ
ちなみにエラー51のヘルプ(2007)には
>このエラーが Error ステートメントまたは Raise メソッドで生成されたものでなければ、Microsoft 製品テクニカル サポートに連絡して、メッセージが表示されたときの状況を知らせてください
ってあるから、ホントにエラー51出たならEXCELのバグの可能性もないではないな excel2010 win7
エラーが起こるのは除算の分母側がdateだった時
longにキャストするか、variantで宣言していれば問題ない(もちろん宣言してない場合も問題ない)
バグくさい挙動だなぁ
Sub foo2()
Dim a As Time
Dim b As Time
Dim test As Date
a = Time
b = Time
test_long = (a * 1) / (b * 1) 'ok
test = a / (b * 1) 'ok
test = 1 / b 'error
test = (a * 1) / b 'error
test = a / b 'error
End Sub
Sub foo()
Dim a As Variant
Dim b As Variant
Dim test As Date
a = Time
b = Time
test = a / b 'ok
End Sub Cdbl()で分母をDoubleにキャストすればいいだけじゃね? >>697
まぁ解決法としてはそれでも何でもいいし、そもそもdateで除算って事をやらないんだけど
根本的な原因が分からないと、変なとこで悪影響受けそう Time って
DateTime.Time プロパティのことだよな
Property Time As Variant
だからもともとVariant型
dim a As Time がエラーになるんだが Date型はVBAのデータ型で"21:02:32"みたいな文字列なんじゃね?
だから計算するとエラーになる
分子にDate型を持ってきたときはDoubleに自動的にキャストされてると予想 ■ このスレッドは過去ログ倉庫に格納されています