トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0488デフォルトの名無しさん2016/01/20(水) 00:41:59.97ID:uYf8rD9k
モジュールって基本的にはVBA実行中はずっと生きてる気がする
つまりモジュールレベルの変数は明示的にNothing代入するなりRedimするなりしないと開放されない気がする
0489デフォルトの名無しさん2016/01/20(水) 01:20:01.65ID:7T123+WA
>>487
もう一つ別に、Excelプロセスを起動したら?
0490デフォルトの名無しさん2016/01/20(水) 02:06:12.29ID:3JHsYJhz
話むしかえすけど
配列マジックを極める(ASCII)
って本をアマゾンでジャケ買いしたんだけど
VBAのことほとんど触れてねー
VBAでいうところの配列のテクニックを期待してたんだが残念。
やっぱ本はジャケ買いするもんじゃないな
0491デフォルトの名無しさん2016/01/20(水) 03:44:21.39ID:gC8iY3QI
>>487
ループ処理にDoEvents入れればループ処理宙は実行中に他の作業が出来る。
0492デフォルトの名無しさん2016/01/20(水) 07:11:18.99ID:xfIx1JoD
>>490
そんな本があるのか。
息するように配列を弄りまくっている俺でも、VBAの配列にはよくわからないところがある。
0493デフォルトの名無しさん2016/01/20(水) 08:21:54.61ID:biOEENiS
>>459
サブルーチンの中で定義したいと言う話
ファイル単位のスコープならモジュールでもできる
0494デフォルトの名無しさん2016/01/20(水) 10:03:37.62ID:TOXNslUJ
>>468
今気がついた。

普通にJavaScriptの構文で書いてた。最近VBAよりそっちの仕事のほうが多くて
ガチで気が付かなかった。
0495デフォルトの名無しさん2016/01/20(水) 10:37:40.75ID:HskUHurd
>>494
配列のarrayってVBAでいうジャグ配列(配列を要素とする配列)のことだろうか?
ByRefで関数に渡せるよ。
要素を参照で持てるか?という意味だとしたら、それはできない。
0496デフォルトの名無しさん2016/01/20(水) 11:25:41.73ID:TOXNslUJ
>>495
なるほどねぇ。

JavaScriptやってると配列関係の取扱いがVBAとはちょっと違うので、混乱するね。
0497デフォルトの名無しさん2016/01/20(水) 11:53:53.10ID:HskUHurd
例えば3つの配列
array1
array2
array3
をまとめて、
array_all = Array(array1, array2, array3)
なんてものを作ると、全部コピーになってしまう。
参照にしたくて色々試したが成功しない。
どうやら不可能なようだ。
0498デフォルトの名無しさん2016/01/20(水) 12:46:25.59ID:V5TARUOi
≫486>>487
度々ありがとうございます。
念のため、全てnothingで終わらせてみる実験をしてみます。長く走らせると不手際で解放されてないのかも知れません。
0499デフォルトの名無しさん2016/01/20(水) 18:19:33.52ID:xdXYdVv+
対象セルがどこかのセルで参照されているかどうか、
判定することはできるのでしょうか。

参照先のセルを得るのではなく、
「参照されているか、否か」を判定する方法です。

シート内の不要データの整理に使いたいと考えています。
0500デフォルトの名無しさん2016/01/20(水) 18:34:15.12ID:XFqYG3t7
isref
05014992016/01/20(水) 18:45:24.37ID:xdXYdVv+
>>500

あわせて調べてみました。
ttp://excel.onushi.com/function/isref.htm

isref()の引数で判定対象のセルを指定すればいいのですかね。
isref(cells(i,j)) みたく。
0502デフォルトの名無しさん2016/01/20(水) 19:48:55.16ID:XFqYG3t7
>>501
参照できたかどうかの関数らしい
ので間違いだった
セルの内容が参照の場合trueって説明だったから
isref使った時点で参照してるじゃんってミスでもないらしい
考えるにデータの入っていないセルに参照されてるかどうかの
プロパティつけるのは無駄かもしれないので
アイディアがないと無理そう
0503デフォルトの名無しさん2016/01/20(水) 20:55:20.57ID:uYf8rD9k
>>499
Range.Dependents プロパティ
05044992016/01/20(水) 22:25:06.28ID:xdXYdVv+
Dim range1 As Range

