板検索:
Excel VBA 質問スレ Part45 (239)
まとめビュー
このスレはExcel VBA 質問スレ Partスレの最新スレです。
表示中 Excel VBA 質問スレ Part45 (239)
過去ログ Excel VBA 質問スレ Part44 (1002) 2016/11/18 07:24〜
過去ログ Excel VBA 質問スレ Part43 (817) 2016/09/17 18:40〜
1
デフォルトの名無しさん[sage]   投稿日:2017/01/03 02:51:16  ID:9Y8iTik6.net
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part44


※関連スレ
VBAなんでも質問スレ Part2
Access VBA 質問スレ Part1
Excel総合相談所 125 /ビジネスsoft板


2
デフォルトの名無しさん[sage]   投稿日:2017/01/04 23:43:25  ID:T2t87YWx.net
スレ生きてるかな?

3
デフォルトの名無しさん[sage]   投稿日:2017/01/05 01:36:19  ID:3zitFiAl.net
エクセルVBAのオススメ参考書とか教えて下さいませ
コメント3件

4
デフォルトの名無しさん[sage]   投稿日:2017/01/05 16:31:19  ID:rordfoes.net
おちるぞー

5
デフォルトの名無しさん[sage]   投稿日:2017/01/05 17:49:33  ID:3kVSXnTB.net
>3
Office TANAKA

6
デフォルトの名無しさん[sage]   投稿日:2017/01/05 19:15:59  ID:YlAAgZIP.net
落ちたら落ちたでまた立てればいいのよ

7
デフォルトの名無しさん[sage]   投稿日:2017/01/05 21:50:17  ID:PrUsv/Jo.net
excel関数のoffsetやsumifを多用してたせいでマクロ遅くなるなんて知らんかった
マクロ実行中も再計算してるのか
コメント2件

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

9
デフォルトの名無しさん[sage]   投稿日:2017/01/05 22:36:04  ID:fbqYOVIL.net(2)
>3
Me.Thread

10
デフォルトの名無しさん[sage]   投稿日:2017/01/05 22:50:47  ID:olwzS93J.net
どんな言語でもそうだけど、それ単体で覚えるって無理だよな。

11
デフォルトの名無しさん[sage]   投稿日:2017/01/05 23:06:24  ID:fbqYOVIL.net(2)
ていうかVBAって、
半分くらいは、神エクセルを作るクソ上司対策の為にあるようなもんだけどな。


12
デフォルトの名無しさん[sage]   投稿日:2017/01/06 00:22:50  ID:m+Jpe1FL.net
>7
作り終わったら描画と計算止めるのは速度上げたいならマストだぞ
コメント2件

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

14
デフォルトの名無しさん[sage]   投稿日:2017/01/06 19:20:32  ID: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
コメント3件

15
デフォルトの名無しさん[sage]   投稿日:2017/01/06 19:32:50  ID:5HA7V59p.net(2)
>14
Rangeを選択してその大きさにShapeのサイズを変える
コメント1件

16
デフォルトの名無しさん[sage]   投稿日:2017/01/06 19:50:55  ID:5HA7V59p.net(2)
>14
Rangeが大きくなった事を判定してRangeを小さくするとか
大きくなったRangeに合うようにShapeを移動する
例えばRangeの中心とShapeの中心が重なるようにとか


全てのShapeを同じ大きさにするとか

シートにシェイプは1つだけにしてシートの左上とシェイプの左上を合わせるとか

17
デフォルトの名無しさん[sage]   投稿日:2017/01/06 19:54:21  ID:ylhkczHt.net
>15
スマホから、主です。
回答ありがとうございます。

たしかにこれから写真を貼るのであれば、その方法で解決すると思いますが、あくまで既に配置済みの写真から読み取る必要が有るんです。

上記はテストコードなのでセレクトしていますが、これを関数化して膨大な配置済みの写真からそれぞれのrangeを取り出すのが最終目標なので。
コメント1件

18
デフォルトの名無しさん[sage]   投稿日:2017/01/06 21:04:04  ID:S2R5Pk4v.net
>17
どうせギリギリのところで次のセルに被ってるんだろ
対象のシェイプより少しだけ小さいシェイプおいて取得すりゃいいんじゃね?
コメント1件

19
デフォルトの名無しさん[sage]   投稿日:2017/01/06 21:54:38  ID:Q5cZMFD3.net
>14
vbaでオラが画像を貼る時は
デフォのセルの左上を基準にするだけで
セルをはみ出そうが、画と画が被ろうが、複数枚貼っていく

その時、画像のセル位置はセーブしてるし
shapes.nameを一意に付けておくので
後でサイズ変更したり削除したり、、操作は自在なのだが

20
デフォルトの名無しさん[]   投稿日:2017/01/06 23:58:00  ID:8yYsxO6K.net
初めてお伺いさせていただくんですが、

マクロでvlookupを使いたいと思っているのですがエラーしか返ってこず途方にくれています。。
=VLOOKUP(D8,データ欄!$C$9:$D$28,2,FALSE)
D8にはユーザーフォームで入力した品目名が出力されており、それに呼応するIDがデータ欄!C9:D28に記載されており、
E8にIDを出力したいと考えています。

ヒントでも頂ければ幸甚に存じます。
コメント3件

21
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:25:21  ID:LrFag0bm.net(2)
それ、マクロの問題なんですかね??
vlookup関数でエラーが出てるの?

22
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:30:28  ID:2J+LIFNT.net(2)
>12
途中でエラーが出て、アレっ?となる罠付きだけどな。
コメント1件

23
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:37:52  ID:2J+LIFNT.net(2)
>20
Cells(1,1).Value="=VLOOKUP(D8,データ欄!$C$9:$D$28,2,FALSE)"なのか?
WorksheetFunction.VLookupなのか?
実行時エラーなのか?
#N/Aなのか?

何となく、余計な改行コードが入っているとか、
数字の123と文字の123を比較してるとか、
そんな罠のような気がするけど。

24
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:48:37  ID:CI9p857v.net(2)

25
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:49:41  ID:TOrGuStJ.net
自分の解釈をできるだけ排除して
事実だけを伝えた方がいい時もある

エラーと言っているが画面に表示される文字列やダイアログは何なのか
どんなタイミングで表示されるのか
自分が書いたコードはどんなものか

26
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:51:23  ID:LrFag0bm.net(2)
ファイル上げてくれると、分かりやすいんだけどね。

27
デフォルトの名無しさん[sage]   投稿日:2017/01/07 00:55:21  ID:CI9p857v.net(2)
まさかエクセルの関数をそのまま書いてるとかじゃないやろな

28
デフォルトの名無しさん[sage]   投稿日:2017/01/07 09:02:21  ID:Xo1hV6SK.net
>22
作り終わるってのはテストも込みでだぞ

29
デフォルトの名無しさん[sage]   投稿日:2017/01/07 23:07:08  ID:so7B4l6a.net
>20は解決したのかな?

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

excel 2016 win7です
コメント1件

31
30[]   投稿日:2017/01/08 00:49:37  ID:r1ASQ1zZ.net(2)
追記で動かなくなるのはそのWorkbook_SheetChange だけで
ボタンからsubの実行は動くようです

32
デフォルトの名無しさん[sage]   投稿日:2017/01/08 00:52:16  ID:mMTwBd0e.net
>30
もしかして
Application.EnableEvents = False
とかしてて その後 実行時エラーが出て Trueに戻せてないとかじゃね?
On Error
でエラートラップして Trueに戻すようにしないと
コメント1件

