Excel VBA 質問スレ Part45at TECH
Excel VBA 質問スレ Part45 - 暇つぶし2ch2:デフォルトの名無しさん
17/01/04 23:43:25.46 T2t87YWx.net
スレ生きてるかな?

3:デフォルトの名無しさん
17/01/05 01:36:19.20 3zitFiAl.net
エクセルVBAのオススメ参考書とか教えて下さいませ

4:デフォルトの名無しさん
17/01/05 16:31:19.34 rordfoes.net
おちるぞー

5:デフォルトの名無しさん
17/01/05 17:49:33.10 3kVSXnTB.net
>>3
Office TANAKA

6:デフォルトの名無しさん
17/01/05 19:15:59.64 YlAAgZIP.net
落ちたら落ちたでまた立てればいいのよ

7:デフォルトの名無しさん
17/01/05 21:50:17.01 PrUsv/Jo.net
excel関数のoffsetやsumifを多用してたせいでマクロ遅くなるなんて知らんかった
マクロ実行中も再計算してるのか

8:デフォルトの名無しさん
17/01/05 21:53:00.56 EGC2o4Lu.net
>>7
計算止めてマクロ実行し終わるときに再計算させるんじゃダメなの?

9:デフォルトの名無しさん
17/01/05 22:36:04.40 fbqYOVIL.net
>>3
Me.Thread

10:デフォルトの名無しさん
17/01/05 22:50:47.05 olwzS93J.net
どんな言語でもそうだけど、それ単体で覚えるって無理だよな。

11:デフォルトの名無しさん
17/01/05 23:06:24.30 fbqYOVIL.net
ていうかVBAって、
半分くらいは、神エクセルを作るクソ上司対策の為にあるようなもん


12:だけどな。



13:デフォルトの名無しさん
17/01/06 00:22:50.70 m+Jpe1FL.net
>>7
作り終わったら描画と計算止めるのは速度上げたいならマストだぞ

14:デフォルトの名無しさん
17/01/06 00:32:13.04 yTw61UwJ.net
>>3
レベルによると思います。
マクロ少しはつかえるのか、全くダメだけどExcelは得意(関数、機能など)だとか、関数もよく分からんとか。
IF関数もよく分からないレベルだと、まずはExcelの関数(ワークシート関数)と、機能(条件付き書式とか、テーブルとか)をある程度勉強した方がいい。

15:デフォルトの名無しさん
17/01/06 19:20:32.03 Eygm90s9.net
新年早々質問いきます!
選択している写真の存在するセル領域Rangeを取得したいと思っています。
ところが、セルピッタリの位置に写真を配置(Alt+写真ドラッグ・Alt+拡大縮小)した場合に、特定のサイズの時に1セル余分に取得してしまう事が分かりました。
正確にRangeを取得できるように直したいのですが、何か良いアイディアを頂けないでしょうか。
'現在選択している写真の領域Rangeを選択状態にするテスト
Sub SelectShapeRangeTest()
Dim SP As Shape
For Each SP In Selection.Parent.Shapes
If SP.Name = Selection.Name Then Exit For
Next
Range(SP.TopLeftCell, SP.BottomRightCell).Select
End Sub

16:デフォルトの名無しさん
17/01/06 19:32:50.62 5HA7V59p.net
>>14
Rangeを選択してその大きさにShapeのサイズを変える

17:デフォルトの名無しさん
17/01/06 19:50:55.68 5HA7V59p.net
>>14
Rangeが大きくなった事を判定してRangeを小さくするとか
大きくなったRangeに合うようにShapeを移動する
例えばRangeの中心とShapeの中心が重なるようにとか

全てのShapeを同じ大きさにするとか
シートにシェイプは1つだけにしてシートの左上とシェイプの左上を合わせるとか

18:デフォルトの名無しさん
17/01/06 19:54:21.08 ylhkczHt.net
>>15
スマホから、主です。
回答ありがとうございます。
たしかにこれから写真を貼るのであれば、その方法で解決すると思いますが、あくまで既に配置済みの写真から読み取る必要が有るんです。
上記はテストコードなのでセレクトしていますが、これを関数化して膨大な配置済みの写真からそれぞれのrangeを取り出すのが最終目標なので。

19:デフォルトの名無しさん
17/01/06 21:04:04.05 S2R5Pk4v.net
>>17
どうせギリギリのところで次のセルに被ってるんだろ
対象のシェイプより少しだけ小さいシェイプおいて取得すりゃいいんじゃね?

20:デフォルトの名無しさん
17/01/06 21:54:38.99 Q5cZMFD3.net
>>14
vbaでオラが画像を貼る時は
デフォのセルの左上を基準にするだけで
セルをはみ出そうが、画と画が被ろうが、複数枚貼っていく
その時、画像のセル位置はセーブしてるし
shapes.nameを一意に付けておくので
後でサイズ変更したり削除したり、、操作は自在なのだが

21:デフォルトの名無しさん
17/01/06 23:58:00.16 8yYsxO6K.net
初めてお伺いさせていただくんですが、
マクロでvlookupを使いたいと思っているのですがエラーしか返ってこず途方にくれています。。
=VLOOKUP(D8,データ欄!$C$9:$D$28,2,FALSE)
D8にはユーザーフォームで入力した品目名が出力されており、それに呼応するIDがデータ欄!C9:D28に記載されており、
E8にIDを出力したいと考えています。
ヒントでも頂ければ幸甚に存じます。

22:デフォルトの名無しさん
17/01/07 00:25:21.43 LrFag0bm.net
それ、マクロの問題なんですかね??
vlookup関数でエラーが出てるの?

23:デフォルトの名無しさん
17/01/07 00:30:28.46 2J+LIFNT.net
>>12
途中でエラーが出て、アレっ?となる罠付きだけどな。

24:デフォルトの名無しさん
17/01/07 00:37:52.01 2J+LIFNT.net
>>20
Cells(1,1).Value="=VLOOKUP(D8,データ欄!$C$9:$D$28,2,FALSE)"なのか?
WorksheetFunction.VLookupなのか?
実行時エラーなのか?
#N/Aなのか?
何となく、余計な改行コードが入っているとか、
数字の123と文字の123を比較してるとか、
そんな罠のような気がするけど。

25:デフォルトの名無しさん
17/01/07 00:48:37.10 CI9p857v.net
>>20
面倒くさいからこれ貼っとくわ
URLリンク(www.relief.jp)

26:デフォルトの名無しさん
17/01/07 00:49:41.86 TOrGuStJ.net
自分の解釈をできるだけ排除して
事実だけを伝えた方がいい時もある
エラーと言っているが画面に表示される文字列やダイアログは何なのか
どんなタイミングで表示されるのか
自分が書いたコードはどんなものか

27:デフォルトの名無しさん
17/01/07 00:51:23.73 LrFag0bm.net
ファイル上げてくれると、分かりやすいんだけどね。

28:デフォルトの名無しさん
17/01/07 00:55:21.10 CI9p857v.net
まさかエクセルの関数をそのまま書いてるとかじゃないやろな

29:デフォルトの名無しさん
17/01/07 09:02:21.49 Xo1hV6SK.net
>>22
作り終わるってのはテストも込みでだぞ

30:デフォルトの名無しさん
17/01/07 23:07:08.30 so7B4l6a.net
>>20は解決したのかな?

31:デフォルトの名無しさん
17/01/07 23:55:04.69 5WVocSaL.net
すいません
とあるセルに入力するとvbaが実行するようにしてるのですが
コードに間違いがあるとエラーがでて終了を押すとまたセルに入力してもvbaが実行されなくなります (MsgBoxで確認してます)
実行メニューのリセットを押しても同じです
ファイルを開き直してもダメでexcelを再起動するとまた動くのですが再起動せずにする方法ってありますか?
excel 2016 win7です

32:30
17/01/08 00:49:37.29 r1ASQ1zZ.net
追記で動かなくなるのはそのWorkbook_SheetChange だけで
ボタンからsubの実行は動くようです

33:デフォルトの名無しさん
17/01/08 00:52:16.58 mMTwBd0e.net
>>30
もしかして
Application.EnableEvents = False
とかしてて その後 実行時エラーが出て Trueに戻せてないとかじゃね?
On Error
でエラートラップして Trueに戻すようにしないと

34:デフォルトの名無しさん
17/01/08 12:37:54.44 C9GVPqMv.net
てかコードの間違いを直せよ...

35:デフォルトの名無しさん
17/01/08 14:23:39.68 aANViJyG.net
>>33
まさにこれだが
デバッグモードにして止めてみろって

36:30
17/01/08 14:39:47.53 r1ASQ1zZ.net
>>32
それが原因だったようです
ありがとうございますm(__)m
>>33-34
デバックモードよく分かってません
勉強してみます

37:デフォルトの名無しさん
17/01/08 21:58:52.89 LSCp0tLP.net
超初心者の質問です。
A行(A5~Aずっと下まで)に「食物」が入力されていると仮定して、
B行が一行上の値と違う場合、
一行上に行を挿入して、その行に「果物」と入れたいです。
B行に入る値
・みかん
・バナナ
Sub 入力
一番上 = 5
一番下 = Cells(Row.Count,1).End(xlup).Row
For Cnt = 一番上 To 一番下
If Cells(Cnt,1)="りんご"
If Cells(Cnt-1,2)<> cells(Cnt,2) then
If cells(Cnt,2)="みかん" or Cells (Cnt, 2) ="バナナ" Then
Range(Cells(Cnt,1),Cells(Cnt,2)).Insert
End If
End If
End If
Next Cnt
本来は「みかん」と「バナナ」をまとめて、その上に「果物」の見出しをつけたいのに、
このコードだと「みかん」と「バナナ」のそれぞれ一行上に行が入ってしまいます。
どうしたら、まとめて一行だけ挿入することが出来るでしょうか?

38:デフォルトの名無しさん
17/01/08 22:25:17.31 KINgQhrq.net
>>36
俺が困るので先に言っとく
『行』とは横のことを指す(左の数字)
縦を指すときは『列』と呼ぶ(上の英字)
そこをふまえて
>B列が1行上の値と違う場合、1行上に行を挿入して、その行に「果物」と入れたい
と言う条件と
>「みかん」と「バナナ」のそれぞれ1行上に行が入ってしまいます。
と言う結果は整合性のある状態なので問題はないと思う
もしも望む結果ではないのであればまず
 >B列が1行上の値と違う場合、
を見直すことが必要
やりたい内容を鑑みれば
 B列に入力があり、1行上の値が空白である場合、
と変えればいいと思う

39:デフォルトの名無しさん
17/01/08 22:42:31.86 LSCp0tLP.net
>>37
そうですね、表現の仕方が間違っておりました。
フォーマットがもう決まってしまっているので、これで何とかしたいんですよね・・・。
どうしても、「みかん」「バナナ」をまとめて、一行上に行を挿入したいのですが。
今、思いついたのは、「みかん」「バナナ」にそれぞれ行が入ってしまうことは承知で、
「果物_01」「果物_02」と連番になるように設定して(やり方は分かっていないです)
それで_02の行は削除するというifを組んで、
さらに「果物_01」の行は「01」の部分を省くコードを書けばいいかな、と思ったりもしますが、
効率が悪いでしょうか?(やり方は分かっていないです、ただ思いつき)

40:デフォルトの名無しさん
17/01/08 22:49:26.11 KINgQhrq.net
>>38
条件を変えればいいと思う
A列(A5~Aずっと下まで)に「食物」が入力されていると仮定して、
B列が1行上の値と違う場合、
1行上に行を挿入して、その行に「果物」と入れたい

A行(A5~Aずっと下まで)に「食物」が入力されていると仮定して、
B列に入力があり、1行上の値が空白である場合、
1行上に行を挿入して、その行に「果物」と入れたい

41:デフォルトの名無しさん
17/01/08 23:15:02.67 LSCp0tLP.net
>>39
なるほど、そういう発想もありますね。
でもそうなると、どういうコードになるのでしょうか??(・・?)

42:デフォルトの名無しさん
17/01/09 00:15:41.73 t+szxcoe.net
すごい、エスパーがいるな
ちょっと日本語が意味わからないからアドバイス出来ないわ…

43:デフォルトの名無しさん
17/01/09 00:55:08.08 4/AW5Uyc.net
>>36
A列は全て 「食物」が入力されているのよね