Dim returnValue As Range
returnValue = range1.Dependents

こんな感じでrange型変数に格納したあと、
if分で空(nothing)かを判定する、というのはどうなんでしょうか。
(自分で確認すれば良いのですが、ちょっと今は試せない状況で・・・)

ただ、どっちにしろ
>Dependents プロパティは作業中のシートでのみ有効で、
>リモート参照をトレースできないことに注意してください
ttps://msdn.microsoft.com/ja-jp/library/office/ff197707.aspx

なんて記述があるんで、
他シートをまたいでいるものに関しては
文字列判定をする必要がありそうですが。
0505デフォルトの名無しさん2016/01/21(木) 00:52:36.55ID:rehOk3U9
10行×5列の表があって、1列目に5個、2列目に8個、3列目に5個、4列目と5列目は空欄となっています。各項目は必ず1行目から入っています。
各列から1つずつ取って、それらを左から繋げた文字列(順列)を作りたいのですが、どのように書けば良いのでしょうか。
各列に何個要素があるかをカウントするところまでは書けたのですが、そこからよくわからなくなってしまいました
0506デフォルトの名無しさん2016/01/21(木) 01:06:23.00ID:X7n9A0oT
>>505
こんな感じか?

Sub macro1()
  r = 1
  For r1 = 1 To 5
    For r2 = 1 To 8
      For r3 = 1 To 5
        s = Cells(r1, 1) & Cells(r2, 2) & Cells(r3, 3)
        Cells(r, 6) = s
        r = r + 1
      Next
    Next
  Next
End Sub
0507デフォルトの名無しさん2016/01/21(木) 01:07:45.84ID:0jk7vnPh
>>499
Function RefCheck(CheckRange As Range) As Boolean
If CheckRange Is Nothing Then Exit Function
RefCheck = True
For Each x In ThisWorkbook.Worksheets
For Each y In x.UsedRange
For Each Z In CheckRange
If y.Formula Like "*" & Z.Address(1, 1) & "*" _
Or y.Formula Like "*" & Z.Address(0, 1) & "*" _
Or y.Formula Like "*" & Z.Address(1, 0) & "*" _
Or y.Formula Like "*" & Z.Address(0, 0) & "*" _
Then Exit Function
Next
Next
Next
RefCheck = False
End Function

あとは調べて無いけど同一シート内で参照していた場合もブック名とシート名を表示させる事が出来れば、
Addressの第四引数にTrue入れてチェックする事で間違いなく判定出来る。
0508デフォルトの名無しさん2016/01/21(木) 05:38:14.28ID:tGM9G3/P
>>506
ありがとうございます
そういう感じで必要十分なのですが、余談ですが同じような処理を繰り返すのでもう少しうまく処理できるのでしょうか?
0509デフォルトの名無しさん2016/01/21(木) 06:18:36.49ID:0jk7vnPh
>>508
Sub test()
Dim a(1 To 5), str(5), b() As String, index As Long
For i = 1 To 5
a(i) = Range(Cells(1, i), Cells(Rows.Count, i).End(xlUp)).Value
Next
For Each v1 In a(1): str(1) = v1
For Each v2 In a(2): str(2) = v2
For Each v3 In a(3): str(3) = v3
For Each v4 In a(4): str(4) = v4
For Each v5 In a(5): str(5) = v5
c = ""
For Each x In str
c = c & x
Next
ReDim Preserve b(index)
b(index) = c
index = index + 1
Next:Next:Next:Next:Next

For Each x In b
Debug.Print x
Next
End Sub

五桁固定。最低でも一桁当り2要素ないといけない。
桁数まで柔軟にすると、くっそ面倒だから自分でやれ。
0510デフォルトの名無しさん2016/01/21(木) 07:56:21.86ID:hkWWdNPn
>>509
だせぇ
0511デフォルトの名無しさん2016/01/21(木) 08:30:12.04ID:epD6nfy/
>>509
なぁ、出来もしないのなら、無理に回答しなくていいぞww

あとな、お前にお勧めのスレがある。
今までみた絶望的なソースコード [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1429279230/
0512デフォルトの名無しさん2016/01/21(木) 08:48:35.32ID:Jdl8/hrx
初心者のコードってすげぇと思うよな。
とても真似できん。
自分にない発想があるなって劣等感があるよ。
0513デフォルトの名無しさん2016/01/21(木) 09:46:20.45ID:pkb4zgJk
>>505のやつ4行くらいでできないかな。
入出力2行、 桁数可変で本体処理2行。
右からやるか左からやるか...
0514デフォルトの名無しさん2016/01/21(木) 10:15:19.09ID:f+IaIVwa
昨日か一昨日かのWindows UpdateでList View使ってるファイルがおかしくなった。。。
0515デフォルトの名無しさん2016/01/21(木) 12:00:32.16ID:tGM9G3/P
>>509
ありがとうございます。
条件を書くと、以下のようです。

1)各列に何個の要素があるかは動的(
2)何列あるかも動的(>>506のネストの数は3だが、ここが何回ネストするかが動的になる)
3)組み合わせの仕方は左から順にのみで、並び替えの必要はない(樹形図的)
4)要素の文字数も動的で、何桁か決まってはいないし、数字もあれば文字列もある

私は条件2のうまい書き方がよくわからず、結局、何列あるかを調べて、if文で1列なら〜2列なら〜3列なら>>506というようにしています。
0516デフォルトの名無しさん2016/01/21(木) 12:06:31.84ID:X7n9A0oT
>>515
そういう場合は再帰を使え
0517デフォルトの名無しさん2016/01/21(木) 12:13:08.74ID:pkb4zgJk
>>516
かなり無理があるのでは?
組み合わせの数だから相当の量になる。
0518デフォルトの名無しさん2016/01/21(木) 12:15:50.60ID:epD6nfy/
>>505
つーか、そんなのユーザ定義関数でいいだろ。
0519デフォルトの名無しさん2016/01/21(木) 12:54:35.53ID:jus49kmC
>>517
組合せの数だけネストするわけじゃないだろ
0520デフォルトの名無しさん2016/01/21(木) 13:30:20.23ID:X7n9A0oT
>>515
再帰ってのはこんなふうに書くんだよ
ループのネストの段数が不定でも問題なく動く
VBAの仕様でデータが300列ぐらいあるとメモリ不足を起こすけど、300列の順列なんて出そうとしたら人類が滅亡するほど時間がかかるんで実用上は問題ない

Sub main()
  Call Recursive(1, "")
End Sub

Sub Recursive(c As Long, s As String)
  max_row = Cells(Rows.Count, c).End(xlUp).Row
  If Cells(max_row, c).Value <> "" Then
    For r = 1 To max_row
      Call Recursive(c + 1, s & Cells(r, c))
    Next
  Else
    Debug.Print s  ' データ出力
  End If
End Sub
0521デフォルトの名無しさん2016/01/21(木) 13:36:58.95ID:P+RPuePi
テーブルの重複行削除の際に、削除する行を指定させる方法を教えてください。
以下は、単純にマクロ記録したものです。
Sub Macro1()
Range("F5").Select
ActiveSheet.Range("テーブル2[#すべて]").RemoveDuplicates Columns:=Array(1, 6, 7), _
Header:=xlYes
End Sub
11列分テーブルの、1、6、7列目が重複したものを削除するのですが、
これに、8列目のの数値が小さいほうを削除、大きい方を残したいです。
わかりますでしょうか?よろしくお願いします。
0522デフォルトの名無しさん2016/01/21(木) 15:34:42.41ID:epD6nfy/
>>520
減価償却費の計算とかではよくつかってる。
0523デフォルトの名無しさん2016/01/21(木) 20:02:04.58ID:RqTcmjez
>>521
聞きたい事は分かったが残念な事に答えが分からんのだよw
0524デフォルトの名無しさん2016/01/21(木) 20:35:34.37ID:0jk7vnPh
>>521
Sub test()
Dim c(2), m As Collection, del As Range
Do
Set del = Nothing
Set m = New Collection
xdata = Range(Cells(1, 1), Cells(Rows.Count, 11).End(xlUp)).Value
i = i + 1
If i > UBound(xdata, 1) Then Exit Do
c(0) = xdata(i, 1): c(1) = xdata(i, 6): c(2) = xdata(i, 7)
For j = 1 To UBound(xdata, 1)
If xdata(j, 1) = c(0) And xdata(j, 6) = c(1) And xdata(j, 7) Then m.Add j
Next
If m.Count Then
p = 0
For Each x In m
e = True
If p Then If xdata(p, 8) > xdata(x, 8) Then e = False
If e Then p = x
Next
For Each x In m
If x <> p Then If del Is Nothing Then Set del = Rows(x) Else Set del = Range(del, Cells(x, 1).EntireRow)
Next
If Not del Is Nothing Then del.Delete
End If
Loop
End Sub

これで動かないかな
0525デフォルトの名無しさん2016/01/21(木) 20:40:55.77ID:xJzWoKjV
1空き列に連番を振る
28列目で降順に並び替える
3removeduplicate
41の列で並び替える
51の列を削除
05264992016/01/21(木) 23:00:34.27ID:0tyN2uzx
dependentsを使って、それっぽいことはできました。
下記は、セル(1,1)とそれを参照するセルを返して選択させる
ということをさせようとしています。

Sub Macro1()

Dim c As Range

Set c = Cells(1,1)
Set c = Union(c,Cells(1,1).Dpendents)

If Not c Is Nothing Then c.select

End sub

これだと、.Dependentsの対象(1,1))がどこかで参照されていれば問題ないのですが、
参照していないとエラーになってしまいます。

何か方法はないでしょうか。
0527デフォルトの名無しさん2016/01/22(金) 00:36:15.19ID:gKLeKKXn
>>526

Sub Macro1()
  Dim c As Range

  Set c = Cells(1, 1)
  On Error Resume Next
  Set c = Union(c, Cells(1, 1).Dependents)
  On Error GoTo 0
  
  If Not c Is Nothing Then c.Select

End Sub
0528デフォルトの名無しさん2016/01/22(金) 04:12:46.72ID:7u0WrXxg
>>520
遅くなりました。ありがとうございます。忙しくてまだ試せていませんが、勉強します!
0529デフォルトの名無しさん2016/01/22(金) 07:09:40.91ID:hQb40WO/
>>520
何度もだせぇの書くなよ
質問者に悪いと思わんのかw
0530デフォルトの名無しさん2016/01/22(金) 08:58:29.38ID:1YiOGDCq
>>520
でもそれ、別に別の関数に投げるんでも全く問題ないわけだが。わざわざそういう
書き方した所で、大したメリットがない。
0531デフォルトの名無しさん2016/01/22(金) 09:52:25.70ID:p0qaIBjS
VBAでの再帰はかなり制約的に書かないといけないから使いにくい。
右からの畳み込みで表現するといいと思う。
0532デフォルトの名無しさん2016/01/22(金) 11:27:13.63ID:aQA1bWN9
>>524
遅くなってすいません。
思い通りに実行出来ました!ありがとうございました!
0533デフォルトの名無しさん2016/01/22(金) 12:38:57.86ID:6pvUxBV3
最近、If文の1行書きを知ったのですが、例えば、10個の分岐を10個のelseifを使って分岐させるのを1行書きに書き換えるとスピードはやはり落ちるものなんでしょうか?
elseifを使うと、該当したら他のelseifコードはスルーしますが、1行書きifを使うと、一応ぜんぶ判定しにいくので。しかし可読性は1行書きの方なんですよね〜
0534デフォルトの名無しさん2016/01/22(金) 13:04:43.89ID:1YiOGDCq
>>533
select文も使うのが普通ですよ。
0535デフォルトの名無しさん2016/01/22(金) 13:27:56.38ID:KXk9pxmd
>>533
100万回実行して、10ms未満の違いしかないようなことを気にしてもしかたがな。
0536デフォルトの名無しさん2016/01/22(金) 14:29:53.04ID:p0qaIBjS
>>533
複数の if が排他的でなかったら論理的に違うことをやってるのはわかるよね?
スピードなんかより
0537デフォルトの名無しさん2016/01/22(金) 19:44:34.49ID:turD6O79
'mycollectionという変数に、キーワードを100〜1000個入れて、
'セルの値と該当しない場合、その行を削除するみたいなことをやりたいのですが、
'こんなことは可能でしょうか?
Sub test01()
Dim lRow As Long, i As Long
'mycollection = "田中","山田","佐藤","鈴木","井上"・・・・・・・手動でキーワードを入れる
lRow = Cells(Rows.Count, 1).End(xlUp).row
For i = lRow To 2 Step -1
If Cells(i, 2).Value <> mycollection Then
Range(i & ":" & i).Delete
End If
Next i
End Sub
0538デフォルトの名無しさん2016/01/22(金) 20:00:51.94ID:ax/jel29
その例のような感じにするならキーワードを配列に入れておいてFilter()したらいいのでは
ただそのキーワードというもののあり方によってはフィルタ系の機能を使ったり正規表現を使った方がいいかもしれないぞ
0539デフォルトの名無しさん2016/01/22(金) 20:15:48.39ID:turD6O79
>>538
Filter使ったことないですが挑戦してみます。
キーワードは、文字列で完全一致のもので絞り込めたらいいのですが、filterで問題ないでしょうか?
0540デフォルトの名無しさん2016/01/22(金) 20:16:29.80ID:50X4sy+n
1000個ある名前をセルに入れるなり変数にセットするのを
vbaでやればあとはどうやってもできるんじゃないか
手動でキーワードを入れるってのをできるだけ
自動化するって問題だけだろ
0541デフォルトの名無しさん2016/01/22(金) 20:40:19.73ID:KhXVHsnG
>>529-531
より良いコード書いてからほざけ、ボケ
0542デフォルトの名無しさん2016/01/22(金) 20:43:53.69ID:turD6O79
>>540
mycollection(1000)として、filterをどのように使えばよいのでしょうか?
初心者ですいませんが、よろしければご教授お願いたします。

f = Filter(mycollection,.Cells(i,2).Value)
f(0)がエラーとなるならばといったようなコードでしょうか?
0543デフォルトの名無しさん2016/01/22(金) 21:11:50.86ID:pRZKDnHi
>>537
Sub Test(Keyword As Range, CheckList As Range, CheckColumn As Long)
Dim del As Range
For i = CheckList.Row To CheckList.Rows.Count
For Each x In Keyword
If Cells(i, CheckColumn) Like x Then
If del Is Nothing Then
Set del = Cells(i, 1).EntireRow
Else
Set del = Range(del, Cells(i, 1).EntireRow)
End If
End If
Next
Next
del.Delete
End Sub

Keyword = キーワードを入れたセルを指定する。
CheckList = チェックしたいリストの範囲を入れる。
CheckColumn = キーワードを判定したい行を入れる。
0544デフォルトの名無しさん2016/01/22(金) 21:15:29.86ID:p0qaIBjS
くそ、ケンカを売られたぞ
0545デフォルトの名無しさん2016/01/22(金) 21:18:48.91ID:d8M8QDrI
VBAの変数名ってどこまで大丈夫なの?
「らんま1/2」みたいな演算子っぽいのが混ざった名前も変数にしたいんだけど何か方法ある?
0546デフォルトの名無しさん2016/01/22(金) 21:44:34.68ID:50X4sy+n
おすすめ

strcollection=",佐藤,田中,長谷川,"
if instr( strcollection,"," & cells(n,1)) & ",")=0 then
cells(n,1).entirerow.delete
end if
0547デフォルトの名無しさん2016/01/22(金) 22:34:02.46ID:d8M8QDrI
文字列使ってる時点でないわー
0548デフォルトの名無しさん2016/01/22(金) 22:35:11.31ID:d8M8QDrI
らんま1/2ならいけるのかなー
全角を演算子と認識したりはしないよねさすがに
0549デフォルトの名無しさん2016/01/22(金) 22:46:22.46ID:tiw7VxmH
らんま2分の1にしろ

データとしてはあり得るけど変数名にしたいってのは考えにくいが
たくさんあるなら var1div2 とかでいいかも知れん
0550デフォルトの名無しさん2016/01/22(金) 23:24:56.91ID:d8M8QDrI
よく考えたらやっぱ変数名に漢字はねーわな
VBAコードで漢字の変数名見ただけでアホだコイツと思うわけじゃん
ローマ字だか英語だかよくわからん変数名をこれからも使っていくわ一生
05514992016/01/22(金) 23:26:21.02ID:uYyrweLr
>>527
ありがとうございます。
なるほど、on errorステートメントというのがあるのですね。

同一シート内の参照はこれで問題ないのですが、
シートをまたいだ参照先を得ることは、当然できませんでした。

やはり不可能なのでしょうか。
dependents以外に何か方法がありましたら教えてください。
0552デフォルトの名無しさん2016/01/22(金) 23:29:20.57ID:d8M8QDrI
全ドライブのxls*を開いて参照探してくるぐらいのことはやってから不可能って言えよー
0553デフォルトの名無しさん2016/01/22(金) 23:32:30.77ID:TWMQPGy9
>>546
これいいね
0554デフォルトの名無しさん2016/01/22(金) 23:38:00.02ID:r3UK0uLR
>>546
それやるならSplitで配列に変換した方が、その後の処理が簡単になりそう
0555デフォルトの名無しさん2016/01/22(金) 23:54:33.37ID:ax/jel29
>>542
今回問題なのはfilter(, , true, )のとき該当するものが無いと空の配列が返るってんで、それをどう数えたもんか?
ヘルプで言うと「配列に関するキーワード一覧」に書いてある(最近のバージョンでどういう目次構成か知らんけど)
UBound()で配列添字の最大値、LBound()で添字の最小値を取得できる、というのが使えるわけです

UBound()を使えばいいんだけど、ヘルプの該当ページにはどういうわけか
ここで知りたい空っぽのとき何が返るのかということと、Option Baseに言及していないという
VBA初見の人間を惑わすクソドキュメントになっている(もしかしたら最近のには書いてあるのかも)
そういうわけでどういうときどういう値が返るか試して、なんで-1なのか覚えてから使ってやってください
0556デフォルトの名無しさん2016/01/23(土) 00:27:23.02ID:5faR9SkP
filter質問主です。ありがとうございます。
今日は仕事が疲れすぎたので明日使わせて頂きます。
0557デフォルトの名無しさん2016/01/23(土) 03:58:47.08ID:NKVsIEv5
>>533
これは単純に見えて根深い問題で例えば FuncA、FuncBというBooleanの戻り値を持つメソッドがあったとして
If FuncA then
If FuncB Then

End If
End If

If FuncA And FuncB then

End If
とした場合これはあまり変わらないけど、もしFuncBで評価を求めるのに時間が掛かる場合、
Dim isDo As Boolean
isDo = True
If Not FancA Then
isDo = False
Else Not FancB Then
isDo = False
End If
If isDo then

End if
とかにした方が速い時がある。つまり、FancAで既に評価対象から外れた場合、FancBの評価を見る必要はない。
.NetにはOrElseやAndAlsoという、片方の評価が既に条件を満たしていればもう片方の評価はしないという命令があるからそれを使うけど、
VBAのAndやOrはどちらも評価してしまうため、場合によっては使用しないで上記のような回りくどい書き方をした方が速い場合もある。
もちろん、この方法は評価を求める以外必ず実行しなければいけない処理がFancBに書かれていれば使うことは出来ない。
だから単純に決められることではないので、状況を良く見てからどう作るか考えた方が良いかもね。
0558デフォルトの名無しさん2016/01/23(土) 04:07:52.25ID:NKVsIEv5
ああごめん、よく読んだら全て評価することは知ってたのか。
だったら後はメソッドとか使う場合で片側の処理が重い時があるんで、それに気をつけておけばいいと思うよ。
0559デフォルトの名無しさん2016/01/23(土) 04:31:04.25ID:JARUPMna
プロシージャ変数コメントに日本語バンバン使いまくったマクロをアメリカに送ったら
アメリカ人が発狂してたわw
0560デフォルトの名無しさん2016/01/23(土) 07:00:23.52ID:FWUKBiDK
日本で作ったものをアメリカ人が発狂する意味が分からんわ。

なんか英語に合わせてるけど。
0561デフォルトの名無しさん2016/01/23(土) 07:42:46.85ID:NVJ+LsdH
質問お願いいたします
エクセル上で業務マニュアルの作成をしております
セル内にタイトルを入力し、そこにハイパーリンクでそのタイトルの詳細のワードの保存先に飛ぶ形にしています
段々とタイトルも増えてきて、キーワードで検索をかけられるようにしたいと思って色々と調べていますが素人のため全く理解できない状態です
ユーザーフォームにテキストボックスを設けて、そこにキーワードを入力し、コマンドボタンで検索をかけたいですのですが、どのようにコードを入力したら宜しいでしょうか?
よろしくお願いします。
0562デフォルトの名無しさん2016/01/23(土) 13:26:21.35ID:9iIZKcSa
>>561
標準のフィルタ機能で十分だろ
0563デフォルトの名無しさん2016/01/23(土) 14:42:09.66ID:YJo138Ig
>>551
"エクセルでシートの参照先を調べたい"
でググってみると幸せになれるかも
0564デフォルトの名無しさん2016/01/23(土) 15:40:45.44ID:xVQLFIqO
2つの配列の値を比較してサンプルを数える(Countifs系)コードについてアドバイスお願いいたします。
ListP()as Currency とGPR() as Stringという配列で、欲しいサンプルは、以下の5個です。
ListPが60以上の、サンプル数、SamSix
ListPが60以上かつ、GPRが4つの文字列である数、SB,SHB,SL,SHL
For n = 1 To 1000
If ListP(n, x) = Empty Then
Exit For
ElseIf ListP(n,x) >= 60 Then
SamSix = SamSix + 1
If GPR(n, x) = "B" Then
SB = SB + 1
ElseIf GPR(n, x) = "HB" Then
SHB = SHB + 1
ElseIf GPR(n, x) = "L" Then
SL = SL + 1
ElseIf GPR(n, x) = "HL" Then
SHL = SHL + 1
End If
End If
Next n

このループを多用(約1万回)しているのですが、ループを使用しなかったり、もっとスピードの出るアイデアはございませんでしょうか?
5個のサンプルを取得できれば満足です。
よろしくお願いいたします。
0565デフォルトの名無しさん2016/01/23(土) 17:01:45.55ID:2O2OeDHJ
>>564
本来だったら配列を昇順ソートしてからバイナリサーチやれば圧倒的に速くなるがね。
0566デフォルトの名無しさん2016/01/23(土) 17:20:35.71ID:Ub1PC2hC
>>564
CurrencyならEmptyチェックする必要ないんじゃない
後はそこだけで速くするのは難しそう

俺なら配列に値セット/変更する時に値チェックしてカウントするようにするかなぁ
案外配列じゃなくセルに展開して、カウントする数式入れたセル見た方が早いかもしれん
0567デフォルトの名無しさん2016/01/23(土) 18:14:06.44ID:5/HkQk/m
{=SUM(IF((B1:B1000="SHL")*(A1:A1000>60),1,0))}

配列数式でできた
0568デフォルトの名無しさん2016/01/23(土) 19:34:03.73ID:7fmpCrJt
>>564
この状態でどれぐらいの時間がかかってるのか教えろハゲ
0569デフォルトの名無しさん2016/01/23(土) 19:41:11.42ID:UyBsumDJ
>>565
調べてみましたが、やや難しそうです。(:;)
>>566
Emptyは必要ないですね//
配列をA列とB列にいったん貼り付けてワークシート関数で調べる方法ですよね。
ひとまず、やってみます!
>>567
使い方教えていただけますでしょうか?
SHL = WoksheetFunction.Countifs(Range( ),">60",Range( ) ,"HL")みたいな形で使えそうです。
0570デフォルトの名無しさん2016/01/23(土) 19:45:35.16ID:G5thoHAj
バリアント配列をダブルの配列にどうやってキャストすればよいでしょうか
0571デフォルトの名無しさん2016/01/23(土) 19:46:50.85ID:UyBsumDJ
>>568
他のループも合わせてからの推測ですが50msぐらいです。
0572デフォルトの名無しさん2016/01/23(土) 19:54:39.20ID:d6eRWlmR
質問です。

エクセルの1シートを1テーブルに見立ててデータの抽出、計算をしようと思っています。
ただデータの検索をクエリを書くのと同様に行えるのかが気になっています。
例えばSQLだとselect * from t where c < 10 and c > 0 と範囲検索が簡単に出来ますが、
エクセルvbaだとfind、findnext結果を順々に見ていくしかないんでしょうか?
access使えと言われるかも知れませんが自分も作ったものを使う人も
使ったことないので使う予定でないです。
0573デフォルトの名無しさん2016/01/23(土) 19:55:52.13ID:UyBsumDJ
>>543
サンプルで作ってみたのですが、思った通りの動作ができません・・・
改善点をお分かりになりますでしょうか?

Sub jikkou()
Dim Keyword As Range
Dim CheckList As Range
Dim Checkcolumn As Long

With ActiveWorkbook.Worksheets("Sheet1")

Set Keyword = .Range("F2:F4") '順に田中、山田、井上
Set CheckList = .Range("A2:C9")
Checkcolumn = 2

Call Test(Keyword, CheckList, Checkcolumn)

End With
End Sub
0574デフォルトの名無しさん2016/01/23(土) 20:12:01.85ID:9iIZKcSa
>>573
たぶんSheet1に書いてない
0575デフォルトの名無しさん2016/01/23(土) 22:41:50.10ID:rT+4QcAA
>>572
使ったことないけどODBCでExcel読めるんだから同じように出来るんじゃなかろうか
0576デフォルトの名無しさん2016/01/23(土) 22:56:00.52ID:VVSBE+9k
>>572
ODBCだけど
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
で普通にWHEREが効いたよ。
0577デフォルトの名無しさん2016/01/23(土) 23:11:55.10ID:Lyhv/FJb
選択した行の下に行を挿入したい
0578デフォルトの名無しさん2016/01/23(土) 23:31:40.97ID:d6eRWlmR
>>575
>>576
成る程!
エクセルからODBCする発想はありませんでした。
ありがとうございます。
0579デフォルトの名無しさん2016/01/24(日) 00:52:16.69ID:3BacWB5Q
質問
union(range("A1:A3"),range("A4:A6")).select
とすると A1:A6がセレクトされてしまいます
A1:A3,A4:A6とばらばらに選択させるにはどうしたらいいのでしょうか
0580デフォルトの名無しさん2016/01/24(日) 01:02:59.65ID:8yNc66kp
>>579
Range("A1:A3, A4:A6").Select
0581デフォルトの名無しさん2016/01/24(日) 01:24:07.69ID:3BacWB5Q
>>580
Rangeを使った場合
少ないとOKなのですが
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90").Select

多いとエラーになってしまうんですよ
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90,
A91:A93,A94:A96,A97:A99,A100:A102,A103:A105,A106:A108,A109:A111,A112:A114,A115:A117,A118:A120,A121:A123,A124:A126,A127:A129,A130:A132,
A133:A135,A136:A138,A139:A141,A142:A144,A145:A147,A148:A150,A151:A153,A154:A156,A157:A159,A160:A162,A163:A165,A166:A168").Select
0582デフォルトの名無しさん2016/01/24(日) 04:40:05.83ID:QDUQ11dL
文字列の長さが256文字以上はエラーになるからね
union使いたくないってことなら適当な長さで区切って処理していくしかないね
0583デフォルトの名無しさん2016/01/24(日) 08:31:19.18ID:P3FwbSRP
そもそもマクロでSelect使うのってユーザーに見せる場合だけだから広範囲選択しないよな
0584デフォルトの名無しさん2016/01/24(日) 08:43:14.19ID:OLLhmKw5
ばらばらに選択させなきゃならない理由がわからない
0585デフォルトの名無しさん2016/01/24(日) 10:14:46.19ID:EERzV+Td
セルの色変えるとか
0586デフォルトの名無しさん2016/01/24(日) 10:17:27.22ID:U2BkwJ1U
選択した行の下に行を挿入したい
0587デフォルトの名無しさん2016/01/24(日) 10:54:59.26ID:jAR/7hik
26 名前:名無しゲノムのクローンさん[] 投稿日:2015/05/07(木) 22:53:53.09 ID:dgLqosr8Q
理研の職員がwinnyでウィルス感染→個人情報流出?2
http://wc2014.2ch.net/test/read.cgi/rikei/1284822425/

27 名前:名無しゲノムのクローンさん[] 投稿日:2015/05/07(木) 22:59:50.36 ID:dgLqosr8Q
http://www.riken.jp/research/labs/bsi/behav_neurophysiol/

姓が変わってる
■ このスレッドは過去ログ倉庫に格納されています