33
デフォルトの名無しさん[sage]   投稿日:2017/01/08 12:37:54  ID:C9GVPqMv.net
てかコードの間違いを直せよ...
コメント2件

34
デフォルトの名無しさん[sage]   投稿日:2017/01/08 14:23:39  ID:aANViJyG.net
>33
まさにこれだが
デバッグモードにして止めてみろって

35
30[]   投稿日:2017/01/08 14:39:47  ID:r1ASQ1zZ.net(2)
>32
それが原因だったようです
ありがとうございますm(__)m

>33-34
デバックモードよく分かってません
勉強してみます

36
デフォルトの名無しさん[sage]   投稿日:2017/01/08 21:58:52  ID:LSCp0tLP.net(3)
超初心者の質問です。

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

本来は「みかん」と「バナナ」をまとめて、その上に「果物」の見出しをつけたいのに、
このコードだと「みかん」と「バナナ」のそれぞれ一行上に行が入ってしまいます。
どうしたら、まとめて一行だけ挿入することが出来るでしょうか?
コメント2件

37
デフォルトの名無しさん[sage]   投稿日:2017/01/08 22:25:17  ID:KINgQhrq.net(2)
>36
俺が困るので先に言っとく
『行』とは横のことを指す(左の数字)
縦を指すときは『列』と呼ぶ(上の英字)

そこをふまえて
>B列が1行上の値と違う場合、1行上に行を挿入して、その行に「果物」と入れたい
と言う条件と
>「みかん」と「バナナ」のそれぞれ1行上に行が入ってしまいます。
と言う結果は整合性のある状態なので問題はないと思う

もしも望む結果ではないのであればまず

 >B列が1行上の値と違う場合、

を見直すことが必要
やりたい内容を鑑みれば

 B列に入力があり、1行上の値が空白である場合、

と変えればいいと思う
コメント1件

38
デフォルトの名無しさん[sage]   投稿日:2017/01/08 22:42:31  ID:LSCp0tLP.net(3)
>37
そうですね、表現の仕方が間違っておりました。

フォーマットがもう決まってしまっているので、これで何とかしたいんですよね・・・。
どうしても、「みかん」「バナナ」をまとめて、一行上に行を挿入したいのですが。
今、思いついたのは、「みかん」「バナナ」にそれぞれ行が入ってしまうことは承知で、
「果物_01」「果物_02」と連番になるように設定して(やり方は分かっていないです)
それで_02の行は削除するというifを組んで、
さらに「果物_01」の行は「01」の部分を省くコードを書けばいいかな、と思ったりもしますが、
効率が悪いでしょうか?(やり方は分かっていないです、ただ思いつき)
コメント1件

39
デフォルトの名無しさん[sage]   投稿日:2017/01/08 22:49:26  ID:KINgQhrq.net(2)
>38
条件を変えればいいと思う

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

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

40
デフォルトの名無しさん[sage]   投稿日:2017/01/08 23:15:02  ID:LSCp0tLP.net(3)
>39
なるほど、そういう発想もありますね。
でもそうなると、どういうコードになるのでしょうか??(・・?)

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

42
デフォルトの名無しさん[sage]   投稿日:2017/01/09 00:55:08  ID:4/AW5Uyc.net(4)
>36
A列は全て 「食物」が入力されているのよね

B列にどのように入ってるの?

>B行に入る値
>・みかん
>・バナナ

これ以外は無い(すなわち空セル)って事?
コード見ると「りんご」 ってあるみたいだけど???

んで どのような結果を お望み?
コメント1件

43
デフォルトの名無しさん[sage]   投稿日:2017/01/09 00:58:47  ID:5IQR8Haa.net(2)
それって、

分類1
商品1
商品2
分類2
商品3
商品4

みたいなフォーマットなの?
もしそうなら、それは神エクセルだから、

>フォーマットがもう決まってしまっているので

そこをどうにかして、こう直したほうがいいと思うけど。

分類名 商品名
分類1  商品1
分類2  商品2

44
デフォルトの名無しさん[sage]   投稿日:2017/01/09 01:00:35  ID:5IQR8Haa.net(2)
違う、こうか。

分類名 商品名
分類1  商品1
分類1  商品2
分類2  商品3
分類2  商品4

45
デフォルトの名無しさん[]   投稿日:2017/01/09 02:56:04  ID:JlqgPD3/.net(3)
すみません、割り込みなのですが簡単な質問なので失礼します((+_+))


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


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

End Sub
コメント1件

46
デフォルトの名無しさん[sage]   投稿日:2017/01/09 03:13:17  ID:4/AW5Uyc.net(4)
>45
コマンドボタンとラベルは ユーザフォーム上なの? シート上なの?

どちらでも良い方法として

ラベルのプロパティ開いて Captionを 0 にしておく
その上で
Private Sub CommandButton1_Click()
 Label1.Caption = Label1.Caption + 100
End Sub
コメント3件

47
デフォルトの名無しさん[]   投稿日:2017/01/09 03:24:27  ID:JlqgPD3/.net(3)
>46
ユーザーフォーム上です!ありがとうございました、無事できました!

48
デフォルトの名無しさん[]   投稿日:2017/01/09 04:07:15  ID:JlqgPD3/.net(3)
何度もすみません、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
コメント2件

49
デフォルトの名無しさん[sage]   投稿日:2017/01/09 04:23:14  ID:4/AW5Uyc.net(4)
>48

>46 を良く嫁
以上

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

51
デフォルトの名無しさん[sage]   投稿日:2017/01/09 10:41:01  ID: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

52
デフォルトの名無しさん[sage]   投稿日:2017/01/09 13:48:59  ID:O0/XMIqD.net(2)
シート1の表(2次元領域)をシート2やシート3に一行に横一列にコピーしたいのですが、
一旦シート1の表の値を変数ATAI(i)に入れて、シート2や3にコピーしてます。
また別の方法で直でシート1.COPY シート2でもコピーしてみました。

両方ともコピーするのが2万個ぐらいあるのですが、処理に3分ぐらいかかります。
もっと早くする方法はありますか?
コメント1件

53
デフォルトの名無しさん[sage]   投稿日:2017/01/09 13:50:27  ID:JSUf7hDg.net
>12
エラーで中断したら再計算しないけどな
コメント1件

54
デフォルトの名無しさん[]   投稿日:2017/01/09 14:36:04  ID:SVvcq0Ni.net(4)
下記のコードでObjectにするとSheet1のaを呼び出せるのですが
WSだとメソッドまたはデータメンバーが見つかりませんになってしまいます
wsの方か厳密のような気がするのですがObjectで正解なんでしょうか?

ThisWorkbook
Dim ws As Worksheet ' Objectにすると成功
Set ws = Sheets("Sheet1")

Call ws.a() ' エラー


Sheet1
Sub a()
End Sub
コメント2件

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

56
デフォルトの名無しさん[sage]   投稿日:2017/01/09 14:37:11  ID:EPA1tS/m.net(4)
>53
あのな?「作り終わったら」ってどういう意味かわかるか?

57
デフォルトの名無しさん[sage]   投稿日:2017/01/09 14:51:56  ID:4FVlGxEy.net
>54
目的に合致してれば
問題ないです
コメント1件

58
デフォルトの名無しさん[sage]   投稿日:2017/01/09 15:00:52  ID:cjVtQucR.net(2)
>54
Sheet1.NameがSheet1じゃないのかも
コメント1件

59
54[]   投稿日:2017/01/09 15:30:22  ID:SVvcq0Ni.net(4)
もう一個謎が

Workbook_SheetChange(ByVal ws As Object, ...

Call ws.a() ' エラー
Call Sheets(ws.Name).a() ' 成功

となり訳が分かりません...

>57
理解できてないとなにか気持ち悪いです
>58
同じにしてあります;;

セルやらシートがあるのでvbaってjsやpyより難しい気がします
basicの構文も癖があるし・・
コメント1件

60
デフォルトの名無しさん[sage]   投稿日:2017/01/09 16:49:38  ID:dWF3ZE3B.net
>basicの構文も癖があるし・・
www

61
デフォルトの名無しさん[sage]   投稿日:2017/01/09 16:53:01  ID:6xa3UP1L.net(3)
プロシージャをcallで呼び出すのと何も付けないで呼び出すのとでは何が違うのでしょうか?
後者だと参照渡しになりませんでしたが。
コメント1件

62
デフォルトの名無しさん[sage]   投稿日:2017/01/09 16:53:39  ID:I9s0ZByk.net
>59
他の人が追試出来るように端折らないコード乗せて。
コメント1件

63
デフォルトの名無しさん[sage]   投稿日:2017/01/09 16:57:16  ID:6xa3UP1L.net(3)
もうわかったのでいいですすいません
コメント1件

64
デフォルトの名無しさん[sage]   投稿日:2017/01/09 17:21:48  ID:EPA1tS/m.net(4)
>63
解決したならそれをのせろや

65
デフォルトの名無しさん[]   投稿日:2017/01/09 17:22:57  ID:SVvcq0Ni.net(4)
>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
コメント1件

66
デフォルトの名無しさん[sage]   投稿日:2017/01/09 18:15:14  ID:Z/GXP5pv.net(3)
>65
sh.Name="Sheet1"
を確認しないとダメな気がする
コメント2件

67
デフォルトの名無しさん[sage]   投稿日:2017/01/09 18:21:35  ID:Z/GXP5pv.net(3)
>66
動的にイベントが発生するまでシートを確定できないからコンパイルでエラーになるみたいだよ

68
デフォルトの名無しさん[sage]   投稿日:2017/01/09 18:23:08  ID:Z/GXP5pv.net(3)
オブジェクト名でSheet1.testとすればコンパイルも通るし実行時エラーも出ない

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

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

プロシージャ a

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

プロシージャ (a)

Call プロシージャ((a))
と等価になる
コメント1件

71
デフォルトの名無しさん[sage]   投稿日:2017/01/09 19:32:58  ID:6xa3UP1L.net(3)
>70
カッコにそういう意味があったとは・・・!
わかりやすかったです、ありがとうございました。

72
デフォルトの名無しさん[sage]   投稿日:2017/01/09 22:18:09  ID:vYvrwg8z.net
>VBAはコンパイラだったのですね

えっ
コメント1件

73
デフォルトの名無しさん[]   投稿日:2017/01/09 22:32:30  ID:o7+xqhMd.net(2)
>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


74
デフォルトの名無しさん[]   投稿日:2017/01/09 22:32:55  ID:o7+xqhMd.net(2)
で、希望するフォーマットとしては

 果物
食物バナナ
食物みかん
食物その他(仮)



としたいわけです。ところが、自分の作ったシートだと

 果物
食物バナナ
 果物
食物みかん
食物


となってしまうわけです。これで分かりやすくなったでしょうか・・・
コメント2件

75
デフォルトの名無しさん[sage]   投稿日:2017/01/09 22:40:49  ID:LQfxW/qY.net
馬鹿ばっかで頭が痛くなるスレだ

76
デフォルトの名無しさん[sage]   投稿日:2017/01/09 22:45:04  ID:O0/XMIqD.net(2)
>55 ありがとう。 結局いろいろ試しましたが、セルに関数貼りつけました・・・・。
手動でセルに関数貼りつけたほうが早かったです・・・。
コメント1件

77
デフォルトの名無しさん[sage]   投稿日:2017/01/09 23:29:23  ID:4/AW5Uyc.net(4)
>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

78
デフォルトの名無しさん[sage]   投稿日:2017/01/09 23:32:51  ID:cjVtQucR.net(2)
>72
メニューにコンパイルってあるけど

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

80
デフォルトの名無しさん[sage]   投稿日:2017/01/09 23:47:23  ID:SFPxoHKZ.net
>74
本当はVBA必要ないのに、
神エクセルを作ることによって、
VBAが必要になってしまっているのではないか?

果物・・・食べ物の種類
バナナ・・・果物
みかん・・・果物

項目以外で、違うものを同じ列に入れる?

81
デフォルトの名無しさん[sage]   投稿日:2017/01/10 00:09:16  ID:hjeg5IZ9.net
食物が列にあって果物を見出しにする謎を解決しないと先に進まないんじゃないか

82
デフォルトの名無しさん[sage]   投稿日:2017/01/10 10:38:11  ID:yHxqwlUe.net(4)
>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

長すぎと怒られたので 次レスへ
コメント1件

83
デフォルトの名無しさん[sage]   投稿日:2017/01/10 10:38:44  ID:yHxqwlUe.net(4)
>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

以上、ご報告まで。

84
デフォルトの名無しさん[sage]   投稿日:2017/01/10 12:02:57  ID:yHxqwlUe.net(4)
連投すいません。次の質問です。

以下のようなマクロがあります。
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を保持する。

ご教示のほどよろしくお願い致します。
コメント1件

85
デフォルトの名無しさん[sage]   投稿日:2017/01/10 15:45:40  ID:8VGVrhFD.net(2)
>84
君の思う スマートな方法が どんなものだかは分らんが

どこかのセルを選択するのが一番簡単だと思う
適当なセルだとスクロールしてしまうのがイヤなら

・選択されてるShapeの右上のセルを選択
・画面上の左上のセルを選択
とかでいいんじゃね?
コメント1件

86
85[sage]   投稿日:2017/01/10 15:47:43  ID:8VGVrhFD.net(2)
間違った
× ・選択されてるShapeの右上のセルを選択
○ ・選択されてるShapeの左上のセルを選択

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

88
デフォルトの名無しさん[sage]   投稿日:2017/01/11 08:57:05  ID:J0hUcFsW.net
マクロでなく操作で非選択って出来る?
結局は別のものを選択してるよね

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

90
デフォルトの名無しさん[]   投稿日:2017/01/11 12:03:53  ID:tc1gJPs0.net(3)
自動で名前を付けて保存したくて、いろいろ調べて形にはなったのですが

A1に日付が2017/01/11と入ってる場合
そのセルを引用したらスラッシュも入ってしまい保存の時にいちいち消すのに困っています。
保存の時にだけスラッシュを消す方法有りませんか?
コメント2件

91
デフォルトの名無しさん[sage]   投稿日:2017/01/11 12:12:47  ID:p4WB0UzK.net(3)
>90
format

92
デフォルトの名無しさん[]   投稿日:2017/01/11 12:31:15  ID:tc1gJPs0.net(3)
InitialFilename:=Format(Range("A1"), "yyyymmdd")

このような形でいいのでしょうか?
コメント1件

93
デフォルトの名無しさん[]   投稿日:2017/01/11 12:34:16  ID:I7PY9KYr.net(4)
うちの会社ではほぼ全PCをシンクライアントにしてからというものの
ExcelVBAのマクロを保存してた「PERSONAL.XLSB」が使えなくなりました。
シンクライアントでは「PERSONAL.XLSB」に相当する機能を使用するにはどうしますか?

あとこれが本題なのですが
OutlookとWordも、それらのVBAをデフォルト的個人ファイルに保存して高頻度で使用していました。
特にOutlookのVBAでは便利なマクロを作っていました。
シンクライアントでもそれらの機能を使用するにはどうしますか?
コメント1件

94
デフォルトの名無しさん[sage]   投稿日:2017/01/11 12:35:59  ID:p4WB0UzK.net(3)
指定の位置に日付が入ってるのであればそれでよいはず
コメント1件

95
デフォルトの名無しさん[]   投稿日:2017/01/11 12:38:17  ID:tc1gJPs0.net(3)
>94
ご丁寧にありがとうございます!
コメント1件

96
デフォルトの名無しさん[sage]   投稿日:2017/01/11 12:48:03  ID:p4WB0UzK.net(3)
>93
単純に移行すれば使えると思う
以前使ってたpersonal.xlsbを所定の位置に配置すればできるはず
コメント1件

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

98
デフォルトの名無しさん[sage]   投稿日:2017/01/11 12:53:38  ID:xxQxfc5N.net
>97
会社のシステム担当者に聞けばいいよ
コメント1件

99
デフォルトの名無しさん[sage]   投稿日:2017/01/11 13:08:46  ID:uU4tfKci.net(3)
シンクライアントは勝手なことをできないように導入する目的もあるので
自分なりのカスタマイズはあきらめるしかない場合がほとんど

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

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

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

103
デフォルトの名無しさん[sage]   投稿日:2017/01/11 13:38:29  ID:uU4tfKci.net(3)
完全にVBA無関係じゃん
スレチ

104
デフォルトの名無しさん[sage]   投稿日:2017/01/11 13:38:35  ID:QIrTsKqr.net(2)
>101
板違い Windows板かパソコン一般板かPC初心者板へ

105
デフォルトの名無しさん[sage]   投稿日:2017/01/11 13:45:44  ID:1bci6XNy.net
>92
聞く前にやりなよそのくらいって思うんだが
1から10まで聞かないとなにもできないの?

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

107
デフォルトの名無しさん[]   投稿日:2017/01/11 18:57:51  ID:dcC69ZSQ.net
エクセルのメニュー、アイコン、リボン、などを初期設定状態に戻す方法はありませんか。

すみません初心者的
コメント1件

108
デフォルトの名無しさん[sage]   投稿日:2017/01/11 19:28:32  ID:uU4tfKci.net(3)

109
デフォルトの名無しさん[sage]   投稿日:2017/01/11 20:14:53  ID:anvEc3zp.net
レジストリの該当部を削除すれば(それかリネームすれば)元に戻るよ。
と思ったらリセットボタンあるのか。そちらの方がいいですね。
コメント1件

110
デフォルトの名無しさん[sage]   投稿日:2017/01/11 20:23:03  ID:1FwZUW9V.net
VBAのスレなんだからこんなの教えんなよ…

111
デフォルトの名無しさん[sage]   投稿日:2017/01/11 22:54:27  ID:QIrTsKqr.net(2)
スレチ質問もスレチ回答も荒らし

112
デフォルトの名無しさん[sage]   投稿日:2017/01/11 23:23:15  ID:JMe0AUgT.net
>90
まだこういう勘違いしている人がいるんだな・・
A1には2017/01/11と入ってるわけじゃない
42746という数字が入ってるだけ
コメント2件

113
デフォルトの名無しさん[sage]   投稿日:2017/01/12 05:41:59  ID:nMoQZoqt.net
>109
なんだこのアホな回答

114
デフォルトの名無しさん[sage]   投稿日:2017/01/12 07:13:34  ID:0A4eRqXF.net
>112
アスペ乙

115
デフォルトの名無しさん[sage]   投稿日:2017/01/12 08:41:15  ID:Lhyp+MOo.net(2)
>112
[A1].Valueが 2017/01/11 なのです。

116
デフォルトの名無しさん[sage]   投稿日:2017/01/12 09:48:23  ID:Rj8+4pg/.net(2)
[A1].Textじゃなくて?
コメント1件

117
デフォルトの名無しさん[sage]   投稿日:2017/01/12 11:56:09  ID:Cc5O9IhJ.net
お前の会社のことはお前の会社でなんとかしろよ

118
デフォルトの名無しさん[sage]   投稿日:2017/01/12 12:29:26  ID:Lhyp+MOo.net(2)
>116
表示形式が yyyy/m/d だと Text は 2017/1/11

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

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

121
デフォルトの名無しさん[]   投稿日:2017/01/12 20:07:33  ID:yR99XFwh.net(2)
で?っていう

122
デフォルトの名無しさん[sage]   投稿日:2017/01/12 20:39:27  ID:UE8PLb8+.net
日付が数字で入ってるかどうかなんて質問に関係ないよな
コメント1件

123
デフォルトの名無しさん[sage]   投稿日:2017/01/12 20:42:03  ID:eBGwra53.net(2)
>122
型によって処理が変わると思うのだが
コメント1件

124
デフォルトの名無しさん[sage]   投稿日:2017/01/12 20:46:28  ID:UiBlAwbG.net(2)
>123
Date型の変数に入れれば日付になるじゃん
コメント1件

125
デフォルトの名無しさん[]   投稿日:2017/01/12 20:54:08  ID:yR99XFwh.net(2)
不勉強で申し訳ないが世に文字列以外のファイル名を採用したファイルシステムがあるのなら是非教えて頂きたい
コメント2件

126
デフォルトの名無しさん[sage]   投稿日:2017/01/12 21:08:16  ID:eBGwra53.net(2)
>124
例えば
2017/1/12
20170112
1/12/2017
シリアル値
全部同じになるっけ?
コメント1件

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

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

129
デフォルトの名無しさん[sage]   投稿日:2017/01/12 22:24:16  ID:URc2UNFw.net(2)
あいてるセルにファイル名を生成する関数つくって、そのセル参照させればいいだけじゃないのけ?

保存場所どこにするかによってはスペースは使えないが。

130
デフォルトの名無しさん[sage]   投稿日:2017/01/12 22:26:45  ID:VnxSw5mv.net
>95で解決した話題がまだ続いてる
コメント1件

131
デフォルトの名無しさん[sage]   投稿日:2017/01/12 22:40:44  ID:URc2UNFw.net(2)
>130
そうなんだ・・・しつれいした

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

133
デフォルトの名無しさん[sage]   投稿日:2017/01/13 12:38:07  ID: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
どちらのほうが処理速度が向上しますか?
コメント3件

134
デフォルトの名無しさん[sage]   投稿日:2017/01/13 12:39:52  ID:xEiCBlzV.net(2)

135
デフォルトの名無しさん[sage]   投稿日:2017/01/13 12:43:08  ID:5NHpz1Ta.net(3)
>134
vlookup→配列に入れてif分岐→findの順番の早さ
findが遅いのは確か

136
デフォルトの名無しさん[sage]   投稿日:2017/01/13 12:58:05  ID:dokIsM4J.net
>133
シートでsql

137
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:02:40  ID:5NHpz1Ta.net(3)
findが遅いって言ってもセルを直接参照して処理するよりは早い
コメント1件

138
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:15:44  ID:HxNmVQ/n.net
>137
ってことは、後者のほうが速いということでしょうか?
コメント1件

139
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:24:35  ID:Pq7AWenX.net
vlookup→配列に入れてif分岐→find→セルを直接参照してif分岐

140
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:32:41  ID:q4yhPByZ.net(2)
えっと、関数は使うつもりはありません
伝えてなくてすいません
コメント1件

141
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:33:30  ID:q4yhPByZ.net(2)
携帯回線のせいでIDがコロコロ変わる…
>133です

142
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:43:05  ID:xEiCBlzV.net(2)
>140
vbaにはWorksheetFunctionと言うクラスが用意されている
その中にvlookupと言うメソッドがあるのでそれを利用すればいかが?

これを使いたくないってことなら勘違いでごめんなさい

143
デフォルトの名無しさん[sage]   投稿日:2017/01/13 13:58:35  ID:5NHpz1Ta.net(3)
>138
OfficeTANAKA 高速化テクニックでググれば幸せになれるよ

144
デフォルトの名無しさん[sage]   投稿日:2017/01/13 17:01:55  ID:OhnPZwk7.net
ジャパネット・・・

145
デフォルトの名無しさん[sage]   投稿日:2017/01/13 22:23:24  ID:N+jcCuX6.net
ていうか何行あるんだよ。
少なければWorksheetFunction.Vlookupで十分。
多ければ、高速VlookupかSQL。
コメント1件

146
デフォルトの名無しさん[sage]   投稿日:2017/01/13 22:45:47  ID: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

147
デフォルトの名無しさん[]   投稿日:2017/01/14 14:19:38  ID:eOx3RZdu.net(2)
以下を実現するexcel vbaの書き方を教えてください。
お願いします。

セルA1に aaa

148
デフォルトの名無しさん[]   投稿日:2017/01/14 14:20:50  ID:eOx3RZdu.net(2)
以下を実現するexcel vbaの書き方を教えてください。
お願いします。

セルA1に aaa"bbbb"cc
セルA2に a"dd"cccc
という文字列があるとき、
セルB1に bbbb
セルB2に dd
(それぞれ、" "で挟まれた文字列)を出力する。
コメント3件

149
デフォルトの名無しさん[sage]   投稿日:2017/01/14 14:28:13  ID:hMPeMSWC.net
>148
split

150
デフォルトの名無しさん[sage]   投稿日:2017/01/14 14:36:22  ID:l+bXNSZh.net
>148
Sub Macro1()
  [B1] = Split([A1], """")(1)
  [B2] = Split([A2], """")(1)
End Sub

151
デフォルトの名無しさん[sage]   投稿日:2017/01/14 14:59:32  ID:TCZ/fLWF.net
>148
文字列関連の関数あらかた覚えなさい
難しくないから

152
デフォルトの名無しさん[sage]   投稿日:2017/01/15 11:53:32  ID:ncM8p+KA.net
>145
高速vlookupって何?
コメント1件

153
デフォルトの名無しさん[sage]   投稿日:2017/01/15 12:46:48  ID:m2E/VbcR.net(2)
このスレのテンプレにOfficeTANAKA入れたら質問激減しそう
ってレベルの質問が来るとガクッと来る

154
デフォルトの名無しさん[sage]   投稿日:2017/01/15 14:21:19  ID:FqEOuXry.net
ガクッと来るのも自由、回答したくないなら回答しないのも自由
レベルの制限をしてるわけじゃなし
コメント1件

155
デフォルトの名無しさん[sage]   投稿日:2017/01/15 14:36:53  ID:m2E/VbcR.net(2)
>154
まあそらそうなんだけども
ググった方が早くねって言うね

156
デフォルトの名無しさん[sage]   投稿日:2017/01/15 18:05:40  ID:trUVIHlw.net
確かに「まずググれよ」と思う質問はたまにあるな。

検索の仕方も分からないような状態ならともかく、
このスレに書いてる単語を並べていけばたどり着くだろ的なのも多い。

ちゃんとしたサイトの方が図で説明してくれるから分かりやすいだろうし。

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


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

158
デフォルトの名無しさん[sage]   投稿日:2017/01/15 21:24:21  ID:tflJaJ6v.net
>157
とにかく完全一致検索が遅いから使いたくない、じゃどうするか
ってことなんででしょうね。

Office Tanakaの
http://officetanaka.net/excel/function/function/vlookup.htm
に「検索値が見つからないとき超えない最大値を返す仕様がとても助かる」とあるけど
検索値をはさむ[from, to]がわかるのが一番助かると思う。
(検索値が存在しない場合は、to < from)

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

160
デフォルトの名無しさん[sage]   投稿日:2017/01/16 03:49:06  ID:L7GtxIZz.net
二分検索木とか知らん馬鹿ばっか
コメント3件

161
デフォルトの名無しさん[sage]   投稿日:2017/01/16 05:39:23  ID:/FyYs0Da.net
>160

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

162
デフォルトの名無しさん[sage]   投稿日:2017/01/16 05:48:43  ID:K1gRWFXI.net
ソート済のデータ検索なら バイナリサーチ(二分探索)じゃね?

163
デフォルトの名無しさん[sage]   投稿日:2017/01/16 07:22:24  ID:Zl2rcSDP.net(2)
>160
木構造にはなっていないのでは?
コメント1件

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

165
デフォルトの名無しさん[sage]   投稿日:2017/01/16 11:22:13  ID:q0YsoZyP.net
ソート済の二分探索なら100個の時7回ループ、500個なら9回、100万個でも20回ループすれば終わるから

166
デフォルトの名無しさん[]   投稿日:2017/01/16 15:06:17  ID:CkU8X3ZM.net
30もない俺のシートじゃ意味なさそうやな

167
デフォルトの名無しさん[sage]   投稿日:2017/01/16 23:26:54  ID:Py9dY2eU.net
ソート済でも完全一致が遅いのは何故?
一致するのを見つけたら、それ以上探さないで次に行けば、
近似値でも同じことじゃないかと思うんだけど。
コメント1件

168
デフォルトの名無しさん[sage]   投稿日:2017/01/16 23:32:38  ID:Zl2rcSDP.net(2)
>167
ソート済かどうかなんてわからないから頭から舐めていく
コメント1件

169
デフォルトの名無しさん[sage]   投稿日:2017/01/17 00:13:17  ID:HvycQCZc.net
>168
一致するのが複数あっても、
どうせ1番上の1個しか拾ってこないんだから、
見つかった時点でループ抜けりゃいいじゃんって事なんだけど。

近似値だと探し方が違うの?
コメント1件

170
デフォルトの名無しさん[sage]   投稿日:2017/01/17 00:17:50  ID:jzPK8o2C.net(3)
>169
いやだから頭から一つ一つ舐めていく必要があるかどうかの違い
コメント1件

171
デフォルトの名無しさん[sage]   投稿日:2017/01/17 00:26:02  ID:Upzxz6/t.net(3)
>170
近似値だと頭から見なくてよいのはなんで
具体的にどうやってると考えてるの
コメント1件

172
デフォルトの名無しさん[sage]   投稿日:2017/01/17 00:28:39  ID:jzPK8o2C.net(3)
>171
辞書で単語を引くときにやっているやり方さ
コメント1件

173
デフォルトの名無しさん[sage]   投稿日:2017/01/17 00:32:26  ID:Upzxz6/t.net(3)
>172
辞書を作るときは頭から見なくてよいの?
コメント1件

174
デフォルトの名無しさん[sage]   投稿日:2017/01/17 01:00:47  ID:035vzIzN.net(2)
>173
書籍としての辞書を利用するときをイメージするといいかも
まず視覚的に先頭文字の見出しの位置を開いて調べる
この感覚

近似値を利用する場合は「文末違うけどだいたいこんな感じだよね」って得るためより正確な情報を得るためにはソートする必要がある
完全一致だとそもそも一致していることが条件となるのでソートする必要がなくなる

正確に言うと異なると思うけどだいたいこんなイメージ
コメント1件

175
デフォルトの名無しさん[sage]   投稿日:2017/01/17 01:13:18  ID:mp4Rluyj.net

176
デフォルトの名無しさん[sage]   投稿日:2017/01/17 06:36:26  ID:Upzxz6/t.net(3)
>174
完全一致でも昇順に並べられていることを前提とすれば辞書方式が使えると思うけどな
コメント1件

177
デフォルトの名無しさん[sage]   投稿日:2017/01/17 07:13:51  ID:jzPK8o2C.net(3)
>176
使えるが そういう仕様に なってない

178
デフォルトの名無しさん[sage]   投稿日:2017/01/17 09:11:54  ID:035vzIzN.net(2)
個人的には完全一致の場合ソート不要って仕様はありがたい

179
デフォルトの名無しさん[sage]   投稿日:2017/01/17 19:24:38  ID:gxb7F/t0.net
>175

いろいろ勉強になりました。
十数年、vlookupは特殊な場合を除いて完全一致で使うものだと思っていました。
数十万のvlookupをかけて3時間ぐらい帰ってこないような処理をしたことがあり
いま考えると無謀だったなと、、

180
デフォルトの名無しさん[]   投稿日:2017/01/17 20:31:05  ID:EPmzwVho.net(3)
xml文を読み込んで階層、パラメータ名、設定値を求めるvbaの書き方がわかりません。
どなたか教えてくださいお願いします。

イメージ図:
http://www.dotup.org/uploda/www.dotup.org1127385.jpg
I1にXML文、A〜G列の1-2行目がある状態でVBAを実行すると、
A〜G列の3行目から下が出力されるイメージです。
XML文全体は約500行のものが複数、どれも階層は4以下です。

以上、よろしくお願いします。
コメント4件

181
デフォルトの名無しさん[sage]   投稿日:2017/01/17 21:21:06  ID:pDqJREhG.net(2)

182
デフォルトの名無しさん[sage]   投稿日:2017/01/17 21:22:53  ID:UOrZs7iT.net
>180
ノード名もパラメーターとして出す(イメージ図で言う太字の箇所)
で良いのかい?

あと、階層の各列には同じ数値しか入らない
で良いのかい?

これを求めているのなら求めているで構わないけど得られる結果をまた精査することになると思う
コメント1件

183
デフォルトの名無しさん[sage]   投稿日:2017/01/17 21:47:24  ID:pDqJREhG.net(2)
>180
あと出力順が
1
 2
  3
  3
  3
のようになってるけど
1
 2
  3
  3
 2
  3
つまり Subject が2回出力されるんじゃダメ?
コメント1件

184
デフォルトの名無しさん[]   投稿日:2017/01/17 21:49:25  ID:EPmzwVho.net(3)
>181
ありがとう。
実はこのサイトとかを参考に試行錯誤したがうまくできくてここで尋ねたんだ。

>182
はい、おっしゃる通り
・ノード名もパラメータとして(太字で)出す。
・階層の各列には同じ数字しか入らない。B列は空白か1か、C列は空白か2、・・・。
です。

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

186
デフォルトの名無しさん[sage]   投稿日:2017/01/17 23:53:22  ID:HYIsieSI.net(2)
>185
その場合
&lt;xxx ...>
 <...>
 <...>
</xxx>
<yyy ...>
 <...>
 <...>
</yyy>
<xxx ...>
 <...>
 <...>
</xxx>
の場合はどのように出力するの?
タグ名毎に集約するの?

187
デフォルトの名無しさん[sage]   投稿日:2017/01/17 23:55:02  ID:HYIsieSI.net(2)
最初が化けた...
<xxx ...>
 <...>
 <...>
</xxx>
<yyy ...>
 <...>
 <...>
</yyy>
<xxx ...>
 <...>
 <...>
</xxx>
のケースね。
コメント1件

188
デフォルトの名無しさん[]   投稿日:2017/01/18 00:16:31  ID:P2ujaP/J.net(7)
>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が複数出る)
コメント1件

189
デフォルトの名無しさん[sage]   投稿日:2017/01/18 07:02:26  ID:KfZHaLf7.net
>188
<xxx ...>
<yyy ...> -- (1)
</yyy>
</xxx>
<zzz ...>
<yyy ...> -- (2)
</yyy>
</zzz>
<xxx ...>
<yyy ...> -- (3)
</yyy>
</xxx>
のケースで (1) と (3) も集約するの?
たぶん xml からの読み込みと集約処理を分けた方がいいと思う。
コメント1件

190
デフォルトの名無しさん[]   投稿日:2017/01/18 08:46:32  ID:dxlKDUod.net
>189
携帯から失礼します。
はい、その場合も集約します。

具体的にはどんなコードで書いたらよろしいですかね。

191
デフォルトの名無しさん[]   投稿日:2017/01/18 10:08:50  ID:nvWV6Cl1.net

192
デフォルトの名無しさん[sage]   投稿日:2017/01/18 10:46:36  ID:mepmwC6J.net
Dictionaryの配列で書けるでしょ

193
デフォルトの名無しさん[sage]   投稿日:2017/01/18 12:19:13  ID:zXM8oXoh.net(5)
なんで、XMLParser を自分で作るの?

Groovy とかで、すぐに出来るだろ
コメント1件

194
デフォルトの名無しさん[sage]   投稿日:2017/01/18 12:35:52  ID:4FnlBNL6.net
>193
すぐw
じゃあ書いてみろよ
コメント1件


195
デフォルトの名無しさん[sage]   投稿日:2017/01/18 12:38:39  ID:NBGHKSlQ.net
さすがに MSHTML.HTMLDocument オブジェクトとかは使うんだろうと思っていたが違うのかな?

196
デフォルトの名無しさん[sage]   投稿日:2017/01/18 12:54:48  ID:Fv9px6Lv.net(2)
特定のセルが書式を設定されてるかどうかの判定ってどうすればいいでしょうか?
例えば文字が入ってなくても色や太さが設定されてるとか
コメント1件

197
デフォルトの名無しさん[sage]   投稿日:2017/01/18 13:04:49  ID:UZ6KtMVe.net(2)
>196
普通にセルのプロパティで取得すればいいんでない
コメント1件

198
デフォルトの名無しさん[sage]   投稿日:2017/01/18 13:07:57  ID:Fv9px6Lv.net(2)
>197
If Range("A1").Value="" Then
でいけますか?
コメント1件

199
デフォルトの名無しさん[sage]   投稿日:2017/01/18 13:25:21  ID:UZ6KtMVe.net(2)
>198
forecolorとかbackcolorとかだよ
オブジェクトブラウザでcells調べてみ?

200
デフォルトの名無しさん[sage]   投稿日:2017/01/18 15:02:26  ID:zXM8oXoh.net(5)
Groovyでは、
def root = new XmlParser().parse("ファイル名.xml")

root.タグ名.each{
println it.text()
ここで処理する
}

it は、イタレータから渡ってくる、暗黙の要素を指す

201
デフォルトの名無しさん[sage]   投稿日:2017/01/18 17:11:44  ID:XrR2JBi4.net
>180
そもそも、なんでExcelに展開しようとしてるんだ?
それが最終目的か?

あと、自分でどこまでできたのか書いてくれ。
コメント1件

202
デフォルトの名無しさん[sage]   投稿日:2017/01/18 17:46:16  ID:WZOpQPDJ.net(2)
http://smilejapan.net/wiki/index.php?VBA%20XMLデータをDOMで扱う方法

XML関連

203
デフォルトの名無しさん[sage]   投稿日:2017/01/18 19:44:31  ID:zXM8oXoh.net(5)
<Subject japanese="kokugo">
<Subject math="sugaku">

1回目の<Subject>の際、japanese, math の、2つが取れているのは、Traverse の幅優先探索か?
普通は、深さ優先探索だけど

様々な言語を見たけど、日本語のサイトで、Traverse の処理を書いているサイトは、ほとんどない。
どないなっとんねん?

204
デフォルトの名無しさん[]   投稿日:2017/01/18 20:09:10  ID:P2ujaP/J.net(7)
>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に出す方法がわからない。
コメント2件

205
デフォルトの名無しさん[sage]   投稿日:2017/01/18 20:17:32  ID:WZOpQPDJ.net(2)
xmlファイルをhtmlとして読み込めばいいんじゃね
でgetelementsbytagname()とかつかう

206
デフォルトの名無しさん[sage]   投稿日:2017/01/18 20:26:10  ID:9qUMY5Wm.net
>204
馬鹿過ぎて話しにならない。
馬鹿に無理。

207
デフォルトの名無しさん[sage]   投稿日:2017/01/18 20:47:34  ID:IDSE4GPa.net
>194
ふぅ

208
デフォルトの名無しさん[sage]   投稿日:2017/01/18 21:15:38  ID:zXM8oXoh.net(5)
XML Parserは、jQuery, Groovy, Python, Ruby など、何にでもある

ただ、traverse の説明が、日本語のサイトでは見当たらない。
深さ優先ではなく、幅優先探索だろ?

209
デフォルトの名無しさん[sage]   投稿日:2017/01/18 21:22:46  ID:uheDDMMj.net(6)
>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

210
209[sage]   投稿日:2017/01/18 21:23:19  ID:uheDDMMj.net(6)
'続き
 'ノードパラメータ表示
 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
コメント1件

211
デフォルトの名無しさん[sage]   投稿日:2017/01/18 21:25:28  ID:zXM8oXoh.net(5)
XML Parserは、jQuery, Groovy, Python, Ruby など、何にでもある

ただ、traverse の説明が、日本語のサイトでは見当たらない。
深さ優先ではなく、幅優先探索だろ?

Java
http://www.technotype.net/tutorial/tutorial.php?fileId=%7BDOM%7D&;sectionId=%7Btraversing-the-node-tree%7D

子ノードリストを取得
NodeList list = parentNode.getChildNodes();

要素に従属する属性リストを取得
NamedNodeMap map = elementNode.getAttributes();

最悪、traverse 関数内で、traverse・自分自身を呼ぶ、再帰的な処理を作る。
traverse 関数が最初からあれば、もっと簡単。
それに幅優先探索を指定する
コメント1件

212
デフォルトの名無しさん[]   投稿日:2017/01/18 21:56:11  ID:P2ujaP/J.net(7)
>210
ありがとう。
実際やってみたらA3とB3に1が出力されて、
オブジェクト変数またはWithブロック変数が設定されていません
と言われました。どうしてだろ。。。

>211
はい、幅優先探索です。
ありがとうございます。transverseについてちょっと調べてみます。
コメント2件

213
デフォルトの名無しさん[sage]   投稿日:2017/01/18 22:00:58  ID:uheDDMMj.net(6)
>212
XML規則に則ってる?
あと ノード名(タグ名?)は 大文字小文字 区別するぜ

どっか XMLファイルUP出来ない?
コメント1件

214
デフォルトの名無しさん[sage]   投稿日:2017/01/18 22:08:43  ID:uheDDMMj.net(6)
>212
もしかして↓このまま? 実際のXMLファイル名に修正してよね

XMLDoc.Load "D:\XML.txt" 'XMLファイルを読み込む

215
デフォルトの名無しさん[]   投稿日:2017/01/18 22:12:35  ID:P2ujaP/J.net(7)
>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>
コメント1件

216
デフォルトの名無しさん[sage]   投稿日:2017/01/18 22:29:42  ID:uheDDMMj.net(6)
>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
コメント1件

217
デフォルトの名無しさん[sage]   投稿日:2017/01/18 22:30:45  ID:vXs3og/7.net
アドインのデータはどこに保存するのが標準的なの?
シートだと階層構造のデータを保存しにくいからxmlファイルにして保存したい
コメント2件

218
デフォルトの名無しさん[]   投稿日:2017/01/18 22:41:40  ID:P2ujaP/J.net(7)
>216
ありがとうございます。エラーはなくなりました。
ただ1つ問題が・・・
math,sugakuを読み込んでいない。8行目と9行目の間に入れたいのですが。

実行画面結果は以下のようになりました
http://www.dotup.org/uploda/www.dotup.org1128435.jpg
コメント1件

219
デフォルトの名無しさん[sage]   投稿日:2017/01/18 22:50:58  ID:uheDDMMj.net(6)
>218
'同じ名前の子ノードを 最初の一つに集約
で集約してるからそうなるが(その下は移動してる)

前からの レスで集約するって言ってたんじゃない?

'同じ名前の子ノードを 最初の一つに集約
の(FOR〜NEXT)部分ざっくり削除してみ
コメント1件

220
デフォルトの名無しさん[]   投稿日:2017/01/18 23:09:44  ID:P2ujaP/J.net(7)
>219
あー、申し訳ない。
7行目のSubjectの下に、japaneseとmathをまとめて出力するという意味で使ってしまっていました。

221
デフォルトの名無しさん[]   投稿日:2017/01/18 23:20:05  ID:P2ujaP/J.net(7)
まとめて=8行目にjapanese,9行目にmath
という意味です
コメント1件

222
デフォルトの名無しさん[sage]   投稿日:2017/01/19 00:09:17  ID: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
コメント1件

223
デフォルトの名無しさん[sage]   投稿日:2017/01/19 00:38:26  ID:qjpOvOJu.net(2)
ここまで来ると、もうわけがわからんな。
プログラムでプログラム文を自動生成します、みたいな話だろ?

224
デフォルトの名無しさん[sage]   投稿日:2017/01/19 05:02:36  ID:WDgxZeys.net
何かの言語には、自動的に、traverse する関数があるはず。
または既に、外人が作って、Gitにあるはず。
日本のサイトで探しても、見つからない

それに、深さ優先探索か幅優先探索を指定する

Pythonのwalkは、あるディレクトリ以下の階層を渡り歩く。
つまり、それのXML版だろ

ディレクトリもXMLも、Tree だから、基本的には同じ

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

226
デフォルトの名無しさん[]   投稿日:2017/01/19 07:34:02  ID:R0f6tJX+.net(2)
>>222
できたああああああああああああ
ありがとうございます!
罫線やノード名の一部を太字にするなど微修正は自分でできました。

皆様ありがとうございました。

227
デフォルトの名無しさん[sage]   投稿日:2017/01/19 12:16:13  ID: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"と日付が入り、表示形式がおかしくなってしまいます。
繰り上げのコードが間違っているのでしょうか?
コメント1件

228
デフォルトの名無しさん[sage]   投稿日:2017/01/19 12:21:46  ID:4RX8xFF/.net

229
デフォルトの名無しさん[sage]   投稿日:2017/01/19 12:47:27  ID:ZXvOrtNX.net
>228
解決しました
ありがとうございます

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

231
デフォルトの名無しさん[sage]   投稿日:2017/01/19 15:37:44  ID:irXhj7sG.net(2)
>230
とりあえずマクロの記録を試してみたら?

232
デフォルトの名無しさん[sage]   投稿日:2017/01/19 15:50:51  ID:9G0IwAcw.net
>217
これは俺も知りたいc++だとxmlに書いてるのよく見るけどvbaはどうなんだ

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

234
デフォルトの名無しさん[sage]   投稿日:2017/01/19 20:17:42  ID:irXhj7sG.net(2)
>233
Textの方は書式を評価しないといけないからそんなものじゃね?
コメント1件

235
デフォルトの名無しさん[]   投稿日:2017/01/19 20:23:44  ID:R0f6tJX+.net(2)

236
デフォルトの名無しさん[sage]   投稿日:2017/01/19 21:13:36  ID:9zfnUwsN.net
>234
なるほど
.Valueで取得してから書式あてた方が無難ですね

237
デフォルトの名無しさん[sage]   投稿日:2017/01/19 23:40:16  ID:qjpOvOJu.net(2)
マジか!!
Valueで取得しようとすると、
#N/Aでコケるから、ずっとText使ってたわ!

ん?
でも0.3秒と130秒って違い過ぎじゃないか?
0.3秒なんて、For Nextじゃ取れないと思うが。
a=Range("A1:A70000").Valueとかじゃないと。
コメント2件

238
デフォルトの名無しさん[sage]   投稿日:2017/01/20 04:41:52  ID:9/J9Uge2.net(2)
>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"を試しました。
(続く)

239
デフォルトの名無しさん[sage]   投稿日:2017/01/20 04:43:33  ID:9/J9Uge2.net(2)
>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です。
更新情報
・スレッド一覧ページで過去ログのタイトル検索・一覧表示ができるようになりました(2016/1/20)
NGワード登録
登録する
スレッド内検索

プログラム板 タイトル検索

このスレッドが人気です(実況系)
実況 ◆ 日本テレビ 54028 (770)NTV実況
実況 ◆ フジテレビ 82454 ノンストップ (254)フジ実況
実況 ◆ テレビ朝日 46582 (985)テレ朝実況
羽鳥慎一モーニングショー★4 (430)テレ朝実況
白熱ライブ ビビット★1 (783)TBS実況
NHK総合を常に実況し続けるスレ 130187 (1000)NHK実況
連続テレビ小説 ベっぴんさん★149 (396)NHK実況
はやドキ!&あさチャン!金曜日★1 (920)TBS実況
このスレッドが人気です(ニュース系)
【冬季アジア大会】アパグループは客からの要望で「本を一時的にフロントで預かるよう、全国のホテルに指示することを検討」★2 (1000)ニュー速+
【冬季アジア大会】アパグループは客からの要望で「本を一時的にフロントで預かるよう、全国のホテルに指示することを検討」★3 (102)ニュー速+
【就職】採用選考の際に戸籍謄本の提出を求める企業、2割近くに上る…生まれた場所などを記入させていたケースも (77)ニュー速+
【芸能】スクープ! 狩野英孝「17歳現役女子高生と淫行疑惑!」 (1000)音楽・芸能ニュース
【冬季アジア大会】アパグループは客から要望で「本を一時的にフロントで預かるよう、全国のホテルに指示することを検討」 (1000)ニュー速+
【芸能】狩野英孝謹慎も 女子高生との淫行疑惑報道、一両日中にも会見へ (732)音楽・芸能ニュース
【生活】「あら、○○ちゃんお姉ちゃんになったのね!おめでとう」「恥ずかしいことじゃないから!」 初潮の赤飯文化反対!が話題★3 (857)ニュー速+
【相撲】大関・豪栄道が休場 13日目対戦相手の稀勢の里は不戦勝 (220)音楽・芸能ニュース
プログラム板の人気スレ
【統計分析】機械学習・データマイニング11 (940)
C++相談室 part129 (182)
Excel VBA 質問スレ Part45 (239)
C言語なら俺に聞け 138 (572)
Xamarin Part3 (246)
ふらっと C#,C♯,C#(初心者用) Part126 (260)
Visual Studio 2015 Part7 (1000)
Androidプログラミング質問スレ revision52 (560)
【PHP】下らねぇ質問はここに書き込みやがれ 7 (636)
くだすれPython(超初心者用) その31 (863)
次世代言語議論スレ【Go Rust Haskell Scala Erlang Elixir】 (468)
クラス名・変数名に迷ったら書き込むスレ。Part27 (740)
+ JavaScript(ECMAScript)質問用スレッド vol.122 + (978)
スレ立てるまでもない質問はここで 145匹目 (95)
推薦図書/必読書のためのスレッド 80 (950)
☆★Java質問・相談スレッド179★★ (580)
Swift part9 (584)
Ruby 初心者スレッド Part 59 (555)
VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】 (347)
【JavaScript】スクリプト バトルロワイヤル55【php,py,pl,rb】 (459)
人工知能ディープラーニング機械学習のための数学 (105)
プログラミング言語 Rust 2 (311)
Java入門・初心者質問スレ Part.2 (297)
+ JavaScript の質問用スレッド vol.122 + (628)
ディープラーニング (964)
Swift part7 (1026)
テストしにくいコードをテストする方法 その2 (51)
このサイトについて
このサイトは2ちゃんねるからデータを取得し、表示するサービスです。
画像のインライン表示機能について
画像のURLの後ろにある[画像をインライン表示]をクリックすると、URLの下に表示します。
表示される画像は横幅100pxに縮小されていて、クリックすると原寸で表示します。
このサイトの特徴
1)スレッド内検索ができます
2)レス(「>>1」など)のポップアップができます
3)不適切な言葉を含む投稿を表示しません
4)ページ内で画像を直接表示できます
5)2ch他スレッドへのリンクはタイトル・板名つきでリンクします
6)すっきりとしたデザインで表示します
7)最新スレや前スレをチェック・一覧表示します
8)NGワード機能の搭載でイヤな言葉が目に入りません
9)荒らしを自動チェックします
10)スレッド内・同一IDの書き込みだけ表示できます
11)レスの返事をレスされた発言の下に表示する「まとめビュー」が利用できます
12)シリーズ化したスレッドの一覧を表示します
13)最新のスレッドがある場合はお知らせします
削除について
こちらをご覧ください
機能要望について
現在機能要望受付中です。
問い合わせについて
こちらのページからどうぞ
Amazon


このサイトは2ch.scからデータを取得・表示しています。削除などについてはこちらをご覧ください。 アクセスモード:差分取得 - 新着書き込みなし(304)