B列にどのように入ってるの?
>B行に入る値
>・みかん
>・バナナ
これ以外は無い(すなわち空セル)って事?
コード見ると「りんご」 ってあるみたいだけど???
んで どのような結果を お望み?

44:デフォルトの名無しさん
17/01/09 00:58:47.84 5IQR8Haa.net
それって、
分類1
商品1
商品2
分類2
商品3
商品4
みたいなフォーマットなの?
もしそうなら、それは神エクセルだから、
>フォーマットがもう決まってしまっているので
そこをどうにかして、こう直したほうがいいと思うけど。
分類名 商品名
分類1  商品1
分類2  商品2

45:デフォルトの名無しさん
17/01/09 01:00:35.84 5IQR8Haa.net
違う、こうか。
分類名 商品名
分類1  商品1
分類1  商品2
分類2  商品3
分類2  商品4

46:デフォルトの名無しさん
17/01/09 02:56:04.77 JlqgPD3/.net
すみません、割り込みなのですが簡単な質問なので失礼します((+_+))

コマンドボタンを1回クリックするごとにラベルに100ごと加算される物を
作りたいのですが、↓だと、あたりまえですが1度クリックしかできません。

Private Sub CommandButton1_Click()
x = 100
Label1.Caption = x
End Sub

47:デフォルトの名無しさん
17/01/09 03:13:17.25 4/AW5Uyc.net
>>45
コマンドボタンとラベルは ユーザフォーム上なの? シート上なの?
どちらでも良い方法として
ラベルのプロパティ開いて Captionを 0 にしておく
その上で
Private Sub CommandButton1_Click()
 Label1.Caption = Label1.Caption + 100
End Sub

48:デフォルトの名無しさん
17/01/09 03:24:27.93 JlqgPD3/.net
>>46
ユーザーフォーム上です!ありがとうございました、無事できました!

49:デフォルトの名無しさん
17/01/09 04:07:15.85 JlqgPD3/.net
何度もすみません、45の者です。
45の続きで、ラベル1の値ーラベル2の値=差の値をラベル3に表示する
計算機をユーザーフォーム上に作りたいと思っています。
しかし以下ではエラー「一致する型がありません」とでます。
なぜなのでしょうか(T_T)

Private Sub CommandButton3_Click()
Label1.Caption = x '投入した金額
Label2.Caption = y '選択した金額
k = x - y
Label3.Caption = k
End Sub
-----------------
Private Sub CommandButton1_Click()
 Label1.Caption = Label1.Caption + 100 ←ここにエラ―がでる
End Sub
------------------
Private Sub CommandButton2_Click()
 Label2.Caption = Label2.Caption + 50
End Sub

50:デフォルトの名無しさん
17/01/09 04:23:14.16 4/AW5Uyc.net
>>48
>>46 を良く嫁
以上

51:デフォルトの名無しさん
17/01/09 10:17:57.42 EPA1tS/m.net
>>48
引き算するとこのx,yの代入逆だろ
x=ラベルキャプションってしないとなんも価入らんぞ
あとちゃんと変数は宣言してる?

52:デフォルトの名無しさん
17/01/09 10:41:01.31 HU0Vv46x.net
>>46
>ラベルのプロパティ開いて Captionを 0 にしておく
は前提として、プロパティを直接の演算の対象にするとダメなことはまれに経験したことがある
理由はわからないけど
そういう時は、変数をかまして回避した。たとえば、
Private Sub CommandButton1_Click()
Dim label1_c As Integer
label1_c = Label1.Caption
label1_c = label1_c + 100
 Label1.Caption = label1_c
End Sub

53:デフォルトの名無しさん
17/01/09 13:48:59.41 O0/XMIqD.net
シート1の表(2次元領域)をシート2やシート3に一行に横一列にコピーしたいのですが、
一旦シート1の表の値を変数ATAI(i)に入れて、シート2や3にコピーしてます。
また別の方法で直でシート1.COPY シート2でもコピーしてみました。
両方ともコピーするのが2万個ぐらいあるのですが、処理に3分ぐらいかかります。
もっと早くする方法はありますか?

54:デフォルトの名無しさん
17/01/09 13:50:27.27 JSUf7hDg.net
>>12
エラーで中断したら再計算しないけどな

55:デフォルトの名無しさん
17/01/09 14:36:04.75 SVvcq0Ni.net
下記のコードでObjectにするとSheet1のaを呼び出せるのですが
WSだとメソッドまたはデータメンバーが見つかりませんになってしまいます
wsの方か厳密のような気がするのですがObjectで正解なんでしょうか?
ThisWorkbook
Dim ws As Worksheet ' Objectにすると成功
Set ws = Sheets("Sheet1")
Call ws.a() ' エラー

Sheet1
Sub a()
End Sub

56:デフォルトの名無しさん
17/01/09 14:36:23.83 EPA1tS/m.net
>>52
Dim rng as Range
set rng = Range(元データ開始セル,元データ終了セル)
Range(貼り付け先開始セル,貼り付け先終了セル) = rng
って感じでやると早くない?
もしかしたらvariant型の変数にした方が早いかもしれんけど
OfficeTANAKAに高速化テクニックって感じで載ってるよ

57:デフォルトの名無しさん
17/01/09 14:37:11.58 EPA1tS/m.net
>>53
あのな?「作り終わったら」ってどういう意味かわかるか?

58:デフォルトの名無しさん
17/01/09 14:51:56.79 4FVlGxEy.net
>>54
目的に合致してれば
問題ないです

59:デフォルトの名無しさん
17/01/09 15:00:52.77 cjVtQucR.net
>>54
Sheet1.NameがSheet1じゃないのかも

60:54
17/01/09 15:30:22.93 SVvcq0Ni.net
もう一個謎が
Workbook_SheetChange(ByVal ws As Object, ...
Call ws.a() ' エラー
Call Sheets(ws.Name).a() ' 成功
となり訳が分かりません...
>>57
理解できてないとなにか気持ち悪いです
>>58
同じにしてあります;;
セルやらシートがあるのでvbaってjsやpyより難しい気がします
basicの構文も癖があるし・・

61:デフォルトの名無しさん
17/01/09 16:49:38.66 dWF3ZE3B.net
>basicの構文も癖があるし・・
www

62:デフォルトの名無しさん
17/01/09 16:53:01.88 6xa3UP1L.net
プロシージャをcallで呼び出すのと何も付けないで呼び出すのとでは何が違うのでしょうか?
後者だと参照渡しになりませんでしたが。

63:デフォルトの名無しさん
17/01/09 16:53:39.75 I9s0ZByk.net
>>59
他の人が追試出来るように端折らないコード乗せて。

64:デフォルトの名無しさん
17/01/09 16:57:16.33 6xa3UP1L.net
もうわかったのでいいですすいません

65:デフォルトの名無しさん
17/01/09 17:21:48.98 EPA1tS/m.net
>>63
解決したならそれをのせろや

66:デフォルトの名無しさん
17/01/09 17:22:57.78 SVvcq0Ni.net
>>62
新規の空ファイルで
ThisWorkbook
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Call sh.test
'Call Sheets(sh.Name).test
End Sub
Sheet1
Sub test()
MsgBox "テスト"
End Sub

67:デフォルトの名無しさん
17/01/09 18:15:14.29 Z/GXP5pv.net
>>65
sh.Name="Sheet1"
を確認しないとダメな気がする

68:デフォルトの名無しさん
17/01/09 18:21:35.53 Z/GXP5pv.net
>>66
動的にイベントが発生するまでシートを確定できないからコンパイルでエラーになるみたいだよ

69:デフォルトの名無しさん
17/01/09 18:23:08.68 Z/GXP5pv.net
オブジェクト名でSheet1.testとすればコンパイルも通るし実行時エラーも出ない

70:デフォルトの名無しさん
17/01/09 18:39:16.88 SVvcq0Ni.net
>>66-68
ありがとうございますm(__)m
VBAはコンパイラだったのですね
納得しました

71:デフォルトの名無しさん
17/01/09 18:56:01.43 jLw81RF+.net
>>61
厳密にいうと参照渡しになっている。
変数aをカッコで囲んで(a)とすると、aのコピーが一時オブジェクトとして作られ、それがプロシージャに渡されるので、
元の変数aそのものはプロシージャに渡らない。
プロシージャ a

Call プロシージャ(a)
が等価で、
プロシージャ (a)

Call プロシージャ((a))
と等価になる

72:デフォルトの名無しさん
17/01/09 19:32:58.81 6xa3UP1L.net
>>70
カッコにそういう意味があったとは・・・!
わかりやすかったです、ありがとうございました。

73:デフォルトの名無しさん
17/01/09 22:18:09.21 vYvrwg8z.net
>VBAはコンパイラだったのですね
えっ

74:デフォルトの名無しさん
17/01/09 22:32:30.71 o7+xqhMd.net
>>42-44
分かりづらく失礼しました。
途中のりんごは不要です。
また、B列には他の食べ物が入りますが、ここでは果物に分類されないので、省略しました。
Sub 入力
一番上 = 5
一番下 = Cells(Row.Count,1).End(xlup).Row
For Cnt = 一番上 To 一番下
If Cells(Cnt,1)="食物"
If Cells(Cnt-1,2)<> cells(Cnt,2) then
If cells(Cnt,2)="みかん" or Cells (Cnt, 2) ="バナナ" Then
Range(Cells(Cnt,1),Cells(Cnt,2)).Insert
End If
End If
End If
Next Cnt

75:デフォルトの名無しさん
17/01/09 22:32:55.53 o7+xqhMd.net
で、希望するフォーマットとしては
 果物
食物バナナ
食物みかん
食物その他(仮)



としたいわけです。ところが、自分の作ったシートだと
 果物
食物バナナ
 果物
食物みかん
食物


となってしまうわけです。これで分かりやすくなったでしょうか・・・

76:デフォルトの名無しさん
17/01/09 22:40:49.82 LQfxW/qY.net
馬鹿ばっかで頭が痛くなるスレだ

77:デフォルトの名無しさん
17/01/09 22:45:04.08 O0/XMIqD.net
>>55 ありがとう。 結局いろいろ試しましたが、セルに関数貼りつけました・・・・。
手動でセルに関数貼りつけたほうが早かったです・・・。

78:デフォルトの名無しさん
17/01/09 23:29:23.35 4/AW5Uyc.net
>>74
やりたい事こんな感じ?
※なお 区別する種類が多いとこの手法は結構大変なので
考え直さないとだけど
Sub 入力()
一番上 = 5
一番下 = Cells(Rows.Count, 1).End(xlUp).Row
'下から上に処理してく
For cnt = 一番下 To 一番上 Step -1
 'cnt行の品名
 品名1 = Cells(cnt, 2).Value
 'cnt行の一つ上の品名
 If cnt <> 一番上 Then
  品名2 = Cells(cnt - 1, 2).Value
  Else
  品名2 = ""
 End If
 '行挿入
 If 品名1 = "みかん" Or 品名1 = "バナナ" Then
 If 品名2 <> "みかん" And 品名2 <> "バナナ" Then
  Range(Cells(cnt, 1), Cells(cnt, 2)).Insert
  Cells(cnt, 2) = "果物"
 End If
 End If
Next
End Sub

79:デフォルトの名無しさん
17/01/09 23:32:51.18 cjVtQucR.net
>>72
メニューにコンパイルってあるけど

80:デフォルトの名無しさん
17/01/09 23:43:50.55 dVuv1+mu.net
>>76
んー
二万件あっても直接レンジでやり取りすればそんな時間かからんと思うけどな
まあいいや、解決したなら乙だ

81:デフォルトの名無しさん
17/01/09 23:47:23.09 SFPxoHKZ.net
>>74
本当はVBA必要ないのに、
神エクセルを作ることによって、
VBAが必要になってしまっているのではないか?
果物・・・食べ物の種類
バナナ・・・果物
みかん・・・果物
項目以外で、違うものを同じ列に入れる?

82:デフォルトの名無しさん
17/01/10 00:09:16.68 hjeg5IZ9.net
食物が列にあって果物を見出しにする謎を解決しないと先に進まないんじゃないか

83:デフォルトの名無しさん
17/01/10 10:38:11.72 yHxqwlUe.net
>>18
大変遅くなりました。
>「元の画像より少し小さいシェイプを作成して取得する」
はなかなかの妙案だと思いましたが、関数化してループさせた場合処理速度に問題があったので、
既存のプロパティを自力で補正するように書き換えてみました。
Excelは左上をセルの左上に合わせて配置しても、画像の右下のグリップで拡大した場合、
低確率で.Topと.Leftの値が微妙に変化する(たとえば C3に置いた写真の.Top=37.5が37.4999...に変わってしまう。)
ようなので、何パターンか検証した結果、小数点以下第三位を四捨五入で正確に出る事がわかりました。
手動配置している場合に余裕を持たせられるようデフォルト値付きの省略可能引数にしています。
Sub TestGetShapeToRange()
Dim SP As Shape
For Each SP In Selection.Parent.Shapes
If SP.Name = Selection.Name Then Exit For
Next
Range(GetTopLeftCell(SP), GetBottomRightCell(SP)).Select
End Sub
長すぎと怒られたので 次レスへ

84:デフォルトの名無しさん
17/01/10 10:38:44.28 yHxqwlUe.net
>>82 の続き
'Shape.TopLeftCellの誤差補正後の左上セルを取得する関数
Public Function GetTopLeftCell(SP As Shape, Optional num_digits As Integer = 2) As Range
Set GetTopLeftCell = SP.TopLeftCell
If GetTopLeftCell.Offset(1).Top <= Round(SP.Top, num_digits) Then
Set GetTopLeftCell = GetTopLeftCell.Offset(1)
End If
If GetTopLeftCell.Offset(, 1).Left <= Round(SP.Left, num_digits) Then
Set GetTopLeftCell = GetTopLeftCell.Offset(, 1)
End If
End Function
'Shape.BottomRightCellの誤差補正後の右下セルを取得する関数
Public Function GetBottomRightCell(SP As Shape, Optional num_digits As Integer = 2) As Range
Set GetBottomRightCell = SP.BottomRightCell
If GetBottomRightCell.Top >= Round(SP.Top + SP.Height, num_digits) Then
Set GetBottomRightCell = GetBottomRightCell.Offset(-1)
End If
If GetBottomRightCell.Left >= Round(SP.Left + SP.Width, num_digits) Then
Set GetBottomRightCell = GetBottomRightCell.Offset(, -1)
End If
End Function
以上、ご報告まで。

85:デフォルトの名無しさん
17/01/10 12:02:57.55 yHxqwlUe.net
連投すいません。次の質問です。
以下のようなマクロがあります。
1.非モーダルのユーザーフォーム(fm)が常駐
2.ユーザーが任意で複数の画像を選択
3.fm上のボタンをユーザーがクリックして下記のような処理を実行
For each obj in Selection
obj.cut
ActiveSheet.PasteSpecial Format:="図 (JPEG)"
Next
すると、最後にPasteしたShapeを選択した状態でマクロが終了します。
ESCを押して選択を解除するような操作をVBAで再現するにはどうしたら良いのでしょうか。
・マクロの記録では、ESCでShapeの解除は記録されませんでした。
・Application.SendKeys "{ESC}"を試してみたのですが、反応がありませんでした。
・ユーザーフォームにフォーカスが取られているのかと思いActiveWorkbook.ActivateやActiveWindow.Activateを入れたのですが無反応でした。
強引な解決策を考えましたが、もっとスマートな方法が無いかと探しています。
・終了後に適当なRangeをSelectしてからScrollRow/ScrollColumnして元の位置に戻す。
・シートのSelectionイベントで直前までに選択されたRangeを保持する。
ご教示のほどよろしくお願い致します。

86:デフォルトの名無しさん
17/01/10 15:45:40.53 8VGVrhFD.net
>>84
君の思う スマートな方法が どんなものだかは分らんが
どこかのセルを選択するのが一番簡単だと思う
適当なセルだとスクロールしてしまうのがイヤなら
・選択されてるShapeの右上のセルを選択
・画面上の左上のセルを選択
とかでいいんじゃね?

87:85
17/01/10 15:47:43.23 8VGVrhFD.net
間違った
× ・選択されてるShapeの右上のセルを選択
○ ・選択されてるShapeの左上のセルを選択

88:デフォルトの名無しさん
17/01/10 17:40:05.82 yHxqwlUe.net
>>85
とりあえずは、表示画面の左上セルをSelectするようにしたいと思います。
>スマートな方法
いわゆるobj.Unselect()メソッドとか、obj.Select(false)のような選択解除専用の機能は無いか。という事です。
Excel VBAって思わぬオブジェクトに実装されていたりするので・・・

89:デフォルトの名無しさん
17/01/11 08:57:05.13 J0hUcFsW.net
マクロでなく操作で非選択って出来る?
結局は別のものを選択してるよね

90:デフォルトの名無しさん
17/01/11 09:00:21.43 v+irSj+y.net
>>87
プロパティ的なもんはオブジェクトブラウザかなんかで調べれば出てくるんじゃないの

91:デフォルトの名無しさん
17/01/11 12:03:53.06 tc1gJPs0.net
自動で名前を付けて保存したくて、いろいろ調べて形にはなったのですが
A1に日付が2017/01/11と入ってる場合
そのセルを引用したらスラッシュも入ってしまい保存の時にいちいち消すのに困っています。
保存の時にだけスラッシュを消す方法有りませんか?

92:デフォルトの名無しさん
17/01/11 12:12:47.07 p4WB0UzK.net
>>90
format

93:デフォルトの名無しさん
17/01/11 12:31:15.82 tc1gJPs0.net
InitialFilename:=Format(Range("A1"), "yyyymmdd")
このような形でいいのでしょうか?

94:デフォルトの名無しさん
17/01/11 12:34:16.38 I7PY9KYr.net
うちの会社ではほぼ全PCをシンクライアントにしてからというものの
ExcelVBAのマクロを保存してた「PERSONAL.XLSB」が使えなくなりました。
シンクライアントでは「PERSONAL.XLSB」に相当する機能を使用するにはどうしますか?
あとこれが本題なのですが
OutlookとWordも、それらのVBAをデフォルト的個人ファイルに保存して高頻度で使用していました。
特にOutlookのVBAでは便利なマクロを作っていました。
シンクライアントでもそれらの機能を使用するにはどうしますか?

95:デフォルトの名無しさん
17/01/11 12:35:59.27 p4WB0UzK.net
指定の位置に日付が入ってるのであればそれでよいはず

96:デフォルトの名無しさん
17/01/11 12:38:17.27 tc1gJPs0.net
>>94
ご丁寧にありがとうございます!

97:デフォルトの名無しさん
17/01/11 12:48:03.28 p4WB0UzK.net
>>93
単純に移行すれば使えると思う
以前使ってたpersonal.xlsbを所定の位置に配置すればできるはず

98:デフォルトの名無しさん
17/01/11 12:50:26.58 I7PY9KYr.net
>>96
シンクライアントでは普通の方法ではCドライブが見えないんです。
別の方法で見つけてそこに入れても、次の日にPCを起動したときにそのファイルは消えてしまっているから
わざわざファイルを移動する方法では無駄になってしまうんです。毎日する必要になるから面倒で。

99:デフォルトの名無しさん
17/01/11 12:53:38.45 xxQxfc5N.net
>>97
会社のシステム担当者に聞けばいいよ

100:デフォルトの名無しさん
17/01/11 13:


101:08:46.29 ID:uU4tfKci.net



102:デフォルトの名無しさん
17/01/11 13:08:59.59 I7PY9KYr.net
>>98
どこにその部署があるかわからないし
勝手にツール作らないでくださいといわれてそれを禁止されるリスクもあるから
自分の力で解決したいのですが。

103:デフォルトの名無しさん
17/01/11 13:15:26.49 I7PY9KYr.net
Windowsのスタートアップもシンクライアントになって以来使えません(毎回PC起動時にはここは空になります)。
どうすればシンクライアントでもスタートアップ機能を使えるでしょうか?

104:デフォルトの名無しさん
17/01/11 13:37:35.00 f6yusNGM.net
>>101
管理者側で許可設定してもらわない限り、シンクラでカスタマイズは無理
そして許可はまず下りない
あきらめろ

105:デフォルトの名無しさん
17/01/11 13:38:29.71 uU4tfKci.net
完全にVBA無関係じゃん
スレチ

106:デフォルトの名無しさん
17/01/11 13:38:35.27 QIrTsKqr.net
>>101
板違い Windows板かパソコン一般板かPC初心者板へ

107:デフォルトの名無しさん
17/01/11 13:45:44.75 1bci6XNy.net
>>92
聞く前にやりなよそのくらいって思うんだが
1から10まで聞かないとなにもできないの?

108:デフォルトの名無しさん
17/01/11 15:28:17.61 qQgm92T6.net
ここはthinクライアントでCドライブに何か入れたいみたいな馬鹿が来るようなところだから

109:デフォルトの名無しさん
17/01/11 18:57:51.34 dcC69ZSQ.net
エクセルのメニュー、アイコン、リボン、などを初期設定状態に戻す方法はありませんか。
すみません初心者的

110:デフォルトの名無しさん
17/01/11 19:28:32.74 uU4tfKci.net
>>107
リセットボタンあるよ
URLリンク(www.helpforest.com)

111:デフォルトの名無しさん
17/01/11 20:14:53.64 anvEc3zp.net
レジストリの該当部を削除すれば(それかリネームすれば)元に戻るよ。
と思ったらリセットボタンあるのか。そちらの方がいいですね。

112:デフォルトの名無しさん
17/01/11 20:23:03.75 1FwZUW9V.net
VBAのスレなんだからこんなの教えんなよ…

113:デフォルトの名無しさん
17/01/11 22:54:27.23 QIrTsKqr.net
スレチ質問もスレチ回答も荒らし

114:デフォルトの名無しさん
17/01/11 23:23:15.83 JMe0AUgT.net
>>90
まだこういう勘違いしている人がいるんだな・・
A1には2017/01/11と入ってるわけじゃない
42746という数字が入ってるだけ

115:デフォルトの名無しさん
17/01/12 05:41:59.32 nMoQZoqt.net
>>109
なんだこのアホな回答

116:デフォルトの名無しさん
17/01/12 07:13:34.10 0A4eRqXF.net
>>112
アスペ乙

117:デフォルトの名無しさん
17/01/12 08:41:15.75 Lhyp+MOo.net
>>112
[A1].Valueが 2017/01/11 なのです。

118:デフォルトの名無しさん
17/01/12 09:48:23.99 Rj8+4pg/.net
[A1].Textじゃなくて?

119:デフォルトの名無しさん
17/01/12 11:56:09.07 Cc5O9IhJ.net
お前の会社のことはお前の会社でなんとかしろよ

120:デフォルトの名無しさん
17/01/12 12:29:26.83 Lhyp+MOo.net
>>116
表示形式が yyyy/m/d だと Text は 2017/1/11

121:デフォルトの名無しさん
17/01/12 12:45:45.01 6ppTquF5.net
[A1].Value2と[A1].Formatが正常に定義されてるなら
あとはFormat関数で好きに取り出せるんじゃ無いかな

122:デフォルトの名無しさん
17/01/12 20:01:33.08 6fAXJ0U3.net
例え元のデータが何であっても「日付として解釈出来る形式」ならDate型に入れれば変換してくれるだろ。

123:デフォルトの名無しさん
17/01/12 20:07:33.99 yR99XFwh.net
で?っていう

124:デフォルトの名無しさん
17/01/12 20:39:27.21 UE8PLb8+.net
日付が数字で入ってるかどうかなんて質問に関係ないよな

125:デフォルトの名無しさん
17/01/12 20:42:03.60 eBGwra53.net
>>122
型によって処理が変わると思うのだが

126:デフォルトの名無しさん
17/01/12 20:46:28.71 UiBlAwbG.net
>>123
Date型の変数に入れれば日付になるじゃん

127:デフォルトの名無しさん
17/01/12 20:54:08.91 yR99XFwh.net
不勉強で申し訳ないが世に文字列以外のファイル名を採用したファイルシステムがあるのなら是非教えて頂きたい

128:デフォルトの名無しさん
17/01/12 21:08:16.17 eBGwra53.net
>>124
例えば
2017/1/12
20170112
1/12/2017
シリアル値
全部同じになるっけ?

129:デフォルトの名無しさん
17/01/12 21:22:08.35 UiBlAwbG.net
>>125
誰がそのまま使うって言ってんの
fileName = baseName & cStr(dte)
みたいな使い方するわけでしょ
>>126
知らんけど表示形式が違うだけならなるんじゃねえの

130:デフォルトの名無しさん
17/01/12 22:11:57.92 Mdtl8esZ.net
じゃ無いかな くれるだろ 思う 知らんけど じゃねえの
もはや、妄想・空想・予想のスレッドに成り果てたか
盆、暮れ、正月ぐらいせめて少しは頭を休ませてろ

131:デフォルトの名無しさん
17/01/12 22:24:16.56 URc2UNFw.net
あいてるセルにファイル名を生成する関数つくって、そのセル参照させればいいだけじゃないのけ?
保存場所どこにするかによってはスペースは使えないが。

132:デフォルトの名無しさん
17/01/12 22:26:45.06 VnxSw5mv.net
>>95で解決した話題がまだ続いてる

133:デフォルトの名無しさん
17/01/12 22:40:44.11 URc2UNFw.net
>>130
そうなんだ・・・しつれいした

134:デフォルトの名無しさん
17/01/12 23:01:38.74 Rj8+4pg/.net
>>125
大型機だとファイルには整数のID番号が付いてるだけでファイル名とは切り離されて管理されてるやつがあるな
だから同じ名前のファイルがいくつも作れてしまったりする

135:デフォルトの名無しさん
17/01/13 12:38:07.17 XGAIFzZi.net
Sheet1     Sheet2
A    B    A    B
東京  5    大阪   ○
大阪  4    福岡   ×
福岡  8    東京   ○

Sheet1
A    B   C
東京  5   ○
大阪  4   ○
福岡  8   ×
Sheet1のA列を軸にSheet2のB列の値を抽出する場合、
For~ 'Sheet1A列を順番に
 For~ 'Sheet2A列を順番に
  IF~ 'Sheet1C列に代入
 Next
Next
もしくは
For~ 'Sheet1A列を順番に
 Find.Row 'Sheet1A列の値を検索
 'Sheet1C列に代入
Next
どちらのほうが処理速度が向上しますか?

136:デフォルトの名無しさん
17/01/13 12:39:52.43 xEiCBlzV.net
>>133
vlookup

137:デフォルトの名無しさん
17/01/13 12:43:08.31 5NHpz1Ta.net
>>134
vlookup→配列に入れてif分岐→findの順番の早さ
findが遅いのは確か

138:デフォルトの名無しさん
17/01/13 12:58:05.11 dokIsM4J.net
>>133
シートでsql

139:デフォルトの名無しさん
17/01/13 13:02:40.73 5NHpz1Ta.net
findが遅いって言ってもセルを直接参照して処理するよりは早い

140:デフォルトの名無しさん
17/01/13 13:15:44.54 HxNmVQ/n.net
>>137
ってことは、後者のほうが速いということでしょうか?

141:デフォルトの名無しさん
17/01/13 13:24:35.21 Pq7AWenX.net
vlookup→配列に入れてif分岐→find→セルを直接参照してif分岐

142:デフォルトの名無しさん
17/01/13 13:32:41.32 q4yhPByZ.net



143:っと、関数は使うつもりはありません 伝えてなくてすいません



144:デフォルトの名無しさん
17/01/13 13:33:30.31 q4yhPByZ.net
携帯回線のせいでIDがコロコロ変わる…
>>133です

145:デフォルトの名無しさん
17/01/13 13:43:05.20 xEiCBlzV.net
>>140
vbaにはWorksheetFunctionと言うクラスが用意されている
その中にvlookupと言うメソッドがあるのでそれを利用すればいかが?
これを使いたくないってことなら勘違いでごめんなさい

146:デフォルトの名無しさん
17/01/13 13:58:35.74 5NHpz1Ta.net
>>138
OfficeTANAKA 高速化テクニックでググれば幸せになれるよ

147:デフォルトの名無しさん
17/01/13 17:01:55.73 OhnPZwk7.net
ジャパネット・・・

148:デフォルトの名無しさん
17/01/13 22:23:24.75 N+jcCuX6.net
ていうか何行あるんだよ。
少なければWorksheetFunction.Vlookupで十分。
多ければ、高速VlookupかSQL。

149:デフォルトの名無しさん
17/01/13 22:45:47.47 IUqNU+pk.net
Sub test()
Dim d, e
Set d = CreateObject("Scripting.Dictionary")
Set e = CreateObject("Scripting.Dictionary")
For Each x In Range(Sheet1.Cells(1, 1), Sheet1.Cells(Rows.Count, 1).End(xlUp))
If Not d.exists(x.Value) Then d.add x.Value, x.Offset(0, 1).Value
Next
For Each x In Range(Sheet2.Cells(1, 1), Sheet2.Cells(Rows.Count, 1).End(xlUp))
If Not e.exists(x.Value) Then e.add x.Value, x.Offset(0, 1).Value
Next
For Each x In d.keys
Debug.Print x & ":" & d(x) & ":" & e(x)
Next
End Sub

150:デフォルトの名無しさん
17/01/14 14:19:38.12 eOx3RZdu.net
以下を実現するexcel vbaの書き方を教えてください。
お願いします。
セルA1に aaa

151:デフォルトの名無しさん
17/01/14 14:20:50.66 eOx3RZdu.net
以下を実現するexcel vbaの書き方を教えてください。
お願いします。
セルA1に aaa"bbbb"cc
セルA2に a"dd"cccc
という文字列があるとき、
セルB1に bbbb
セルB2に dd
(それぞれ、" "で挟まれた文字列)を出力する。

152:デフォルトの名無しさん
17/01/14 14:28:13.29 hMPeMSWC.net
>>148
split

153:デフォルトの名無しさん
17/01/14 14:36:22.91 l+bXNSZh.net
>>148
Sub Macro1()
  [B1] = Split([A1], """")(1)
  [B2] = Split([A2], """")(1)
End Sub

154:デフォルトの名無しさん
17/01/14 14:59:32.62 TCZ/fLWF.net
>>148
文字列関連の関数あらかた覚えなさい
難しくないから

155:デフォルトの名無しさん
17/01/15 11:53:32.85 ncM8p+KA.net
>>145
高速vlookupって何?

156:デフォルトの名無しさん
17/01/15 12:46:48.76 m2E/VbcR.net
このスレのテンプレにOfficeTANAKA入れたら質問激減しそう
ってレベルの質問が来るとガクッと来る

157:デフォルトの名無しさん
17/01/15 14:21:19.63 FqEOuXry.net
ガクッと来るのも自由、回答したくないなら回答しないのも自由
レベルの制限をしてるわけじゃなし

158:デフォルトの名無しさん
17/01/15 14:36:53.95 m2E/VbcR.net
>>154
まあそらそうなんだけども
ググった方が早くねって言うね

159:デフォルトの名無しさん
17/01/15 18:05:40.34 trUVIHlw.net
確かに「まずググれよ」と思う質問はたまにあるな。
検索の仕方も分からないような状態ならともかく、
このスレに書いてる単語を並べていけばたどり着くだろ的なのも多い。
ちゃんとしたサイトの方が図で説明してくれるから分かりやすいだろうし。

160:デフォルトの名無しさん
17/01/15 19:40:36.26 1Rt+ERT2.net
>>152
検索対象を昇順ソート
      ↓
VLOOKUPで1列目の文字を近似値一致検索
(但しA:Aとかは駄目で、A1:A500とかにする)
      ↓
検索で引っかかった文字が、
検索値と完全一致なら、
再度VLOOKUPで近似値一致検索

正直、何でこれで速くなるのかわからんし、
普通のVLOOKUPの検索アルゴリズムも、
最初からそうしろよって思う。

161:デフォルトの名無しさん
17/01/15 21:24:21.25 tflJaJ6v.net
>>157
とにかく完全一致検索が遅いから使いたくない、じゃどうするか
ってことなんででしょうね。
Office Tanakaの
URLリンク(officetanaka.net)
に「検索値が見つからないとき超えない最大値を返す仕様がとても助かる」とあるけど
検索値をはさむ[from, to]がわかるのが一番助かると思う。
(検索値が存在しない場合は、to < from)

162:デフォルトの名無しさん
17/01/16 02:21:21.17 vCWbmiBt.net
>>157
完全一致だとデータがソートされてる保証が無いから全件検索必須
近似値指定だとデータがソートされてる前提だから効率的に探せる
そいう事だろ、たぶん

163:デフォルトの名無しさん
17/01/16 03:49:06.71 L7GtxIZz.net
二分検索木とか知らん馬鹿ばっか

164:デフォルトの名無しさん
17/01/16 05:39:23.40 /FyYs0Da.net
>>160
馬鹿です。
Google先生に聞いたら「もしかして二分探索木?」と言われてしまいました。
これが高速Vlookupの原理?
WikiPediaで調べてみたのですがピンときません。
分かりやすい解説サイトでもあれば教えてください。
# 旧いMac(System7時代)のFileAllocationTableに B-Treeなんたら
というものがあったような、、関係あるのかな?

165:デフォルトの名無しさん
17/01/16 05:48:43.71 K1gRWFXI.net
ソート済のデータ検索なら バイナリサーチ(二分探索)じゃね?

166:デフォルトの名無しさん
17/01/16 07:22:24.37 Zl2rcSDP.net
>>160
木構造にはなっていないのでは?

167:デフォルトの名無しさん
17/01/16 08:37:09.32 6pMMhvrL.net
>>163
二分探索は別に木構造じゃなくても...
って書こうとしたら >>160 は「二分検索木」って書いてたのか
まあ検索でも間違いじゃないだろうけどあまり使わないような気がするな

168:デフォルトの名無しさん
17/01/16 11:22:13.15 q0YsoZyP.net
ソート済の二分探索なら100個の時7回ループ、500個なら9回、100万個でも20回ループすれば終わるから

169:デフォルトの名無しさん
17/01/16 15:06:17.75 CkU8X3ZM.net
30もない俺のシートじゃ意味なさそうやな

170:デフォルトの名無しさん
17/01/16 23:26:54.44 Py9dY2eU.net
ソート済でも完全一致が遅いのは何故?
一致するのを見つけたら、それ以上探さないで次に行けば、
近似値でも同じことじゃないかと思うんだけど。

171:デフォルトの名無しさん
17/01/16 23:32:38.53 Zl2rcSDP.net
>>167
ソート済かどうかなんてわからないから頭から舐めていく

172:デフォルトの名無しさん
17/01/17 00:13:17.79 HvycQCZc.net
>>168
一致するのが複数あっても、
どうせ1番上の1個しか拾ってこないんだから、
見つかった時点でループ抜けりゃいいじゃんって事なんだけど。
近似値だと探し方が違うの?

173:デフォルトの名無しさん
17/01/17 00:17:50.89 jzPK8o2C.net
>>169
いやだから頭から一つ一つ舐めていく必要があるかどうかの違い

174:デフォルトの名無しさん
17/01/17 00:26:02.89 Upzxz6/t.net
>>170
近似値だと頭から見なくてよいのはなんで
具体的にどうやってると考えてるの

175:デフォルトの名無しさん
17/01/17 00:28:39.30 jzPK8o2C.net
>>171
辞書で単語を引くときにやっているやり方さ

176:デフォルトの名無しさん
17/01/17 00:32:26.63 Upzxz6/t.net
>>172
辞書を作るときは頭から見なくてよいの?

177:デフォルトの名無しさん
17/01/17 01:00:47.32 035vzIzN.net
>>173
書籍としての辞書を利用するときをイメージするといいかも
まず視覚的に先頭文字の見出しの位置を開いて調べる
この感覚
近似値を利用する場合は「文末違うけどだいたいこんな感じだよね」って得るためより正確な情報を得るためにはソートする必要がある
完全一致だとそもそも一致していることが条件となるのでソートする必要がなくなる


178: 正確に言うと異なると思うけどだいたいこんなイメージ



179:デフォルトの名無しさん
17/01/17 01:13:18.56 mp4Rluyj.net
URLリンク(msdn.microsoft.com)(v=office.14).aspx#xlLookups

180:デフォルトの名無しさん
17/01/17 06:36:26.66 Upzxz6/t.net
>>174
完全一致でも昇順に並べられていることを前提とすれば辞書方式が使えると思うけどな

181:デフォルトの名無しさん
17/01/17 07:13:51.32 jzPK8o2C.net
>>176
使えるが そういう仕様に なってない

182:デフォルトの名無しさん
17/01/17 09:11:54.79 035vzIzN.net
個人的には完全一致の場合ソート不要って仕様はありがたい

183:デフォルトの名無しさん
17/01/17 19:24:38.16 gxb7F/t0.net
>>175
いろいろ勉強になりました。
十数年、vlookupは特殊な場合を除いて完全一致で使うものだと思っていました。
数十万のvlookupをかけて3時間ぐらい帰ってこないような処理をしたことがあり
いま考えると無謀だったなと、、

184:デフォルトの名無しさん
17/01/17 20:31:05.76 EPmzwVho.net
xml文を読み込んで階層、パラメータ名、設定値を求めるvbaの書き方がわかりません。
どなたか教えてくださいお願いします。
イメージ図:
URLリンク(www.dotup.org)
I1にXML文、A~G列の1-2行目がある状態でVBAを実行すると、
A~G列の3行目から下が出力されるイメージです。
XML文全体は約500行のものが複数、どれも階層は4以下です。
以上、よろしくお願いします。

185:デフォルトの名無しさん
17/01/17 21:21:06.99 pDqJREhG.net
>>180
この辺りを見てがんばれー
URLリンク(freefly3104.hatenablog.com)

186:デフォルトの名無しさん
17/01/17 21:22:53.32 UOrZs7iT.net
>>180
ノード名もパラメーターとして出す(イメージ図で言う太字の箇所)
で良いのかい?
あと、階層の各列には同じ数値しか入らない
で良いのかい?
これを求めているのなら求めているで構わないけど得られる結果をまた精査することになると思う

187:デフォルトの名無しさん
17/01/17 21:47:24.91 pDqJREhG.net
>>180
あと出力順が
1
 2
  3
  3
  3
のようになってるけど
1
 2
  3
  3
 2
  3
つまり Subject が2回出力されるんじゃダメ?

188:デフォルトの名無しさん
17/01/17 21:49:25.15 EPmzwVho.net
>>181
ありがとう。
実はこのサイトとかを参考に試行錯誤したがうまくできくてここで尋ねたんだ。
>>182
はい、おっしゃる通り
・ノード名もパラメータとして(太字で)出す。
・階層の各列には同じ数字しか入らない。B列は空白か1か、C列は空白か2、・・・。
です。

189:デフォルトの名無しさん
17/01/17 21:53:52.16 EPmzwVho.net
>>183
1
 2
  3
  3
 2
  3
のようにSubjectを2回出力するのだとだめです、申し訳ない。
これも、1人でできない原因の一つです。
許されたらfor文で各行に対してsplitとか使えばなんとかなりそうだけど・・・

190:デフォルトの名無しさん
17/01/17 23:53:22.45 HYIsieSI.net
>>185
その場合
&lt;xxx ...>
 <...>
 <...>
</xxx>
<yyy ...>
 <...>
 <...>
</yyy>
<xxx ...>
 <...>
 <...>
</xxx>
の場合はどのように出力するの?
タグ名毎に集約するの?

191:デフォルトの名無しさん
17/01/17 23:55:02.78 HYIsieSI.net
最初が化けた...
<xxx ...>
 <...>
 <...>
</xxx>
<yyy ...>
 <...>
 <...>
</yyy>
<xxx ...>
 <...>
 <...>
</xxx>
のケースね。

192:デフォルトの名無しさん
17/01/18 00:16:31.88 P2ujaP/J.net
>>187
はい、そのケースではタグ名毎に集約します。つまり、
<xxx ...>
<...>←yの上の1行目
<...>←yの上の2行目
<...>←yの下の1行目
<...>←yの下の2行目
</xxx>
<yyy ...>
<...>
<...>
</yyy>
と同値とみなします。(Fの列にyyyが1つだけ出る)
ただし、
<xxx ...>
<yyy ...>
</yyy>
</xxx>
<zzz ...>
<yyy ...>
</yyy>
</zzz>
のように階層が異なったり、一つは<xxx>,もう一つは<zzz>の下にあるような場合は、
<xxx>の下の<yyy>と<zzz>の下の<zzz>は別のものとして扱います。(Fの列にyyyが複数出る)

193:デフォルトの名無しさん
17/01/18 07:02:26.64 KfZHaLf7.net
>>188
<xxx ...>
<yyy ...> -- (1)
</yyy>
</xxx>
<zzz ...>
<yyy ...> -- (2)
</yyy>
</zzz>
<xxx ...>
<yyy ...> -- (3)
</yyy>
</xxx>
のケースで (1) と (3) も集約するの?
たぶん xml からの読み込みと集約処理を分けた方がいいと思う。

194:デフォルトの名無しさん
17/01/18 08:46:32.65 dxlKDUod.net
>>189
携帯から失礼します。
はい、その場合も集約します。
具体的にはどんなコードで書いたらよろしいですかね。

195:デフォルトの名無しさん
17/01/18 10:08:50.79 nvWV6Cl1.net
URLリンク(youtu.be)

196:デフォルトの名無しさん
17/01/18 10:46:36.89 mepmwC6J.net
Dictionaryの配列で書けるでしょ

197:デフォルトの名無しさん
17/01/18 12:19:13.71 zXM8oXoh.net
なんで、XMLParser を自分で作るの?
Groovy とかで、すぐに出来るだろ

198:デフォルトの名無しさん
17/01/18 12:35:52.38 4FnlBNL6.net
>>193
すぐw
じゃあ書いてみろよ

199:デフォルトの名無しさん
17/01/18 12:38:39.68 NBGHKSlQ.net
さすがに MSHTML.HTMLDocument オブジェクトとかは使うんだろうと思っていたが違うのかな?

200:デフォルトの名無しさん
17/01/18 12:54:48.99 Fv9px6Lv.net
特定のセルが書式を設定されてるかどうかの判定ってどうすればいいでしょうか?
例えば文字が入ってなくても色や太さが設定されてるとか

201:デフォルトの名無しさん
17/01/18 13:04:49.97 UZ6KtMVe.net
>>196
普通にセルのプロパティで取得すればいいんでない

202:デフォルトの名無しさん
17/01/18 13:07:57.97 Fv9px6Lv.net
>>197
If Range("A1").Value="" Then
でいけますか?

203:デフォルトの名無しさん
17/01/18 13:25:21.60 UZ6KtMVe.net
>>198
forecolorとかbackcolorとかだよ
オブジェクトブラウザでcells調べてみ?

204:デフォルトの名無しさん
17/01/18 15:02:26.86 zXM8oXoh.net
Groovyでは、
def root = new XmlParser().parse("ファイル名.xml")
root.タグ名.each{
println it.text()
ここで処理する
}
it は、イタレータから渡ってくる、暗黙の要素を指す

205:デフォルトの名無しさん
17/01/18 17:11:44.24 XrR2JBi4.net
>>180
そもそも、なんでExcelに展開しようとしてるんだ?
それが最終目的か?
あと、自分でどこまでできたのか書いてくれ。

206:デフォルトの名無しさん
17/01/18 17:46:16.92 WZOpQPDJ.net
URLリンク(smilejapan.net)データをDOMで扱う方法
XML関連

207:デフォルトの名無しさん
17/01/18 19:44:31.06 zXM8oXoh.net
<Subject japanese="kokugo">
<Subject math="sugaku">
1回目の<Subject>の際、japanese, math の、2つが取れているのは、Traverse の幅優先探索か?
普通は、深さ優先探索だけど
様々な言語を見たけど、日本語のサイトで、Traverse の処理を書いているサイトは、ほとんどない。
どないなっとんねん?

208:デフォルトの名無しさん
17/01/18 20:09:10.01 P2ujaP/J.net
>>201
Excelに展開するのが最終目的であってます。
現在自分ではこのような状況・・・
DOMとかわからなくて挫折。xml文の各行をfor文で回してやっている。
【できたこと】
各行のXML文がどの階層についての話か調べる
階層 = (各行の<の前にある空白)×1のため、InStr("各行のXML文","<")-1で求めた。
【できないこと】
パラメータ名と設定値の抜出。
設定値に関してはsplit関数でできるかなと思ったが、
パラメータ名は「空白と=」や「<と空白」等で何で囲まれているかが異なっており、どうすればよいかわからない。
簡単に言うと、
I2:「 <examType first="zenki/shiken" second="koki/shiken" third="">」
とあるとき、
examTypeをF3、firstをF4、secondをF5、thirdをF6、
"zenki/shiken"をG4、"koki/shiken"をG5、""をG6に出す方法がわからない。

209:デフォルトの名無しさん
17/01/18 20:17:32.50 WZOpQPDJ.net
xmlファイルをhtmlとして読み込めばいいんじゃね
でgetelementsbytagname()とかつかう

210:デフォルトの名無しさん
17/01/18 20:26:10.85 9qUMY5Wm.net
>>204
馬鹿過ぎて話しにならない。
馬鹿に無理。

211:デフォルトの名無しさん
17/01/18 20:47:34.80 IDSE4GPa.net
>>194
ふぅ

212:デフォルトの名無しさん
17/01/18 21:15:38.89 zXM8oXoh.net
XML Parserは、jQuery, Groovy, Python, Ruby など、何にでもある
ただ、traverse の説明が、日本語のサイトでは見当たらない。
深さ優先ではなく、幅優先探索だろ?

213:デフォルトの名無しさん
17/01/18 21:22:46.40 uheDDMMj.net
>>204
DOMじゃないと結構つらいかもよ 出来ん事はないけどね DOM勉強する気があるなら サンプル上げとくよ
DOM+再帰処理してるので詳細はググってねw
あと何階層でも良いのだけれど シートが4階層までしか用意されてないので 4階層に制限してます
'Microsoft XML v3.0 を参照設定
Sub main()
 Dim XMLDoc As MSXML2.DOMDocument
 Dim Row As Long
 Dim No As Long
 Row = 3 'シートに書き込む最初の行位置
 No = 1
 Set XMLDoc = New MSXML2.DOMDocument
 XMLDoc.Load "D:\XML.txt" 'XMLファイルを読み込む
 Call ListXml(XMLDoc.ChildNodes(1), Row, No, 1)
 Cells(Row, "G").Value = "FINISH"
End Sub
Sub ListXml(ByRef Node As IXMLDOMNode, ByRef Row, ByRef No, ByVal Level)
 Dim NodeList As IXMLDOMNodeList
 Dim Node1 As IXMLDOMNode
 Dim Node2 As IXMLDOMNode
 Dim NodeAttr As IXMLDOMAttribute
 'ノード名表示
 Cells(Row, "A").Value = No
 Cells(Row, "B").Offset(0, Level - 1).Value = Level
 Cells(Row, "F").Value = Node.nodeName
 Cells(Row, "G").Value = "-"
 Row = Row + 1
 No = No + 1

214:209
17/01/18 21:23:19.50 uheDDMMj.net
'続き
 'ノードパラメータ表示
 For Each NodeAttr In Node.Attributes
  Cells(Row, "A").Value = No
  Cells(Row, "F").Value = NodeAttr.Name
  Cells(Row, "G").Value = NodeAttr.Value
  Row = Row + 1
  No = No + 1
 Next
 '階層制限
 If Level = 4 Then Exit Sub
 '同じ名前の子ノードを 最初の一つに集約
 For Each Node1 In Node.ChildNodes
   Do
     Set NodeList = Node1.ParentNode.SelectNodes(Node1.nodeName)
     If NodeList.Length = 1 Then Exit Do
     For Each Node2 In NodeList(1).ChildNodes
       NodeList(0).appendChild Node2
     Next
     Node1.ParentNode.RemoveChild NodeList(1)
   Loop
 Next
 '子ノード処理(再帰)
 For Each Node1 In Node.ChildNodes
   Call ListXml(Node1, Row, No, Level + 1)
 Next
End Sub

215:デフォルトの名無しさん
17/01/18 21:25:28.46 zXM8oXoh.net
XML Parserは、jQuery, Groovy, Python, Ruby など、何にでもある
ただ、traverse の説明が、日本語のサイトでは見当たらない。
深さ優先ではなく、幅優先探索だろ?
Java
URLリンク(www.technotype.net)
子ノードリストを取得
NodeList list = parentNode.getChildNodes();
要素に従属する属性リストを取得
NamedNodeMap map = elementNode.getAttributes();
最悪、traverse 関数内で、traverse・自分自身を呼ぶ、再帰的な処理を作る。
traverse 関数が最初からあれば、もっと簡単。
それに幅優先探索を指定する

216:デフォルトの名無しさん
17/01/18 21:56:11.82 P2ujaP/J.net
>>210
ありがとう。
実際やってみたらA3とB3に1が出力されて、
オブジェクト変数またはWithブロック変数が設定されていません
と言われました。どうしてだろ。。。
>>211
はい、幅優先探索です。
ありがとうございます。transverseについてちょっと調べてみます。

217:デフォルトの名無しさん
17/01/18 22:00:58.72 uheDDMMj.net
>>212
XML規則に則ってる?
あと ノード名(タグ名?)は 大文字小文字 区別するぜ
どっか XMLファイルUP出来ない?

218:デフォルトの名無しさん
17/01/18 22:08:43.87 uheDDMMj.net
>>212
もしかして↓このまま? 実際のXMLファイル名に修正してよね
XMLDoc.Load "D:\XML.txt" 'XMLファイルを読み込む

219:デフォルトの名無しさん
17/01/18 22:12:35.06 P2ujaP/J.net
>>213
実際のXMLファイル名とそのパスにしています。
XML.txtの中身は以下の通りです。
<?xml version="1.0" encoding="UTF-8">
<examType first="zenki/shiken" second="koki/shiken" third="">
<Subject japanese="kokugo">
<Gendaibun min="50/100" max="85/100" />
<Kobun min="60/100" max="100/100" />
</Subject>
<Subject math="sugaku">
<IA min="30/100" max="80/100">
</IA>
</Subject>
</examType>

220:デフォルトの名無しさん
17/01/18 22:29:42.43 uheDDMMj.net
>>215
XML読み込み失敗してるね
※XMLファイル修正(最後に?がない)
× <?xml version="1.0" encoding="UTF-8">
○ <?xml version="1.0" encoding="UTF-8"?>
※コード修正(読み込みエラーでたらMSGBOX)
XMLDoc.Load "D:\XML.txt" 'XMLファイルを読み込む
If XMLDoc.parseError.ErrorCode <> 0 Then
MsgBox XMLDoc.parseError.reason
Exit Sub
End If

221:デフォルトの名無しさん
17/01/18 22:30:45.22 vXs3og/7.net
アドインのデータはどこに保存するのが標準的なの?
シートだと階層構造のデータを保存しにくいからxmlファイルにして保存したい

222:デフォルトの名無しさん
17/01/18 22:41:40.88 P2ujaP/J.net
>>216
ありがとうございます。エラーはなくなりました。
ただ1つ問題が・・・
math,sugakuを読み込んでいない。8行目と9行目の間に入れたいのですが。
実行画面結果は以下のようになりました
URLリンク(www.dotup.org)

223:デフォルトの名無しさん
17/01/18 22:50:58.80 uheDDMMj.net
>>218
'同じ名前の子ノードを 最初の一つに集約
で集約してるからそうなるが(その下は移動してる)
前からの レスで集約するって言ってたんじゃない?
'同じ名前の子ノードを 最初の一つに集約
の(FOR~NEXT)部分ざっくり削除してみ

224:デフォルトの名無しさん
17/01/18 23:09:44.67 P2ujaP/J.net
>>219
あー、申し訳ない。
7行目のSubjectの下に、japaneseとmathをまとめて出力するという意味で使ってしまっていました。

225:デフォルトの名無しさん
17/01/18 23:20:05.28 P2ujaP/J.net
まとめて=8行目にjapanese,9行目にmath
という意味です

226:デフォルトの名無しさん
17/01/19 00:09:17.23 wXKnExNu.net
>>221
こゆう事かな?(同じパラメータは 最後のに置き換えられるよ)
下をそっくり入れ替えて
 '同じ名前の子ノードを 最初の一つに集約
 For Each Node1 In Node.ChildNodes
  Do
     Set NodeList = Node1.ParentNode.SelectNodes(Node1.nodeName)
     If NodeList.Length = 1 Then Exit Do
     For Each Node2 In NodeList(1).ChildNodes
       NodeList(0).appendChild Node2
     Next
     'パラメータコピー
     For Each NodeAttr In NodeList(1).Attributes
      NodeList(0).Attributes.setNamedItem NodeAttr.CloneNode(True)
     Next
     Node1.ParentNode.RemoveChild NodeList(1)
  Loop
 Next

227:デフォルトの名無しさん
17/01/19 00:38:26.41 qjpOvOJu.net
ここまで来ると、もうわけがわからんな。
プログラムでプログラム文を自動生成します、みたいな話だろ?

228:デフォルトの名無しさん
17/01/19 05:02:36.80 WDgxZeys.net
何かの言語には、自動的に、traverse する関数があるはず。
または既に、外人が作って、Gitにあるはず。
日本のサイトで探しても、見つからない
それに、深さ優先探索か幅優先探索を指定する
Pythonのwalkは、あるディレクトリ以下の階層を渡り歩く。
つまり、それのXML版だろ
ディレクトリもXMLも、Tree だから、基本的には同じ

229:デフォルトの名無しさん
17/01/19 06:58:46.51 JadLiFtg.net
>>217
> シートだと階層構造のデータを保存しにくいからxmlファイルにして保存したい
XML 文字列ををセルとかブックのプロパティとかに入れときゃいいだけじゃないの?

230:デフォルトの名無しさん
17/01/19 07:34:02.29 R0f6tJX+.net
>>>222
できたああああああああああああ
ありがとうございます!
罫線やノード名の一部を太字にするなど微修正は自分でできました。
皆様ありがとうございました。

231:デフォルトの名無しさん
17/01/19 12:16:13.59 SpG+j8gZ.net
   A  B
1 山田 10:50
2 山田 11:50
3 山田 4:50
山田の時間(B列)を1行目から順番に変数(a)に代入して合計を計算して、
Application.Floor(a + TimeValue("0:30"), TimeValue("1:00"))で
30分繰り上げ(例えば1:30の場合2:00に繰り上げ)しているのですが、
総計が24時間を超えると"1900/1/1  28:00"と日付が入り、表示形式がおかしくなってしまいます。
繰り上げのコードが間違っているのでしょうか?

232:デフォルトの名無しさん
17/01/19 12:21:46.57 4RX8xFF/.net
>>227
[h]:mm

233:デフォルトの名無しさん
17/01/19 12:47:27.51 ZXvOrtNX.net
>>228
解決しました
ありがとうございます

234:デフォルトの名無しさん
17/01/19 15:08:53.45 SN1gevnS.net
初質問です!
エクセルにはブック共有状態で変更履歴記録機能があり、新しいシートに変更履歴一覧を作成できると思います。
そこで、VBAで変更期間「すべて」で「新しいシートに変更履歴一覧を作成」の操作をしたいのですが可能でしょうか?
大量のドキュメントの変更履歴を取りたいので、マクロ化したいのが目的です。
可能であればやり方を教えていただきたいです。よろしくお願い致します。

235:デフォルトの名無しさん
17/01/19 15:37:44.80 irXhj7sG.net
>>230
とりあえずマクロの記録を試してみたら?

236:デフォルトの名無しさん
17/01/19 15:50:51.90 9G0IwAcw.net
>>217
これは俺も知りたいc++だとxmlに書いてるのよく見るけどvbaはどうなんだ

237:デフォルトの名無しさん
17/01/19 18:24:05.68 xZWyIIjd.net
Cell Property の .Valueと.Textでは取得のパフォーマンスに
大きな差があるようですがこんなものですか。
7万レコードのセル値取得に使ったのですが、前者は0.3秒ほど
後者は130秒かかりました。
上のほうのレスで .Textを見つけて喜んで使ってみたのですが、、

238:デフォルトの名無しさん
17/01/19 20:17:42.34 irXhj7sG.net
>>233
Textの方は書式を評価しないといけないからそんなものじゃね?

239:デフォルトの名無しさん
17/01/19 20:23:44.41 R0f6tJX+.net


240:デフォルトの名無しさん
17/01/19 21:13:36.84 9zfnUwsN.net
>>234
なるほど
.Valueで取得してから書式あてた方が無難ですね

241:デフォルトの名無しさん
17/01/19 23:40:16.64 qjpOvOJu.net
マジか!!
Valueで取得しようとすると、
#N/Aでコケるから、ずっとText使ってたわ!
ん?
でも0.3秒と130秒って違い過ぎじゃないか?
0.3秒なんて、For Nextじゃ取れないと思うが。
a=Range("A1:A70000").Valueとかじゃないと。

242:デフォルトの名無しさん
17/01/20 04:41:52.83 9/J9Uge2.net
>>237
そう言われると、、あらためて追試。
試したコードはこんな感じ。
Cells(1, 1).Resize(70000, 1).Select
  '------------------------------
st = Timer
For Each r In Selection
var = r.Value
Next
ed = Timer
Debug.Print "by .Value", ed - st; "[Sec]"
  '------------------------------
st = Timer
For Each r In Selection
var = r.Text
Next
ed = Timer
Debug.Print "by .Text", ed - st; "[Sec]"
セルには[1-70000]のシーケンシャルな数値を格納
これの書式なしと書式あり"[h]:mm"を試しました。
(続く)

243:デフォルトの名無しさん
17/01/20 04:43:33.99 9/J9Uge2.net
>>237
(続き)
結果、、
---------------------------------------------
by .Value 0.1855469 [Sec]
by .Text 1.241211 [Sec]
by .Value (Formatted) 0.1806641 [Sec]
by .Text (Formatted) 1.569336 [Sec]
---------------------------------------------
結果、差はあるものの、日中にテストしたものほど
は差がでませんでした。
日中のデータで再度試した結果です。
---------------------------------------------
by .Value (Formatted) 0.2011719 [Sec]
by .Text (Formatted) 99.20215 [Sec]
---------------------------------------------
他の要因もあるかもしれません。
実際のデータはOracleからSQLで引っ張ってきた
テーブルを.Unlistしたもので、70000行x130列ほど
の大きさ。これのV列あたりにある "hh:mm"書式が
当たっているというものです。
自動再計算はOffです。

244:デフォルトの名無しさん
17/01/20 11:00:31.99 32Bwzd9P.net
VBA初歩的です。
シート1のA列で文字列の色を変えてその後A列に同じ文字列が書き込まれたら同じ色に変えたいんです。
そして出来たらシート2のA列の同じ文字列も同じ色にしたいんです。
誰かコード分かる方いますでしょうか?

245:デフォルトの名無しさん
17/01/20 13:04:58.83 nnKMBoVD.net
>>240
スマホから書き込もうと思ったら案外大変で諦めた
A列の重複を排除したリストを作成(配列、コレクション等)
リストとA列を比較して色を指定
で行けるんだけど、何がわからんのか
文字列の種類は不定なのか固定なのか、色に指定はあるのかなど情報も少ない

246:デフォルトの名無しさん
17/01/20 13:05:01.85 JXdqXSkU.net
初歩的?
自分でマクロの記録で調べろよ

247:デフォルトの名無しさん
17/01/20 14:58:10.41 Nvso2zBq.net
質問じゃなくてタダで作ってくれって言ってるんやで

248:デフォルトの名無しさん
17/01/20 16:54:43.86 bVBZQrA4.net
失礼します
学校でgoogle financeのapiを利用したのを作成しているのですが
A列の証券コードの羅列を読み取りURLに追加しJSONのティックデータを取得するところまでは
行けたのですが、どうやって個々にパースすればいいかわかりません、生データを取得するまでのコードは以下
Dim W As Worksheet: Set W = ActiveSheet
Dim i As Integer
Dim Last As Integer
Last = W.Range(

249:デフォルトの名無しさん
17/01/20 16:59:50.09 bVBZQrA4.net
うまく書き込めなかったようです
取得したでーたは下のurlの通りです
URLリンク(finance.google.com)

とずっと続いています
これを個々にパースしてセルごとに振り分けたいのですが
個々にパースするにはどのようにすればいいかわかりません
誰か助けてください

250:デフォルトの名無しさん
17/01/20 17:12:18.70 gQ8iElJX.net
>>244
"vba json パース"でググる

251:デフォルトの名無しさん
17/01/20 18:21:41.59 FuK3VNeE.net
>>240
在日か?日本語不自由そうだな

252:デフォルトの名無しさん
17/01/20 18:33:30.59 Zm/Pjw4E.net
すいません楽天rss使ってるのですが
vbaからセルに10銘柄程コードを入れても頻繁にすべてN/Aと出てしまうのです
接続が切れてるわけではなく、例えばexcelの上書き保存をクリックするとN/Aが
消えてすべて表示されるのです
vbaでは画面の更新は切ってないのですが原因は考えられますか?

253:デフォルトの名無しさん
17/01/20 19:25:28.08 gGEm4cbB.net
VBAでWebAPI叩きたくなる気持ちが理解できない
PowerShellやC#やVB.NETじゃダメだったのか

254:デフォルトの名無しさん
17/01/20 20:22:24.18 ymDflbNb.net
>>249
結果を Excel で処理したいんだろ
なら VBA が一番自然だわな
ただ言語としての機能がいまいちだから俺なら PowerShell で取得して Excel に書き込むかな

255:デフォルトの名無しさん
17/01/20 20:58:17.11 mJKyjGCe.net
>>249
いや、いいんじゃないか?
ただスレチになるから
そういう話は.Netのスレでやればいいだけで

256:デフォルトの名無しさん
17/01/20 21:08:26.20 MJq7L3EO.net
URLリンク(www.google.com)
これ?
DATA_SESSIONS はjsonの配列表記っぽいけど、データ部は単なるカンマ区切りのような(他も改行区切りだしjsonじゃないような)
.NETもjsonのパースにはNuGetが必要じゃなかったっけ(なんかDLLが増えるのが嫌で自力パースしたことある)
PowerShellはjsonのパースもできるのか

257:デフォルトの名無しさん
17/01/20 21:31:05.58 z3TtdYe7.net
>>249
えくせるしかないなら仕方ない

258:デフォルトの名無しさん
17/01/20 22:33:30.45 vub4eIsV.net
>>249
それは本職プログラマーの発想だろうな。
事務職プログラマーは、VBAが一番いいの。
普段からエクセル使ってるから。

259:デフォルトの名無しさん
17/01/20 22:47:39.08 RRdjAoJX.net
VBA使うなとは言わないけど
もうちょっとPSや.NETとの連携が楽になれば助かるね

260:デフォルトの名無しさん
17/01/20 23:00:24.99 v0MXJAlx.net
VBA自体更新か新たな言語にしてほしいな

261:デフォルトの名無しさん
17/01/20 23:58:46.82 0ryOpRhF.net
理想を言えば C# for Application にしてくれればとは思う
まあ VB.Net for Application でもいいけど

262:デフォルトの名無しさん
17/01/21 00:17:22.31 O6MYDtgM.net
vbaが.netと楽しくできないのはmacのせいじゃね?

263:デフォルトの名無しさん
17/01/21 00:37:57.62 7WDSmlh4.net
ExcelのVBAからOutlookのメール作成のツールを作っているのですが
送信先やCCやタイトルや本文は書くことができました。
しかし本文のある部分を好きな色にしたり好きなフォントにしたり好きなサイズにしたりハイパーリンクをつけたいんです。
そのためにはどうすればいいでしょうか?

264:デフォルトの名無しさん
17/01/21 08:04:31.56 6NvQGvfC.net
>>244-245
2chのバグだろう
書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?
それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった

265:デフォルトの名無しさん
17/01/21 09:24:23.74 W/Qp5igc.net
>>244
↓のサイトを参考にして作ってみたら?
URLリンク(outofmem.tumblr.com)でjsonをパースする
ざっくり 作って見たけど なんとかなりそうよ
学校の課題らしいからこの辺で
では

266:デフォルトの名無しさん
17/01/21 10:17:45.16 W/zpHkC+.net
Jsonは構造がシンプルだからパーサー書くのも難しくない
学生なら勉強として書いてみる価値はある

267:デフォルトの名無しさん
17/01/21 11:18:37.44 1cIKmUbZ.net
>>259
HTML でやるならここのサンプル
URLリンク(msdn.microsoft.com)
リッチテキストでやるならフォーマットを RTF に設定して RTFBody に設定すればいい
URLリンク(msdn.microsoft.com)

268:デフォルトの名無しさん
17/01/21 11:23:47.66 7W


269:DSmlh4.net



270:デフォルトの名無しさん
17/01/21 11:27:24.97 7WDSmlh4.net
あとこれも頻繁に使う予定ですが
Outlookのカレンダー(おそらく型はolAppointmentItemでしょう)の本文でも
本文のある部分を好きな色にしたり好きなフォントにしたり好きなサイズにしたりハイパーリンクをつけるにはどうすればいいでしょう?
ちょっと調べるとBodyFormatプロパティやHTMLBodyプロパティはなさそうですが。

271:デフォルトの名無しさん
17/01/21 11:44:27.71 1cIKmUbZ.net
>>265
HTMLBody はないけど RTFBody はあるよ
URLリンク(msdn.microsoft.com)

272:デフォルトの名無しさん
17/01/21 12:01:08.22 7WDSmlh4.net
>>266
わたしのOffice2007のバージョンのOutlookにはRTFBodyプロパティは無いようなのですが。
URLリンク(www.dotup.org)
でもOffice2007でもカレンダーの本文のある部分に手動で装飾ができるのでマクロでもできるはずだと思います。
どうすればいいのでしょうか?

273:デフォルトの名無しさん
17/01/21 13:22:18.60 JwMYXArD.net
どっちかというと.NETがおかしいんだけどね
全部用意してやるからActiveXやWin32APIを使うなと言わんばかりの不便さ
言語の内部にない機能を外から持ってくるからオープン系と言うんだと思ってたけど

274:デフォルトの名無しさん
17/01/21 13:57:11.70 1cIKmUbZ.net
>>267
う~ん、ないなら無理っぽいかと
> でもOffice2007でもカレンダーの本文のある部分に手動で装飾ができるのでマクロでもできるはずだと思います。
アプリの機能の全てをマクロでサポートしてるとは限らんし...

275:デフォルトの名無しさん
17/01/22 18:24:33.89 dK0oU8+I.net
初心者の質問ですみません。
仕事で各部署から大量に写真が来て、部署毎の名前のフォルダに連番ファイルで保存しているのですが、
フォルダの最後のファイルだけピックアップする必要ができてしまいどうにも困っています。
Excelのマクロを使えばどうにかなりそうだとは思うのですが、どなたかお知恵を貸していただけないでしょうか?
例)
c:\営業一課\営業一課00001.jpg ~営業一課00060.jpg
c:\資材課\資材課00001.jpg ~ 資材課00020.jpg
c:\物流課\物流課00001.jpg ~ 物流課00120.jpg
等、ファイル名は[フォルダ名 + 5桁の数字]。5桁の数字は00001から始まって、終わりの数字(ファイル数)はフォルダ毎にバラバラの状態です。
この状態で、↑の例で言うなら営業一課00060.jpgと資材課00020.jpgと物流課00120.jpgを、
c:\最後\ のフォルダに切り取り貼り付けしたいのですが…
マクロ限定では無く、何かのソフトの組み合わせで実現できるというならそれでも構いません。
フォルダ数が10や100なら力任せにファイラーで移動するのですが、現在50000くらいフォルダ数があって、一日200-300くらいの勢いで増えてます…

276:デフォルトの名無しさん
17/01/22 18:45:46.18 mco4N0ih.net
ファイル操作や並び替えはPowershellの方が簡単だよ

277:デフォルトの名無しさん
17/01/22 18:56:47.41 PXtZmaP4.net
>>270
切り取り貼り付けで馬鹿だとよくわかる
ロジック的にも間違いを引き起こすようなロジックしか考えられないし
馬鹿確定

278:デフォルトの名無しさん
17/01/22 19:13:35.66 K9IWtO+t.net
初心者と一々断らなくて良いよ、と言おうと思ったら、
>>272みたいな上級者気取りが現れるから仕方ないか・・
これを参考にして
URLリンク(officetanaka.net)

279:デフォルトの名無しさん
17/01/22 19:49:33.32 YJLP3OgH.net
>>272
$work =

280:デフォルトの名無しさん
17/01/22 20:32:29.70 b7Xc1TTL.net
>>270
vbaでもいいけど
普通にvbscriptみたいなものでも簡単にできるよ
vbs フォルダ 検索
でぐぐったらどうでしょう

281:デフォルトの名無しさん
17/01/22 20:54:41.71 XKc56KzG.net
>>272
うるせえぞ馬鹿
真面目に質問してる人になんだそりゃ。

282:デフォルトの名無しさん
17/01/22 21:01:31.37 xqqm72Ga.net
>>270
各フォルダには画像以外のファイルも入ってるかどうか
拡張子は小文字のjpgだけか、JPGやjpegも混ざってるかどうか
それだけ教えて

283:デフォルトの名無しさん
17/01/22 21:10:37.07 PXtZmaP4.net
馬鹿はファイルのコピーや移動の仕方でわかるんだよな。



284:馬鹿のくせに間違いを絶対にしない前提の方法で話しを進めるのが馬鹿たる所以。



285:デフォルトの名無しさん
17/01/22 21:26:21.62 o6OZ0Umu.net
( ´_ゝ`)フーン

286:デフォルトの名無しさん
17/01/22 21:41:22.76 uPXBwAbd.net
>>277
拡張子がなんにしても全パターン網羅してリプレイスして番号で最大値とって取得やんな?

287:デフォルトの名無しさん
17/01/22 21:43:59.78 fxkBMvoQ.net
>>278
あ、ごめん
即座に罵倒するようなヤツとは関わらないって決めてるので誰にも迷惑のかからないところで勝手に盛り上がっててください

288:デフォルトの名無しさん
17/01/22 22:05:16.58 5pcXYXa+.net
病気なんだよ

289:270
17/01/22 22:11:46.10 dK0oU8+I.net
>>277
フォルダの中身は小文字の.jpgのみです。
>>273
参照のページで、ファイル名一覧が取得できるまでは解るのですが、
それを取得してどうすれば良いのかが解りませぬ。

290:デフォルトの名無しさん
17/01/22 22:21:58.08 K9IWtO+t.net
>>278
知らないから馬鹿じゃないだろ
>>270を「馬鹿のくせに間違いを絶対にしない前提の方法で話しを進める」と決めつけるのが馬鹿
>>283
一覧をソートすれば取得できる
というオレもVBA初心者ゆえ、正確に答える自信がないので、概念だけでスマンw

291:デフォルトの名無しさん
17/01/22 22:30:17.75 l2Nz+a62.net
>>270
>c:\最後\ のフォルダに切り取り貼り付けしたいのですが
移動(元フォルダからは消える)するより
コピーするか ショートカット作成した方が良いんじゃないかと思うのだが
どうよ
後 実際の各フォルダは c:\ の直下なの?

292:デフォルトの名無しさん
17/01/22 23:05:08.45 4Incfzmy.net
>>270
スレ違いだけどPowerShellで
$folder_from = "C:\"
$folder_to = "C:\最後\"
foreach($child_folder in ls -Path $folder_from | ?{ $_.Name -match '.+課$' })
{
$regex = '^' + $child_folder.Name + '\d+\.jpg$'
$last_item = ls -Path $child_folder | ?{ $_.Name -match $regex }| select -Last 1
mv $last_item.FullName $folder_to
}

293:デフォルトの名無しさん
17/01/22 23:12:38.88 qK5fG7bF.net
できた
ちゃんと動くかどうかテストしてないんでバックアップとってな
Sub CopyLastFile()
  TargetFolder = "C:\"  ' 処理するフォルダ
  If Right(TargetFolder, 1) <> "\" Then TargetFolder = TargetFolder & "\"
  Set Dirs = CreateObject("Scripting.FileSystemObject").GetFolder(TargetFolder).SubFolders
  For Each CurrentFolder In Dirs
    If CurrentFolder.Name <> "最後" And CurrentFolder.Name <> "System Volume Information" Then
      MaxName = ""
      FName = Dir(TargetFolder & CurrentFolder.Name & "\*.jpg")
      Do While FName <> ""
        If FName > MaxName Then MaxName = FName
        FName = Dir()
      Loop
      If MaxName <> "" Then  ' ファイルを移動
        Name TargetFolder & CurrentFolder.Name & "\" & MaxName As TargetFolder & "最後" & "\" & MaxName
      End If
    End If
  Next
End Sub

294:デフォルトの名無しさん
17/01/22 23:43:51.53 Wwv6/pAu.net
汚ねぇ言語だな
何がなんだかさっぱり

295:270
17/01/23 00:41:20.21 U6yzB2m0.net
>>268
>>287
お手数掛けてしまい申し訳ありませんが、どちらも動きませんでした…
「ファイルが見つかりません」とエラーメッセージが出てしまいます。

296:デフォルトの名無しさん
17/01/23 00:55:01.54 ST2LRMx2.net
しょせん馬鹿には無理なんだよ

297:デフォルトの名無しさん
17/01/23 01:08:05.39 ayLfxszv.net
フォルダの場所はあくまで例という事なので
適切に弄った上で見つからないのかな

298:デフォルトの名無しさん
17/01/23 01:55:52.05 sOYRMmGw.net
vbaのソースをハイライトしてくれて公開できるサイトってありますか?

299:デフォルトの名無しさん
17/01/23 04:46:02.80 WP/2JyPJ.net
>>287を試したけど、ちゃんと動いたぜ
URLリンク(i.imgur.com)
もちろん最初のフォルダ定義は書き換えたよな?
そこ以外はフォルダ名もファイル名もディスクから読み取ってるんだから、見つからないわけがないんだが

300:デフォルトの名無しさん
17/01/23 04:51:29.77 WP/2JyPJ.net
>>292
VBAに対応したサイトは見たことないけど、
RangeとかCellsがハイライトされないと困る用途でなければVBを選択してみたら?

301:デフォルトの名無しさん
17/01/23 04:53:06.02 WP/2JyPJ.net
あ、あと「最後」フォルダも手動で作っとかないとだめだよ

302:270
17/01/23 06:51:27.51 U6yzB2m0.net
>>287
>>293
別のサンプルで試したところ、きちんと動作いたしました。
最初に用意したサンプルの部署の名前にシステム外?の漢字が使われていた為に失敗していたようです。
(ひらがなの「が」が、「か+゛」になっていたという。Mac←→Winの文字コードの違いの問題?)
そちらはなんとかなるので、これで問題解決です。
皆様方、ありがとうございました。

303:デフォルトの名無しさん
17/01/23 08:12:32.04 sOYRMmGw.net
>>294
なるほど! ありがとうございましたm(__)m

304:デフォルトの名無しさん
17/01/23 12:58:13.38 Z+1qxvba.net
>>296
utf-8 は、濁点半濁点を分離しない
一方、utf-8-mac は、濁点半濁点を分離して、別の文字とする

305:デフォルトの名無しさん
17/01/23 15:48:10.56 r+jEG7u3.net
質問です
HTMLで要素を特定するのが難しい複雑なWEB GUIを自動操作したく、キーボード入力のみ(TAB、ENTER、文字入力の組み合わせ)で原始的に操作すればいいんじゃないかと考えました
このような方法は効果的ですか?
またIE画面の取得やSendKey、busy状態の判定などはurlさえあれば可能なのでしょうか?

306:デフォルトの名無しさん
17/01/23 16:25:14.53 dyeHk94Y.net
>>299
> HTMLで要素を特定するのが難しい複雑なWEB GUIを自動操作したく、キーボード入力のみ(TAB、ENTER、文字入力の組み合わせ)で原始的に操作すればいいんじゃないかと考えました
> このような方法は効果的ですか?
「効果的」の意味が良くわからないが、確実性に欠けるので実装方法としては下策。

307:デフォルトの名無しさん
17/01/23 18:23:23.13 iz5/M2l3.net
>>299
何故HTMLで要素を特定するのが難しいのか?
あとそれが難しいのにキーボード操作なら目的の操作を出来るのは何故か?
効果的かどうかどうやって判断するのか?

308:デフォルトの名無しさん
17/01/24 09:50:42.62 Q9g90nxH.net
>>300
>>301
回答ありがとうございます
効果的か、というのは他に楽ないい選択があるか、という意味です
初心者なので要素の取得に時間がかかり、単純なWEBページならなんとか操作できるのでが
ジャバの記述でソースコードがぐちゃぐちゃになっており要素の取得がしんどいです
実際のie操作を記録してコード組んでくれるソフトとか無いんですかね

309:デフォルトの名無しさん
17/01/24 11:44:50.88 tZ08PDgQ.net
>>302
UWSC

310:デフォルトの名無しさん
17/01/24 12:51:19.59 2vJhPAHl.net
>>302
ブラウザでF12キーとか押してみたら

311:デフォルトの名無しさん
17/01/25 01:50:28.88 mqe1OJqx.net
何かカッコイイ名前つけようぜ。
コスモ関数とか。
Subを廃止にして、Zamとかどうよ。
Ifも古くなってきたから、Izuとか。

312:デフォルトの名無しさん
17/01/25 04:02:53.45 IbVYSEZD.net
マクロじゃなくて馬鹿専用とかな

313:デフォルトの名無しさん
17/01/25 15:39:29.51 Lt8lAI1l.net
かなりの初心者です。
エクセルに画像挿入する際の質問です。
エクセルに大量の画像を挿入したいのですが、ファイルが重たくなりすぎるためリン
ク挿入を考えています。
ファイルをCDにや


314:いて先方に渡したいので、絶対パスではなく相対パスでの画像挿入 がしたいです。 エクセルファイルと大量の画像データは同じフォルダ内にあります。 Insertで挿入してもaddpictureで挿入してもメディアにフォルダごと移動したとたん リンク切れになるので困っています。 よろしくお願いします。



315:デフォルトの名無しさん
17/01/25 17:01:41.71 IbVYSEZD.net
>>307
なぜhtmlにしないの?

316:デフォルトの名無しさん
17/01/25 17:35:49.92 ekWp7cd2.net
数値の変化する1つのセルの最大値を他のせルに記録したいのです。
例えば B5 セルの値が、15 10 23 5
と変化したら、隣のC5のセルに、 23 と表示させたいのです。
エクセルの関数になるのかもしれませんが、ググってもどう調べても分かりません。
皆さま何卒宜しくお願い致します。

317:デフォルトの名無しさん
17/01/25 17:53:01.54 vlkVtG3b.net
>>309
その要件は >>307 のどこにあたるの?

318:デフォルトの名無しさん
17/01/25 18:08:36.73 ncsczmSY.net
>>307
htmlとして保存とかできなかったっけ

319:デフォルトの名無しさん
17/01/25 19:35:21.34 mqe1OJqx.net
>>307
リンク切れになる理由はわからんけど、
ファイルを開いた時に、リンク解除→再リンクすればいいんじゃないの?

320:デフォルトの名無しさん
17/01/25 21:13:17.06 CnexM6ZX.net
>>310
えっ?

321:デフォルトの名無しさん
17/01/25 21:38:36.75 eyqKHvfT.net
>>309
対象のセルがひとつだったらグローバル変数を使って簡単にできる
Private max__ As Double
Function getMax(ByVal x As Double) As Double
If max__ < x Then max__ = x
getMax = max__
End Function
セルC5に
= getMax(B5)
と入れときゃいい

322:デフォルトの名無しさん
17/01/25 21:41:05.43 eyqKHvfT.net
初期値がゼロだから、
Sub resetMax()
 max__ = -1.79769313486231E308
End Sub
とかが必要かもしれない

323:デフォルトの名無しさん
17/01/25 22:18:36.62 eU88gsvp.net

板復帰(OK!:Gather .dat file OK:moving DAT 540 -> 537:Get subject.txt OK:Check subject.txt 540 -> 539:Overwrite OK)2.94, 2.24, 1.93
age subject:539 dat:537 rebuild OK!

324:デフォルトの名無しさん
17/01/25 22:49:29.44 CnexM6ZX.net
>>315
要らないです

325:デフォルトの名無しさん
17/01/25 22:54:53.11 eyqKHvfT.net
>>317
ほう、なぜ?

326:デフォルトの名無しさん
17/01/25 23:05:36.18 AeM3WiQW.net
ほうなぜ

327:デフォルトの名無しさん
17/01/26 01:27:18.15 lerVaKyH.net
ほぜなう、ななほなう、ほぜぜほ、ううう、うう、ななほ、ななほ、うほうほうほほ、ぜうほなーほ

328:デフォルトの名無しさん
17/01/26 08:19:49.57 ZDwsAfth.net
>>318
一回目の値取り込めは必須だから。
この場合は15は必ず最大値。

329:デフォルトの名無しさん
17/01/26 08:27:33.82 GoiJIG7T.net
>>321
B5が全部マイナスのケースは?

330:デフォルトの名無しさん
17/01/26 09:20:45.29 ZDwsAfth.net
>>322
あーその場合があったか!
いやー失敬失敬



な訳ない。
一回目は絶対最大値なんです。
この場合正負は、なんの意味がない。

331:デフォルトの名無しさん
17/01/26 09:50:34.79 8Qm9FYvM.net
>>323
君が想定してるコードは >>314 なの それとも別のコード?

332:デフォルトの名無しさん
17/01/26 10:02:08.25 mPWEbfd1.net
>>323
>>314のグローバル変数はDouble型だから何もしないと初期値は0.0だ。
これが何を意味するかはわかるな?

333:デフォルトの名無しさん
17/01/26 10:09:43.56 oMPl1Srs.net
>>323
これは恥ずかしい

334:デフォルトの名無しさん
17/01/26 11:12:41.51 KR9GJXBK.net
>>324
>>325
>>326
314は考慮してない。
315のように型考慮とか手間。

335:デフォルトの名無しさん
17/01/26 11:17:55.57 SSl9


336:70Br.net



337:デフォルトの名無しさん
17/01/26 11:28:23.97 mPWEbfd1.net
>>327
型考慮が手間?
じゃあVariantにすればいい。Emptyであれば未初期化状態とわかるからそこで分岐できる。
そもそもなんのデータなんだ?
気温とかで最高気温をとりたいというならずっとマイナス値で推移することもあるし、
株価とかの最高値をみたいというなら正数だけ考えればいいし。

338:デフォルトの名無しさん
17/01/26 11:52:33.91 KR9GJXBK.net
>>328
正しい
>>329
観点そこじゃねーよ
イチイチ型の下限をハードコーディングかよ。
何にも思わないんだw

339:デフォルトの名無しさん
17/01/26 12:00:40.09 mPWEbfd1.net
>>330
使い捨ての例示だろ?
それで十分さ

340:デフォルトの名無しさん
17/01/26 12:04:08.41 mPWEbfd1.net
意図明確なハードコーディングなどなんら問題ないという立場。
型ごとの下限値とか一日の秒数とか、文脈で明かでかつ誰でも知っている値は本番プログラムでもなきゃそのまま例示するさ。

341:デフォルトの名無しさん
17/01/26 12:07:50.47 ZDwsAfth.net
>>331
そうかもね
ただ>>309が不憫でよ。
いきなり>>314だろ。
>>315で結びが『かもしれない』
まじがんばれ>>309

342:デフォルトの名無しさん
17/01/26 12:17:36.90 mPWEbfd1.net
>>333
じゃあ別な方法を示せばいい
そもそも「正負がなんの意味もない」ってどういうことだ?説明しろ。

343:デフォルトの名無しさん
17/01/26 12:31:36.89 SSl970Br.net
この話題については
やりようによってはグローバル変数って不要じゃないかな?
って思う

344:デフォルトの名無しさん
17/01/26 12:39:56.63 oMPl1Srs.net
こういうの考えてたんじゃね?知らんけど
でも>>315に関して「一回目は絶対最大値なんです。正負はなんの意味もない」ってのは意味不明
Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("B5")) Is Nothing Then
    Exit Sub
  Else
    Range("C5") = WorksheetFunction.max(Range("B5", "C5"))
  End If
End Sub

345:デフォルトの名無しさん
17/01/26 12:47:28.93 ZDwsAfth.net
>>334
提示コードとは切り離す。
片手落ちの提示コードなら
初期値を型下限にしないと負側は
動かないよ。
最大値の定石算法なら正負は意味ないよ。
だって正しく求まるから。
URLリンク(d.hatena.ne.jp)

346:デフォルトの名無しさん
17/01/26 12:55:45.77 ZDwsAfth.net
>>336
c5は試行の開始では
どういう状態なんだろうね?

347:デフォルトの名無しさん
17/01/26 12:57:50.00 mPWEbfd1.net
>>337
n[0]とは何で、どうやって取得するのか教えて


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch