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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2016/11/18(金) 07:24:42.30ID:rPv8IQdA
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part43
http://echo.2ch.net/test/read.cgi/tech/1474105211/


※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 124
http://echo.2ch.net/test/read.cgi/bsoft/1474260366/
0002デフォルトの名無しさん2016/11/18(金) 22:43:53.96ID:vUpgzFVU
Excelだぞ、Excel。
横はIntegerで、縦はLongだろ。
0003デフォルトの名無しさん2016/11/18(金) 23:16:01.73ID:POTyQWyo
>>2
意味不明
0004デフォルトの名無しさん2016/11/18(金) 23:20:31.08ID:M89IXhc0
全部variantでいいじゃん
0005デフォルトの名無しさん2016/11/19(土) 00:00:26.12ID:BsNbEZ28
customUIって既存のタブにグループを追加できるけど既存のグループには追加できないんでしょうか?

<tab idMso="TabHome">
</tab>

等のidMso指定の中に自分用のグループは追加できるけど

<group idMso="Groupxxx">
</group>

に何を入れても表示されないです
0006デフォルトの名無しさん2016/11/19(土) 09:59:54.32ID:DaWo6YR7
たかだか数十個とか数百個しか入ってない配列の走査にlong使うのは気持ち悪い気がする
0007デフォルトの名無しさん2016/11/19(土) 13:13:17.14ID:NRaI0uul
それはないな
0008デフォルトの名無しさん2016/11/19(土) 14:55:14.03ID:AMITCLrO
チェックボックスについて
ユーザーフォームでの作成ではなくてフォームコントロールでシート内に
チェックボックスを作ったのですがトルゥー先のリンクはどこにするとまとまりがいいでしょうか?
同じセル内にするとトルゥーとフォルトが表示されて見栄えが悪くシート内の関係ない箇所にリンクさせ
非表示する事でうまくいきました。
しかし、列を追加すると非表示した列も必要になってしまいます。
0009デフォルトの名無しさん2016/11/19(土) 16:26:18.45ID:pkXYgQAm
同じセル内にしてフォント白くすれば?
0010デフォルトの名無しさん2016/11/19(土) 17:29:53.91ID:2YE8aYoS
>>8
そのチェックボックスの 利用用途次第だろうけど
セルにリンクさせないで マクロで ON/OFF判定して処理するとか
0011デフォルトの名無しさん2016/11/19(土) 19:24:16.13ID:mQQ7Iord
表に図形で矢印やテキストボックスが貼り付けら
れているシートの一部を選択して、別シートに
コピーしようとしています。

Range(
0012デフォルトの名無しさん2016/11/19(土) 19:26:53.42ID:mQQ7Iord
しくじりました。

表に図形で矢印やテキストボックスが貼り付けら
れているシートの一部を選択して、別シートに コピーしようとしています。
Range().Select で範囲指定したあと、 .Copy でクリップボードへコピーして
.PasteSpecial Paste:=xlPasteAll
.PasteSpecial Paste:=xlPasteValues
で別シートへペーストしたのですが、 図形が移動できず困っています。
図形も一緒に移動させるには、どうしたら いいでしょうか?
0013デフォルトの名無しさん2016/11/20(日) 00:35:00.27ID:FgpyMXw2
じゃあ俺もなんかしくじった感じでいくわ。

オーシェイプが同じ名前が二つあると、
名前を指定して動かそうとすると、
片方しか動かないそんなVLOOKUPみたいな変な仕様ですか?
0014デフォルトの名無しさん2016/11/20(日) 09:10:13.28ID:ImuvtlJ3
>>13
ユニークに特定できない状態にする方が変じゃね
ユニークに特定する方法があると思う
名前じゃなくて番号とか
0015デフォルトの名無しさん2016/11/20(日) 17:40:39.82ID:EDGMlnt9
>>13
Shapes.Range(index)でやってる?
001682016/11/21(月) 11:23:10.91ID:9TYCazD4
>>9
おお!ありがとう
0017デフォルトの名無しさん2016/11/21(月) 12:56:44.72ID:DNmkrUrv
>>6
逆にintegerじゃないとダメな場面ってあるの?
0018デフォルトの名無しさん2016/11/21(月) 13:10:15.29ID:viqIP0GM
  Dim N As Integer

  N = 5 / 2: Cells(7, 9) = N  →2 ・・・・・・・(1)
  N = 2 / 3: Cells(8, 9) = N  →1 ・・・・・・・(2)
  N = 5 \ 2: Cells(9, 9) = N  →2 ・・・・・・・(3)
  N = 2 \ 3: Cells(10, 9) = N  →0 ・・・・・・・(4)

 (1) は \ と同じ、(2)は小数点第一位を四捨五入
 代入演算子のInteger型の処理はどういう仕組みになってるの?
0019デフォルトの名無しさん2016/11/21(月) 13:55:11.76ID:9aLTR+2V
>>18
「いちばん近い偶数」でぐぐってごらん?
0020182016/11/21(月) 14:02:47.26ID:viqIP0GM
>>19
 ありがとう!
0021デフォルトの名無しさん2016/11/21(月) 14:23:02.65ID:kEzTcdtR
>>17
巨大な配列が必要な時
LongよりIntegerのが要素数の上限が上

回数の少ないループカウンターはVariantで十分
0022デフォルトの名無しさん2016/11/21(月) 14:24:05.80ID:kEzTcdtR
もう一つ、再帰の引数も地味にメモリを消費するんで、Integerの方が有利な場面がある
0023デフォルトの名無しさん2016/11/21(月) 16:13:00.17ID:JU50lAgF
あー、メモリが云々か
メモリの使用料は少ないけどパフォーマンス的にはlongのほうがいいとかよくわからんな
0024デフォルトの名無しさん2016/11/21(月) 16:28:48.73ID:9aLTR+2V
>>21
Variant要素の配列だって100万200万レベルならまるで問題ないけどね
0025デフォルトの名無しさん2016/11/21(月) 16:39:13.03ID:CO+aVjyU
LongとIntegerのどっちが早いかはCPUのアーキテクチャーにもよるんで何とも
0026デフォルトの名無しさん2016/11/21(月) 17:21:15.21ID:kEzTcdtR
データキャッシュに入り切るかどうかでスピードがかなり違ってくるからIntegerの方が有利なことはけっこうあると思う
0027デフォルトの名無しさん2016/11/21(月) 17:21:57.72ID:kEzTcdtR
>>24
多次元だとそうも言ってられなくなる
0028デフォルトの名無しさん2016/11/21(月) 17:51:52.02ID:5ZF6P8ki
多次元となるときは設計を見直すようにしてる
0029デフォルトの名無しさん2016/11/21(月) 17:55:25.07ID:9aLTR+2V
>>27
そんなにか?
0030デフォルトの名無しさん2016/11/21(月) 18:05:44.53ID:nTw6YMMU
実測したけど、intもlongもそんなかわんなかったよ
てか、速度気にするなら別言語で実装した方が良くね?
俺はFFT変換が必要になったとき、C++で実装した
0031デフォルトの名無しさん2016/11/21(月) 19:29:07.13ID:VFvE/ERl
わざわざ別言語使わなくてもVBAでコンパイルすればいいじゃん(真顔
0032デフォルトの名無しさん2016/11/21(月) 19:36:24.68ID:9aLTR+2V
>>30
それをVBAから呼び出したの?
0033デフォルトの名無しさん2016/11/21(月) 20:57:47.05ID:K2PBWFHo
どうせ差が出るような処理なんかしないくせに
0034デフォルトの名無しさん2016/11/21(月) 21:10:04.11ID:VFvE/ERl
業務用だとそこまで計算資源カツカツってパターン少ないからね
0035デフォルトの名無しさん2016/11/21(月) 21:10:51.45ID:9aLTR+2V
複数言語連携で面倒なぶん差が出なきゃやってらんないでしょ
0036デフォルトの名無しさん2016/11/21(月) 23:50:54.75ID:jsNT0OAI
一つのセル内に、
「中に入る文字はランダム(桁不定)末尾の数字だけは11か22」ランダムな文字列(桁不定):必ず数字(4ケタ)[ランダム文字列(A),ランダム文字列(B)]

コレを、11 or 22、 ランダムな文字列、必ず数字(12ケタ)、ランダム文字列A、ランダム文字列B
と分けて格納する方法があったら教えてくだささい。
()は、単に補足説明のためのかっこですが、「」、:、[]は実際の文字列に使われています。

例:
「びっくりためごろう22」ちょちくちょ金魚:0123[伊藤,よう!加藤]

こんな感じです。

バージョンは2007か、2010で、VBAも作れませんけど、環境的には使えます。
以上、よろしくお願いします。
0037デフォルトの名無しさん2016/11/22(火) 00:00:33.16ID:YV24xnAB
ランダム文字列に数字が入る可能性は?
そこに11とか22が入ると俄然難しくなるような。
0038デフォルトの名無しさん2016/11/22(火) 00:04:02.35ID:YV24xnAB
あと分ける時にカッコ類を含めるか含めないか。
例で分け終わったところも書いて欲しいところ。
0039デフォルトの名無しさん2016/11/22(火) 00:15:19.60ID:YV24xnAB
何回も申し訳ない。
12桁とあるのは4桁ですよね?
0040デフォルトの名無しさん2016/11/22(火) 00:18:25.83ID:RN+cALzN
今、選択したセルが空白ならばダブルクリックで"●"入力され、すでに"●"が入力されていれば空白になるマクロを組みました。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Worksheets(1).Range("C3:AD253")) Is Nothing Then Exit Sub
With Target
Select Case .Value
Case ""
.Value = "●"
Case "●"
.Value = ""
End Select
End With
End Sub

●を空白にし空白を●にするこの処理ですが、複数にまたがるセルを範囲指定した場合でも一度のダブルクリックで同じ処理を一気に行うためには上記のコードをどのように書き換えればいいでしょうか?
0041デフォルトの名無しさん2016/11/22(火) 00:25:34.16ID:Kv884UEo
「(.*)(11|22)」(.*):(\d\d\d\d)\[(.*),(.*)\]
を
\2、\3、\4、\5、\6
としたいのはわかったけどランダム文字列の中に同等の文字列が入っていた場合はどうなるの?
0042デフォルトの名無しさん2016/11/22(火) 00:26:19.76ID:tJZj2rG+
>>40
For Each c in Target
With c
0043デフォルトの名無しさん2016/11/22(火) 00:29:18.63ID:Kv884UEo
>>40
targetを繰り返せばいい
ただダブルクリックの時点でセルの選択はひとつになりそうだけど
0044デフォルトの名無しさん2016/11/22(火) 00:35:48.03ID:YV24xnAB
>>36
文字列がカッコ類で必ず括られてて、ランダム文字列に数字や記号が現れないなら、VBAも正規表現も使わず、ワークシート関数でいけそうな感じ。
0045デフォルトの名無しさん2016/11/22(火) 00:36:43.83ID:SNCtuyoO
何でボキャブラ天国?
0046デフォルトの名無しさん2016/11/22(火) 03:21:24.15ID:RN+cALzN
>>42
ありがとうございます。このcはCASEを指しているのでしょうか
0047デフォルトの名無しさん2016/11/22(火) 03:29:30.20ID:Kv884UEo
>>46
forの意味とwithの意味を調べるといいですよ
と言うかwithは使ってますやん
0048362016/11/22(火) 06:13:11.62ID:N13N3bI0
>>37
ランダム文字列と書いたところには、数字は入りません。

>>38
例:
「びっくりためごろう22」ちょちくちょ金魚:0123[伊藤,加藤]
※半角カンマが非常に見づらいので、全角化していますが、実際は半角です

欲しい結果:
びっくりためごろう22  ちょちくちょ金魚  0123  伊藤  加藤

>>39
すみません4ケタです。

>>41
文字列は常に異なります。
伊藤22  加藤  0123  伊藤  加藤
みたいになることはありません。
0049デフォルトの名無しさん2016/11/22(火) 06:16:26.93ID:YV24xnAB
>>48
そしたら、ワークシート関数でできますよ。

mid関数、search関数、あとなくてもいいけどlen関数で。
0050デフォルトの名無しさん2016/11/22(火) 07:09:21.57ID:emRZnEMS
ランダムな文字列の方はrightで数字抜き出してからreplaceとかでも行ける
0051デフォルトの名無しさん2016/11/22(火) 07:34:06.97ID:Kv884UEo
>>48
「」、:、[]を文字として利用しているのであれば

「「び11」っくり:8854[ため,ごろ]う22」ちょちくちょ「金魚22」:0123[伊[藤,加]:6666[近,藤]]

みたいなこともあり得るってこと?
0052デフォルトの名無しさん2016/11/22(火) 08:08:22.88ID:Kv884UEo
ごめん
数字は入らないって書いてましたね
0053デフォルトの名無しさん2016/11/22(火) 08:11:00.86ID:emRZnEMS
あー、勘違いしてたわ
そんな簡単なわけないな
0054デフォルトの名無しさん2016/11/22(火) 08:14:18.96ID:emRZnEMS
カッコとコロンがそういう決まりの書式ならsplitとreplaceの組み合わせでいけんか?
書式がランダムならまた別だが
0055デフォルトの名無しさん2016/11/22(火) 08:34:07.05ID:Kv884UEo
2文字目から”(11|22)」”の2文字目まで
”(11|22)」”の3文字後から”:\d{4}\[ ”の前まで
”:\d{4}\[ ”の2文字目から5文字目まで
”:\d{4}\[ ”の6文字後から最後の1文字前までを,で分割


vba使えないエクセルってところは気になるけどこんな感じでいけると思う
0056デフォルトの名無しさん2016/11/22(火) 13:01:29.12ID:vhMcFInX
>>36 >>48
このスレ的に 正規表現使って VBAで組んでみた
「」: は 全角としてるから もし半角なら正規表現パターンを半角に適宜直すかレスしてね

使い方は
A1へ 「びっくりためごろう22」ちょちくちょ金魚:0123[伊藤,加藤]
だと
=Split36(A1,1) ・・・びっくりためごろう22
=Split36(A1,2) ・・・ちょちくちょ金魚
=Split36(A1,3) ・・・0123
=Split36(A1,4) ・・・伊藤
=Split36(A1,5) ・・・加藤
※ #N./A になったら 定義したパターンと一致しなかったって事

改行が大杉って言われたので VBAコードは次のレスで
0057562016/11/22(火) 13:02:09.76ID:vhMcFInX
>>56 の続き

Function Split36(Text As String, SubMatcheNum As Long)
 Dim RegEx As Object
 Dim Ans As Variant
 Dim Result1 As Variant
 Dim Result2 As Variant

 Set RegEx = CreateObject("VBScript.RegExp")
 '正規表現パターン
 RegEx.pattern = "「(.*[^\d](?:11|22))」(.*):(\d{4})\[(.*),(.*)\]"
 RegEx.Global = True

 Set Result1 = RegEx.Execute(Text)

 If Result1.Count = 0 Then
   Ans = CVErr(xlErrNA) 'パターン不一致
   Else
   Set Result2 = Result1(0).SubMatches
   If Result2.Count < SubMatcheNum Then
      Ans = ""
      Else
      Ans = Result2(SubMatcheNum - 1)
   End If
 End If
 Split36 = Ans
End Function
0058デフォルトの名無しさん2016/11/22(火) 21:21:02.20ID:urY3dZpz
文字列内に数字はなくてカンマ、11か22、4桁数字が切れ目って確定してるんだからMidとfindで開始文字位置気を付けるだけで終わる話ではないの?

質問者は説明用の存在しない「」とか入れんなよ、分かりにくいから
0059デフォルトの名無しさん2016/11/22(火) 21:26:15.63ID:vhMcFInX
>>58
ん??

>>36
>>()は、単に補足説明のためのかっこですが、「」、:、[]は実際の文字列に使われています。

と書いてある訳だか・・・
0060デフォルトの名無しさん2016/11/22(火) 22:21:39.73ID:29TEhOYb
すまん、余計な説明を要するようになるだけで有っても無くても話が変わらん物をあえて入れて見にくくするなって言いたい

=LEFT(A1,FIND({"1","2"},A1)+1)
 びっくりためごろう22
=MID(A1,FIND({"1","2"},A1)+2,FIND({"0","1"…"9"},A1,FIND({"1","2"},A1)+2)-FIND({"1","2"},A1)+1))
 ちょちくちょ金魚

あとは同じ要領でfindネストして、その前のfindの結果を引き算して文字数を判定する
最後の区切りは,だからRight使えば楽
VBAならfindの結果を変数に入れればネストしないですむ
0061デフォルトの名無しさん2016/11/22(火) 22:54:23.71ID:VrepQFzl
正規表現使えばいいじゃん(いいじゃん)
環境的にはVBA使えるって言ってるんだし
0062デフォルトの名無しさん2016/11/22(火) 23:17:25.79ID:29TEhOYb
区切り条件がここまで限定されてる案件でなんでわざわざ面倒な正規表現使う?
VBAならもっとシンプルでいいじゃん
上のワークシート関数そのままでもいいし、

For i = 1 to Len(strHoge)
If IsNumeric(Mid(strHoge, i, 4)) Then

End if
Next

とかでもいい
0063デフォルトの名無しさん2016/11/22(火) 23:47:20.45ID:VrepQFzl
正規表現検索のワークシート関数を追加するマクロを適当に拾ってきて
パターン記述するだけがなんでそんなに面倒なの?
0064デフォルトの名無しさん2016/11/23(水) 00:57:21.92ID:19Uj+Xkp
そもそも、なんで区切り文字を統一しなかったのかの方が気になる。
0065デフォルトの名無しさん2016/11/23(水) 04:26:23.53ID:CokKvqKV
データフィルタを適用済みの表に対して行っている手動操作を自動化したいです。

ttp://www.dotup.org/uploda/www.dotup.org1070413.zip.html
サンプルの表を上記にアップロードしました。

簡単に記載しますと、列名として
0066デフォルトの名無しさん2016/11/23(水) 04:26:58.39ID:CokKvqKV
データフィルタを適用済みの表に対して行っている手動操作を自動化したいです。

ttp://www.dotup.org/uploda/www.dotup.org1070413.zip.html
サンプルの表を上記にアップロードしました。

簡単に記載しますと、列名として
006765-662016/11/23(水) 04:29:55.29ID:CokKvqKV
すみません。ダブルクォートを入れるとそこでレスが切れてしまうのですね。

データフィルタを適用済みの表に対して行っている手動操作を自動化したいです。

ttp://www.dotup.org/uploda/www.dotup.org1070413.zip.html
サンプルの表を上記にアップロードしました。

簡単に記載しますと、列名として id, disp_name, key_name, str_tag の4列があります。
id列には事前に番号が振ってあります。
disp_name列には、2行目から下に向かって順番に文字列を埋めていきます。
key_name列には、disp_name列に入力した列まで文字列を埋めます。
str_tag列は、=concentnace(\"<item>\", key_name列の同じ行, \"</item>\") として文字列を結合しています。

この表に対して、現状では手動で下記操作をしています。
(1) disp_name列で「昇順でソート」
(2) disp_name列が何行まで追加されているか目視で確認(今回は2〜5行)
(3) str_tag列の2行目をマウス左クリック
(4) str_tag列の5行目を[SHIFT]+マウス左クリック
(5) [Ctrl + C]でクリップボードにコピー

この操作をVBAで自動化したいのです。ご教示お願いいたします。
0068デフォルトの名無しさん2016/11/23(水) 04:38:18.15ID:ETQkNxLx
If Cells(i, 4) = "東京" or Cells(i,4) = 〜

上記のように特定の文字列や数字が入ったセルを削除したいのですが、書式がユーザー定義に勝手になってしまった後の特定の数字も認識させるのにはどうすればいいでしょう。
例えば表示上は「2:00」でセル内は「2:00:00」になっているセルがあるのですが、「Cells(i,4)=」のイコール以降の右辺にはどのような入力をすればいいのか教えていただきたいです。
ユーザー定義は「h:mm」になっていました。
0069デフォルトの名無しさん2016/11/23(水) 05:10:34.47ID:JuV+PXek
>>68
シリアル値か、timevalue関数使ってはどう?
右辺を分数の2/24にするか、timevalue(2:00)にするか。
0070692016/11/23(水) 05:57:17.36ID:JuV+PXek
>>67
こんな感じ?

Dim lastRow As Integer

'B列を基準に昇順ソート
Cells(1, 1).CurrentRegion.Sort _
Key1:=Range(""B1""), Order1:=xlAscending, Header:=xlYes

'変数lastRowは、B列を基準にデータの最終行
lastRow = Cells(1, 2).End(xlDown).Row

'D列の指定範囲をコピー
Range(Cells(2, 4), Cells(lastRow, 4)).Copy

End Sub
0071デフォルトの名無しさん2016/11/23(水) 07:36:30.90ID:ZUX7K1p9
>>68
cells.valueじゃなくてcells.textを見るとかは?
0072デフォルトの名無しさん2016/11/23(水) 09:47:08.46ID:pu5XhQKG
>>67
操作を自動化するのであればまずマクロの記録をやればよい
その時にできたメソッドに内に存在するselectionをrangeに変更
パラメータに最終行(long)を付ける

後は好きな起因に対して起因メソッドを作って最終行を設定するだけ
0073デフォルトの名無しさん2016/11/23(水) 10:19:18.70ID:uwyLjcXT
シートプロシージャに
Application.OnKey
いれてエンタキー押すとセルが移動するプロシージャに飛ぶように設定しています
しかしそれが入っているマクロを閉じて
マクロと一緒に起動していたエクセルファイルのエンタキーを押すと
なぜか閉じたはずのマクロが起動してしまいます

対処方法はあるのでしょうか?
0074デフォルトの名無しさん2016/11/23(水) 10:24:22.35ID:gsunTgbT
「プロシージャに飛ぶ」とは?
0075デフォルトの名無しさん2016/11/23(水) 10:25:09.61ID:uwyLjcXT
>>74
プロシージャじやなくてモジュールでしたね
0076デフォルトの名無しさん2016/11/23(水) 10:39:54.76ID:gsunTgbT
>>73
文章中に「セルが移動する」と「プロシージャに飛ぶ」が並んでいるので意味がとりづらかったがそういうことか。

マクロを「閉じる」って具体的に何をしたの?
Application.OnKey "~" を実行すればいいんじゃないの?
0077デフォルトの名無しさん2016/11/23(水) 11:11:45.75ID:XfUDafmh
VBEを閉じてるだけだったりして
0078デフォルトの名無しさん2016/11/23(水) 11:28:29.03ID:zPkUxQ3G
>>73
用語の意味を再確認しような
正しく伝わらないから
0079デフォルトの名無しさん2016/11/23(水) 16:14:50.37ID:IwbC5ev6
A4 1ページにデザインされたシートがあるんですが、
1セルに複数行入力される事があり、A4をはみ出して
しまいます。印刷プレビューすれば、はみ出した行数
が視覚的に分かるのですが、VBAで行削除を処理する場合、
はみ出した行数を把握するには方法を教えてください。
0080デフォルトの名無しさん2016/11/23(水) 17:14:03.20ID:E/tz3TdR
HPageBreaks
0081デフォルトの名無しさん2016/11/23(水) 23:40:45.02ID:lMvXMjpY
改ペ―シ゛ヒ゛ュ-にしないと、
たまに改へ゜ージ位置を誤爆るから注
                      意
0082デフォルトの名無しさん2016/11/24(木) 00:59:22.70ID:0nX6Nk4o
https://www.youtube.com/watch?v=5hMWNk7yzYA
これって本当に作ってるの?
ニコニコの方見たら動画貼り付けただけって言われてるけど
0083デフォルトの名無しさん2016/11/24(木) 01:49:49.48ID:SBaN99OS
>>82
それと同じ物かどうかはわからないけど「エクセルマリオ」ってゲームはフリーで公開されてる
0084デフォルトの名無しさん2016/11/24(木) 12:21:26.50ID:cvaqDL6S
仮に動画を張り付けているだけだとしてもボタン押下をトリガーとしているのであればVBAで作ってると言える
ただ言葉が足りていないだけ
0085デフォルトの名無しさん2016/11/24(木) 13:17:40.04ID:O2SMVygH
C1-D1=E1に、G1-H1=I1に、K1-L1=M1になっているかどうかをCMY1-CMZ1=CNA1まで確かめたいんですけど
なにか良いやり方ありませんか?
列が飛び飛びで大量なので困り果てています
0086デフォルトの名無しさん2016/11/24(木) 13:30:05.59ID:GyKn3yyw
確認したいの?
入力ではなくて?
0087デフォルトの名無しさん2016/11/24(木) 13:40:19.87ID:O2SMVygH
>>86
そうです。大量の入力が終わってから検算してみて数字が合わないことが判明したって経緯がありまして…
間違ってるのがどのセルか特定する必要があるんです
0088デフォルトの名無しさん2016/11/24(木) 13:46:19.12ID:UceWwKrw
ループで.Offset(0, 4 * i) しながら
.Cells(1, 1) - .Cells(1, 2) = .Cells(1, 3)
を確認すればいいだけなんじゃないの?
0089デフォルトの名無しさん2016/11/24(木) 14:38:39.71ID:m1lTwxZn
E2に
=IF(MOD(COLUMN(),4)=1,IF(C1-D1=E1,"OK","間違ってるよ!"),"")
を入力してCNA2までコピペ

間違ってる場所に飛びたければCtrl+F検索対象を値にして"間違ってるよ!"で検索
0090862016/11/24(木) 14:50:42.07ID:GyKn3yyw
Sub TEST()

Dim i As Long
For i = 0 To 597
If Not Cells(1, 5).Offset(0, 4 * i) = _
Cells(1, 4).Offset(0, 4 * i) - Cells(1, 3).Offset(0, 4 * i) Then
MsgBox Cells(1, 5).Offset(0, 4 * i).Address(False, False)
End If
Next i
End Sub

これだと間違ってるのが多いとMsgがうっとうしいか。
あと全部あってますよって、OKだすのはどうやればいいですかね。
0091デフォルトの名無しさん2016/11/24(木) 15:31:55.20ID:cvaqDL6S
>>90
ok出すだけならこんなかんじでいいんじゃない?

Sub TEST()

Dim i As Long
dim s as string
s=””
For i = 0 To 597
If Not Cells(1, 5).Offset(0, 4 * i) = _
Cells(1, 4).Offset(0, 4 * i) - Cells(1, 3).Offset(0, 4 * i) Then
s = s & Cells(1, 5).Offset(0, 4 * i).Address(False, False) & vbcrlf
End If
Next i
if(len(s)=0)then s= ”ok”
MsgBox s
End Sub
0092デフォルトの名無しさん2016/11/24(木) 16:18:12.50ID:GyKn3yyw
なるほど。
勉強になります。
0093デフォルトの名無しさん2016/11/24(木) 19:44:35.62ID:RwTe1nkA
質問
VBA一通りマスターして、次に覚える汎用言語は何が楽ですか?

http://d.hatena.ne.jp/nomuyoguruto/20091103/1257240624
こういうサイト見ながらいろいろ考えてるのですが
VBAからの応用という視点ではどうでしょう
0094デフォルトの名無しさん2016/11/24(木) 19:59:25.66ID:yz+SO+77
>>93
Python
0095デフォルトの名無しさん2016/11/24(木) 20:26:55.37ID:ajQp3ycE
目的によるけど、今ならpythonかRubyじゃない?
変数宣言ないのが違和感あるけど。
0096デフォルトの名無しさん2016/11/24(木) 20:30:04.54ID:D6M+UwPx
>>85
Sub Check(r As Range)
For i = r(1).Column To r.Columns.Count Step 3
If eq(r(i)) = False Then Exit For
Next
If i < r.Columns.Count Then MsgBox "NG" Else MsgBox "OK"
End Sub

Function eq(r As Range) As Boolean
eq = r - r.Offset(0, 1) = r.Offset(0, 2)
End Function

>>93
アセンブラ
0097デフォルトの名無しさん2016/11/24(木) 20:47:53.02ID:SLtEYwkq
VB.net, C#, C++, PowerShell, Python, ... 好きなの選べよ
てか、目的はないのかよ
0098デフォルトの名無しさん2016/11/24(木) 21:47:19.24ID:D6M+UwPx
>>96
今更気がついたが for i = 1 to r.Count Step 3 だった。
0099デフォルトの名無しさん2016/11/24(木) 22:07:19.81ID:cvaqDL6S
>>93
VBAと似たようにやりたいならVB.NETだと思う
ただ手段が目的とならぬよう気を付けてね
0100デフォルトの名無しさん2016/11/25(金) 00:05:30.65ID:2artgSQC
>>82
ちゃんと作ってるんじゃないの?
SFC版だと、背景が二重スクロールするけど、
それは1枚になってる。
だからエミュでもない。
0101デフォルトの名無しさん2016/11/25(金) 08:44:43.44ID:qZJM+iCL
 複数のシートのA列、B列を一気に削除するにはどうしたらいいですか?
 たとえば 10個のWorksheetがあるとして
Sub DelColum()
 Dim WName(30) AS string
 Dim Temp AS string
 Dim i AS Integer
 
 WName(1) = "Sheet1"
 ……
 WName(10) = "Sheet10"

 for i = 1 to 10
  Temp = WName(i)
  Worksheets(Temp).Activate
  Columns("A:B").Select
  Selection.Delete Shift:=xlToLeft
 Next
End Sub

 これだとワークシートの数が多いと大変です。
0102デフォルトの名無しさん2016/11/25(金) 09:28:00.14ID:BPaHC9at
対象のワークシートを全部選択した状態でa列deleteするのをマクロの記録で取れば
0103デフォルトの名無しさん2016/11/25(金) 09:29:17.83ID:IaV1tOiX
>>93
楽という観点のみで見れば一番楽なのはVB6.0でしょう。
ただしもう終わった言語なので役には立ちませんが。
0104デフォルトの名無しさん2016/11/25(金) 09:50:28.85ID:yAkpad1Y
>>101
Sub Macro1()
  Worksheets.Select  ' 全シートを一気に処理
  Columns("A:B").Select
  Selection.Delete
End Sub
01051012016/11/25(金) 10:04:02.48ID:qZJM+iCL
>>104
おお! ありがとう!
0106デフォルトの名無しさん2016/11/25(金) 11:06:01.87ID:tx9BsTC1
シートモジュールのWorksheet_Changeプロシージャに
Application.OnKey{RETURN}を仕込んでいるのですが
ほかのブック(マクロを仕込んですらいない)でエンターを押してもセルの移動がしません
なぜなのでしょうか?
0107デフォルトの名無しさん2016/11/25(金) 11:51:47.12ID:GSY3PyBI
セルの移動が何をしないの?
0108デフォルトの名無しさん2016/11/25(金) 13:16:42.29ID:tx9BsTC1
>>107
自己解決しました
0109デフォルトの名無しさん2016/11/25(金) 13:17:45.86ID:tx9BsTC1
一回Application.OnKeyやると元に戻さないと
戻らないんやな
0110デフォルトの名無しさん2016/11/25(金) 16:12:51.59ID:zPCc1mPB
>>104
シート跨いでunionって出来ないんだっけ
0111デフォルトの名無しさん2016/11/25(金) 22:42:48.73ID:eBc0RsxA
>>106
これ参考にして
https://youtu.be/EgbsOuegXf8
0112デフォルトの名無しさん2016/11/26(土) 17:07:14.29ID:ThddGL67
すでに数値が入力されている集計表と白紙が個別表があり、
個別表のコピーシートを作成するとともに、集計表1行目の
複数セル(連続ではなく飛び飛びです)の値を入力。
さらに個別表のコピーシートを作成し、2行目の値を入力。
次は3行目を・・・といった動作を繰り返すようなマクロを
作成したいのですがどのような感じで作成すればいいのでしょうか。
0113デフォルトの名無しさん2016/11/26(土) 17:16:48.84ID:hhkRb/f2
>>112
マクロの記録
0114デフォルトの名無しさん2016/11/26(土) 17:36:31.26ID:HuYXsbq3
意味がわからないのでファイルアップしてください。
0115デフォルトの名無しさん2016/11/26(土) 18:22:17.96ID:5ywZoA9/
>>112
要件としてはこんなイメージ?

下記処理を入力済の集計表の1行目から最終行まで繰り返す
1.白紙の個別表を複製(シート名はどうする?)
2.集計表のx行目の特定セルから複製した個別表の特定セルへコピー(特定セルの数だけ繰り返す)
0116デフォルトの名無しさん2016/11/26(土) 20:35:39.19ID:QK8VOWUn
>>112
VBA覚えるより日本語勉強しよう
0117デフォルトの名無しさん2016/11/26(土) 21:12:51.16ID:ThddGL67
>>115
まとめていただいてありがとうございます。
シート名に関しては通常のコピー時のように「○○○(1)」等で大丈夫です。

>>116
説明下手で申し訳ございません。
0118デフォルトの名無しさん2016/11/26(土) 21:28:27.79ID:SwAHsfuW
こういう掲示板で質問するってのは会社で事情を全て分かっている隣の同僚に
聞くのとかとは全然違うからねー。w
0119デフォルトの名無しさん2016/11/26(土) 21:31:03.75ID:oln4NHYZ
>>117
関数でやるかマクロの記録で充分速そう
0120デフォルトの名無しさん2016/11/26(土) 22:32:44.88ID:SPjKnEgp
自分の能力を上回る業務を依頼されたとき(或いは、部署に回されたとき、または、就職できた時) によく見受けられる症状
自分では理解できていないのだが、上司や先輩が言う専門(用)語を使い続けたがる
それ、おま環 てことに気付けない  理解できていないから他所の人間へも伝えるための喩えが思い浮かばない

そのくせ、自力で苦心惨憺しようとはせずに、楽して他力本願(間違った意味の)に委ねる
そして一ヵ月後、三ヵ月後、半年後、一年後、三年後 おなじところで蹴躓いて他力本願・・・  身に付かない → お払い箱
0121デフォルトの名無しさん2016/11/26(土) 23:53:01.23ID:5ywZoA9/
>>117
まずはマクロ記録でメソッドをつくる
マクロ記録でできたメソッドにパラメータを追加したりすこしメンテする
で下記のような感じで呼ぶ

sub main()
dim rng as range
set rng = 入力済の集計表.cells(1,1)
do until len(rng)=0
call マクロ記録でできたメソッド(rng)
set rng = rng(2,1)
loop
end sub

>>120
わからないことをわからないと認識してる分にはそれでいいと思う
受け取れるヤツやわかるヤツが進めればいいだけなので
0122デフォルトの名無しさん2016/11/27(日) 01:47:47.25ID:9ALiodR+
>>82
どうやるんだろうな。
WindowsAPI使っても、多少チラつくと思うんだけど。
0123デフォルトの名無しさん2016/11/27(日) 01:52:28.30ID:abta4z3w
>>122
DirectXまで手を出せばチラつかないようにできる
0124デフォルトの名無しさん2016/11/27(日) 02:36:43.88ID:IwpiVUPK
おいおい、Excel VBAの話ではなくなってるじゃないか。

再現したければDirect Xで普通に作れよ。

なんでExcelなんだよ。
0125デフォルトの名無しさん2016/11/27(日) 03:27:31.54ID:M0APP3Xa
シート上に配置したオプションボタンの値の取得について教えて下さい。

msgbox Activesheet.OptionButton1.Value

これを実行しても
「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」
となります。

どなたか助けて下さい。
0126デフォルトの名無しさん2016/11/27(日) 03:57:49.62ID:1SrO/LjY
>>125
シート上に配置するコントロールって フォームコントロール と ActiveXコントロールの二種類ある訳で
その取得方法は後者のActiveX コントロールだと思うぞ

前者なら
ActiveSheet.OptionButtons("オプション 1").Value
だよ
0127デフォルトの名無しさん2016/11/27(日) 04:00:38.40ID:abta4z3w
>>125
オプションボタンには2種類あるけど、どっちを使うか間違えてない?
http://i.imgur.com/0F2bFaf.gif
0128デフォルトの名無しさん2016/11/27(日) 06:05:42.08ID:QCAWmJwy
>>121
ありがとうございます
0129デフォルトの名無しさん2016/11/27(日) 08:28:41.06ID:9ALiodR+
>>123
DirectXってフルスクリーン用じゃないの?
0130デフォルトの名無しさん2016/11/27(日) 08:42:59.21ID:iYxQCmG1
>>125
俺は思うんだが、このくらいはググれば出てくると思うの
シート オプションボタン 値 取得できない
とかでさ
質問スレだから答えるのは間違いじゃないけどね
検索もコツがあるから、自分で調べないと身に付かないよマジで
0131デフォルトの名無しさん2016/11/27(日) 10:20:06.36ID:hHGtCJzy
>>129
ウィンドウでも画面の一部でも使える
0132デフォルトの名無しさん2016/11/27(日) 11:46:48.22ID:CTVDKxYw
>126
ありがとうございます!後者でした!解決しました!

>130
そりゃあ、そうですよ。第一ググッたほうがはやいですし。
3時間ほどグーグル先生に相談したけどわからなかったんでここに書きました。
0133デフォルトの名無しさん2016/11/27(日) 11:47:25.28ID:CTVDKxYw
>127
間違ってました、ありがとうございます!
0134デフォルトの名無しさん2016/11/27(日) 12:04:08.13ID:XCglAg8k
>>117
Index関数とoffset関数であっという間に終わりそうなんだが
0135デフォルトの名無しさん2016/11/27(日) 12:16:29.51ID:LAFeCFqG
ワークシート関数の使用はほどほどにね
0136デフォルトの名無しさん2016/11/27(日) 15:49:41.11ID:fgiyvf94
>>132
「君の検索時間の3時間は人生にとって無駄」
0137デフォルトの名無しさん2016/11/27(日) 17:09:48.69ID:6DANTm/L
>>136
セレンディピティってのもある
0138デフォルトの名無しさん2016/11/27(日) 17:10:14.41ID:6DANTm/L
>>135
なんで?
0139デフォルトの名無しさん2016/11/27(日) 17:19:34.10ID:LAFeCFqG
>>138
IFを何重かネストさせた中にVLOOKUPがあって...とかになりがちだからさ。
単純に見辛いというのもあるけど、ロジックがシートとVBAの両方に分散されると
スパゲティ化しやすいと思う。
0140デフォルトの名無しさん2016/11/27(日) 17:24:01.54ID:6DANTm/L
>>139
具体的にそれでどう困ったの?

関数の本体がどこにあっても良いんじゃね?
dll使うのとworksheet関数使うのと自作関数使うのと
誰かが作ったクラスのメソッド使うのと
ロジックの観点で違いあるかな?

ちゃんと関数の仕様が解ってる事が前提だけど
0141デフォルトの名無しさん2016/11/27(日) 17:36:24.03ID:y/G0P3fY
>>140
そうだよな、
区別する理由が不明だな
0142デフォルトの名無しさん2016/11/27(日) 18:12:43.77ID:LAFeCFqG
>>140
コメントの有無という点は?
0143デフォルトの名無しさん2016/11/27(日) 18:16:41.37ID:LAFeCFqG
たとえワークシート関数を組み合わせただけでも、それをユーザー定義関数として名前をつけることで
ずっと見通しが良くなると思う。
0144デフォルトの名無しさん2016/11/27(日) 18:22:13.97ID:6DANTm/L
>>142
worksheet関数を使うのとコメントつけるのは別の事だと思う

worksheet関数の使用量を少なくする事で解決する問題ではない

ネストがどうこうと言うのも同様だと思う
0145デフォルトの名無しさん2016/11/27(日) 18:30:32.71ID:LAFeCFqG
>>144
ワークシート関数の使用はほどほどにね、ていうのはセル内の = で始まる式の中にたくさんのワークシート関数を
含ませるのは避けるべきって意味。
ユーザー定義関数にはわかりやすい名前もつけられるし、コメントだって書ける。
だけどセル内に書かれた式には普通どこにもコメントがないじゃん。
0146デフォルトの名無しさん2016/11/27(日) 18:35:41.32ID:SKb1B9xQ
ここはvbaスレなのでワークシート関数と言われるとworksheetfunctionのことと思ってしまう
0147デフォルトの名無しさん2016/11/27(日) 18:54:13.90ID:LAFeCFqG
>>146
>>139に書いた通りIFとかVLOOKUPとかのことさ
0148デフォルトの名無しさん2016/11/27(日) 18:58:07.64ID:6DANTm/L
>>147
vbaでもworksheetfunction.vlookupでワークシート関数を使える
紛らわしい

セル内でもalt+enterで改行できるんじゃない?
多少見やすくできると思う
0149デフォルトの名無しさん2016/11/27(日) 19:01:22.11ID:YPeWXn80
1日ごとの数量の合計を数える→合計の半分の値を出す
→1日の数量を大きい順に並べ替えてから大きい方から合計の半分以上になるまで足して分離値を求める
→分離値を元に大小を分ける…という作業をデータの入った最終行まで行うマクロを作りたいんだけどわからん
形としてはこんな感じのを今までほぼ手作業でやってた
www.dotup.org1074946.xlsx
0150デフォルトの名無しさん2016/11/27(日) 19:07:07.83ID:YPeWXn80
間違えたこっちか
http://www.dotup.org/uploda/www.dotup.org1074946.xlsx.html
0151デフォルトの名無しさん2016/11/27(日) 19:23:09.33ID:p8mIwYr3
>>148
個人的にはコメントが書けないことと並んでローカル変数が使えないのが痛い
デバッグも大変だし
0152デフォルトの名無しさん2016/11/27(日) 19:25:53.13ID:SKb1B9xQ
>>147
ネストしたifとかvlookup

if true then
if true then
s=WorksheetFunction.VLookup(x, Range , y, False)
end if
end if
0153デフォルトの名無しさん2016/11/27(日) 19:26:20.43ID:6DANTm/L
>>151
vbaを知らない人は判らないだろうし
セキュリティ設定の仕方を知らない人も居る

ローカル変数の代わりにセルを使えば良いよ
0154デフォルトの名無しさん2016/11/27(日) 19:33:45.48ID:6DANTm/L
>>149
大きな値から並べ替えて
全部の和を求めて1/2する
大きな値から順に出して半分の値を超えたら
そこから上と下で分ければいい
0155デフォルトの名無しさん2016/11/27(日) 19:35:30.35ID:RiVfj5+K
>>152
それをセルに直接

=IF(IF(.... VLOOKUP(..., ..., ...)))
とか書いてあったらヤダ、って意味でそ
0156デフォルトの名無しさん2016/11/27(日) 19:40:33.60ID:SKb1B9xQ
>>155
それはわかるよ
俺はvbaスレにてそれを示すには言葉が足りてないと思うよって言いたいだけだよ

もっと言えば俺ならそこまで複雑という程ネストしなきゃならないのなら設計から見直す
0157デフォルトの名無しさん2016/11/27(日) 19:47:35.61ID:9ALiodR+
VLOOKUPも、件数が多くなると、普通に使うより、
一度アドバンスフィルタで、必要箇所を切り取ってから使ったほうが速いのな。
0158デフォルトの名無しさん2016/11/27(日) 19:49:54.26ID:LAFeCFqG
>>155
そういう意味ですね。

そういう式はどれもこれも同じに見える。
セルC1にある式とセルD1にある式が実質的に同じなのか違うのかよーく見比べないとわからない。
0159デフォルトの名無しさん2016/11/27(日) 19:57:15.73ID:p8mIwYr3
>>153
> vbaを知らない人は判らないだろうし
> セキュリティ設定の仕方を知らない人も居る
だからなに?
使えないケースがあるのは知ってるけど、だからと言って複雑な数式の欠点がなくなる訳じゃないでしょ
> ローカル変数の代わりにセルを使えば良いよ
個人的にはバッドノウハウだと思う
0160デフォルトの名無しさん2016/11/27(日) 20:23:53.69ID:6DANTm/L
>>159
vbaを知らない人はユーザ定義関数を作れない
つまり他の解決策がない

この状況でネストを深くするのか
途中経過をセルに記録するのか
くらいの選択肢しかない

ユーザ定義関数は使えない、worksheet関数は使うな、セルに記録するな
ではどうやって解決する?
0161デフォルトの名無しさん2016/11/27(日) 21:09:35.79ID:p8mIwYr3
>>160
使えない時の話なんてしてないんだが...
そもそも
> vbaを知らない人は
スレタイ100回読んでから出直してこいよ
0162デフォルトの名無しさん2016/11/27(日) 21:16:43.23ID:6DANTm/L
ならそもそもvbaの中でworksheet関数を使い過ぎるなと言う風に解釈するのが自然だろ
なんでそこだけセル内に限ってるのか?

vba内でworksheet関数を使い過ぎるなと言うのはなんで?と言うのがそもそもの質問だ
0163デフォルトの名無しさん2016/11/27(日) 22:06:28.94ID:p8mIwYr3
>>162
> vba内でworksheet関数を使い過ぎるなと言うのはなんで?と言うのがそもそもの質問だ
>>147 でそうじゃないって書いてあるだろ?
話の流れも読めてなかったのかよ
0164デフォルトの名無しさん2016/11/27(日) 22:10:54.64ID:SKb1B9xQ
>>163
>>147の記載も言葉が足りてないよ
ifもvlookupもvbaにあるんだから
0165デフォルトの名無しさん2016/11/27(日) 22:38:43.48ID:p8mIwYr3
>>164
>>155 で納得したんじゃないのかよ...
本人も >>158 でそう言う意味だって言ってるし
0166デフォルトの名無しさん2016/11/27(日) 22:42:50.90ID:I9PMfVtS
そもそも、VBA使わずにワークシート関数だけでできるか、というのをまず考えるけど。
それが無理とか、できるとしても難易度が高い場合にVBAを使う。

難易度が高い場合に、あえてワークシート関数でやってみることもある。
その場合はできるだけ作業列を使う。
0167デフォルトの名無しさん2016/11/27(日) 22:47:38.58ID:SKb1B9xQ
>>165
俺個人的のことで言えば>>145の時点で理解はしてる
だからこそ>>146で勘違いしてしまいますよーと書いた

一貫して伝えたいのは同じ言葉で複数の意味があるんだから明確に指定した方が言いと思うってこと
言葉が足りてないと勘違いから議論が錯綜する
0168デフォルトの名無しさん2016/11/27(日) 22:48:56.34ID:YHyo0NPs
>>167
激しくどうい
0169デフォルトの名無しさん2016/11/27(日) 23:02:27.57ID:p8mIwYr3
>>167
何回も書かなくていいよ
お前がどう思ってようとどうでもいいし
0170デフォルトの名無しさん2016/11/27(日) 23:12:10.76ID:paA22RBU
>>169
ププッ
0171デフォルトの名無しさん2016/11/27(日) 23:32:02.77ID:SKb1B9xQ
>>169
ごめんね
聞かれてるような気がしてしまったので答えてた
その上で言いたいことはひとつだけだったので繰り返す形になってしまったよ

あと他人がどう思っていてもどうでもいいなら絡まない方がいいよ
0172デフォルトの名無しさん2016/11/28(月) 06:46:24.06ID:HGeAKo4h
>>145 の時点で理解してると書きながら >>162 で蒸し返すとか認知症でも患ってるんだろうな
0173デフォルトの名無しさん2016/11/28(月) 07:37:45.92ID:Fq0t3y7O
IDが異なってるので別人だと思う
0174デフォルトの名無しさん2016/11/28(月) 10:33:38.20ID:75y4ehkP
選択範囲内で黄色く塗りつぶしがされているセルがあってなおかつ右隣or左隣が赤色に塗りつぶされていれば
その赤色セルを黄緑色に塗りつぶす、というマクロを書きたいのですが

Sub cellcolor()
Dim seru As Range
For Each seru In Selection
If seru.Interior.ColorIndex = 6 And seru.Offset(, 1).Interior.ColorIndex = 3 Or seru.Offset(, -1).Interior.ColorIndex = 3 Then
seru.Offset(, 1).Interior.ColorIndex = 43 Or seru.Offset(, -1).Interior.ColorIndex = 43
End If
Next seru
End Sub

だとどうも上手くいきません。黄色セルの左右両隣のなかから赤色塗りつぶしがされてるセルのことを処理のなかでどうやって書けばいいでしょうか。
0175デフォルトの名無しさん2016/11/28(月) 10:48:49.42ID:2XDtQ6UY
>>174
右と左は別々に処理してください
一度にやるのは難しく、現実的ではありません
2回に分けて判定と塗りつぶしをしますから If は2組に分かれます
一番わかりやすく、その分効率の悪い一例を示しますが、ほかにも分け方は色々とあります

Sub cellcolor()
  Dim seru As Range
  For Each seru In Selection
    If seru.Interior.ColorIndex = 6 And seru.Offset(, 1).Interior.ColorIndex = 3 Then
      seru.Offset(, 1).Interior.ColorIndex = 43
    End If
    If seru.Interior.ColorIndex = 6 And seru.Offset(, -1).Interior.ColorIndex = 3 Then
      seru.Offset(, -1).Interior.ColorIndex = 43
    End If
  Next seru
End Sub
0176デフォルトの名無しさん2016/11/28(月) 11:18:24.07ID:75y4ehkP
>>175
できました!!ありがとうございます、大変助かります。
0177デフォルトの名無しさん2016/11/28(月) 19:54:50.21ID:IFLz/K9o
>>155
vlookupとかのワークシート関数じゃなくてユーザ定義関数でもifのネストの中にあれば判りにくいけどな

ワークシート関数とかユーザ定義関数とかじゃなくて単にifとかのネストの問題
0178デフォルトの名無しさん2016/11/28(月) 20:16:29.27ID:9hz+5ATo
力抜けよ
0179デフォルトの名無しさん2016/11/28(月) 20:57:02.51ID:NHCcCoI/
>>175
Sub CellColor()
Dim Cell As Range
For Each Cell In Selection
Dec Cell
Next
End Sub

Sub Dec(Cell As Range)
If Cell.Interior.ColorIndex <> 6 Then Exit Sub
For Each x In Array(1, -1)
With Cell.Offset(0, x).Interior
If .ColorIndex = 3 Then .ColorIndex = 43
End With
Next
End Sub

ネスト化を避ける例を書こうとしたら、逆にネストが深まってしまった。不思議だ・・・。
0180デフォルトの名無しさん2016/11/28(月) 21:36:40.65ID:gVFOtB+w
>>175,179
どっちもダメだと思うけどな。
色はあとから変えないと。
0181デフォルトの名無しさん2016/11/28(月) 21:51:56.21ID:NHCcCoI/
>>180
VBAスレなんだからコードで書いてくれよ。
0182デフォルトの名無しさん2016/11/28(月) 22:19:32.48ID:gVFOtB+w
こんな感じ?
(ただしワークシートの左右端のことは考慮していない)

Sub CellColor(ByVal rg As Range)
  Dim i As Long, j As Long
  With rg
    ReDim col(1 To .rows.count, 0 To .Columns.count + 1) As Long
    For i = 1 To UBound(col, 1)
      For j = 1 To UBound(col, 2) - 1
        If .cells(i, j).Interior.ColorIndex = 6 And .cells(i, j - 1).Interior.ColorIndex = 3 Then
          col(i, j - 1) = 43
        End If
        If .cells(i, j).Interior.ColorIndex = 6 And .cells(i, j + 1).Interior.ColorIndex = 3 Then
          col(i, j + 1) = 43
        End If
      Next j
    Next i
    For i = 1 To UBound(col, 1)
      For j = 0 To UBound(col, 2)
        If col(i, j) = 43 Then
          .cells(i, j).Interior.ColorIndex = 43
        End If
      Next j
    Next i
  End With
End Sub
0183デフォルトの名無しさん2016/11/28(月) 22:23:38.51ID:gVFOtB+w
ああゴメンゴメン勘違いしてた。
今のなしね。
0184デフォルトの名無しさん2016/11/28(月) 22:27:16.46ID:NHCcCoI/
後からまとめてって条件がつくなら、個人的にはこうかな。

Sub CellColor()
Dim Cell As Range, Uni As Range
For Each Cell In Selection
Dec Cell, Uni
Next
Uni.Interior.ColorIndex = 43
End Sub

Sub Dec(Cell As Range, Ret As Range)
If Cell.Interior.ColorIndex <> 6 Then Exit Sub
For Each x In Array(1, -1)
With Cell.Offset(0, x).Interior
If .ColorIndex = 3 Then
If Ret Is Nothing Then
Set Ret = Cell.Offset(0, x)
Else
Set Ret = Union(Ret, Cell.Offset(0, x))
End If
End If
End With
Next
End Sub
0185デフォルトの名無しさん2016/11/28(月) 22:31:28.02ID:gVFOtB+w
右隣or左隣が赤色に塗りつぶされていれば自分の「両隣を」黄緑色に塗りつぶす、
と読み間違えていた。だから先に塗っちゃダメだと考えた。ごめん。

しかしA列の処理はかったるいな。
0186デフォルトの名無しさん2016/11/28(月) 22:56:09.44ID:NHCcCoI/
>>185
Sub CellColor()
Dim Cell As Range, Uni As Range
For Each Cell In Selection
If Cell.Column < 1 And Cell.Column > Columns.Count Then
Dec Cell, Uni
End If
Next
Uni.Interior.ColorIndex = 43
End Sub

こうすりゃいいんじゃね。
0187デフォルトの名無しさん2016/11/28(月) 23:00:24.55ID:NHCcCoI/
ぎゃあ、符号逆だった。

Cell.Column > 1 And Cell.Column < Columns.Count

だな。
0188デフォルトの名無しさん2016/11/28(月) 23:25:03.69ID:JmUquKRk
シンプルにしてみた

Sub CellColor()
Dim Cell As Range
For Each Cell In Selection
If Cell.ColorIndex = 3 then Dec Cell
Next
End Sub

Sub Dec(Cell As Range)
Dim flg1 as boolean
Dim flg2 as boolean

If 1 < Cell.column then flg1 = (Cell(1,0).ColorIndex = 6)
If Cell.Column < Columns.Count then flg2 = (Cell(1,2).ColorIndex = 6)

If flg1 or flg2 Then Cell.ColorIndex = 43
End Sub
0189デフォルトの名無しさん2016/11/29(火) 10:57:07.09ID:29Iv9raX
背景色でセルを仕分けて色によって決められた所定の場所にコピーするというコードを書いて使ってんですけど、一つずつ処理されていく様子を五分ほど眺める
といった格好になっています。もしかして、相当遠回りでアホな書き方してしまっているでしょうか?

Sub 仕分け()
Dim i, n As Long
For i = Cells(Rows.Count, 5).End(xlUp).Row To 75 Step -1
If Cells(i, 5).Interior.ColorIndex = 6 Then
Cells(i, 5).Copy
n = Cells(Rows.Count, "I").End(xlUp).Row + 1
Cells(n, "I").PasteSpecial
Application.CutCopyMode = False
ElseIf Cells(i, 5).Interior.ColorIndex = 3 Then
Cells(i, 5).Copy
n = Cells(Rows.Count, "J").End(xlUp).Row + 1
Cells(n, "J").PasteSpecial
Application.CutCopyMode = False
ElseIf Cells(i, 5).Interior.ColorIndex = 44 Then
Cells(i, 5).Copy
n = Cells(Rows.Count, "M").End(xlUp).Row + 1
Cells(n, "M").PasteSpecial
Application.CutCopyMode = False
ElseIf Cells(i, 5).Interior.ColorIndex = 43 Then
Cells(i, 5).Copy
n = Cells(Rows.Count, "N").End(xlUp).Row + 1
Cells(n, "N").PasteSpecial
Application.CutCopyMode = False
End If
Next

改善策あったらぜひ教えてください
0190デフォルトの名無しさん2016/11/29(火) 11:12:40.38ID:pYNDhOke
毎回コピペしてるのをやめればいいと思う
0191デフォルトの名無しさん2016/11/29(火) 11:19:29.33ID:Gr2aL60y
>>189
"一つずつ処理されていく様子を眺める"
のがイヤなら 処理前に
Application.ScreenUpdating = False
して処理後に
Application.ScreenUpdating = True
するとか・・・
処理時間も 多少改善されるし
0192デフォルトの名無しさん2016/11/29(火) 12:45:25.70ID:pYNDhOke
雑にリファクタリング
動作確認もしていない

Sub 仕分け()
Application.ScreenUpdating = False

dim rng as range
set rng = cells(getLastRow(5) , 5)

do until rng.row < 75
dim n as long
n = getCol(rng)

if n = 0 then goto continue

rng.copy cells(getLastRow(n) + 1, n)

continue:
set rng = rng(0,1)
loop
Application.ScreenUpdating = True
end sub
0193デフォルトの名無しさん2016/11/29(火) 12:45:38.94ID:pYNDhOke
続き

function getLastRow(c as long)as long
getLastRow = Cells(Rows.Count, c).End(xlUp).Row
end function

function getCol(rng as range)as long
If rng.Interior.ColorIndex = 6 Then
getCol = 9
ElseIf rng.Interior.ColorIndex = 3 Then
getCol = 10
ElseIf rng.Interior.ColorIndex = 44 Then
getCol = 13
ElseIf rng.Interior.ColorIndex = 43 Then
getCol = 14
End If
end function
0194デフォルトの名無しさん2016/11/29(火) 12:59:44.64ID:SxpggBZW
条件による配列のフィルタリングとワークシートへの貼り付けで大幅にシンプルにできないだろうか。
0195デフォルトの名無しさん2016/11/29(火) 13:11:27.54ID:7L8IQyuG
>>189
色で並べ替えをマクロの記録でVBAコードにする
色範囲ごとにコピーする
0196デフォルトの名無しさん2016/11/29(火) 13:12:02.41ID:4c1nW30W
同じセル参照が多すぎるんで、せめてColorIndexを変数に入れとくとか、
あるいはElseIfを並べずにCaseで分けるとか、それならColorIndexは1回しかアクセスしないし

一番効くのはScreenUpdatingだろうけど
0197デフォルトの名無しさん2016/11/29(火) 13:50:41.13ID:4c1nW30W
>>189
ちょっとだけ直してみた
そこそこ速くなってるはず

Sub 仕分け()
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Application.Calculation = xlCalculationManual
  Dim i As Long, n As Long
  Application.CutCopyMode = False
  For i = Cells(Rows.Count, 5).End(xlUp).Row To 75 Step -1
    Cells(i, 5).Copy
    Select Case Cells(i, 5).Interior.ColorIndex
    case 6
      n = Cells(Rows.Count, "I").End(xlUp).Row + 1
      Cells(n, "I").PasteSpecial
    case 3
      n = Cells(Rows.Count, "J").End(xlUp).Row + 1
      Cells(n, "J").PasteSpecial
    case 44
      n = Cells(Rows.Count, "M").End(xlUp).Row + 1
      Cells(n, "M").PasteSpecial
    case 43
      n = Cells(Rows.Count, "N").End(xlUp).Row + 1
      Cells(n, "N").PasteSpecial
    End If
  Next
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  Application.Calculation = xlCalculationAutomatic

End sub
0198デフォルトの名無しさん2016/11/29(火) 14:10:39.83ID:29Iv9raX
みなさんお答えいただきありがとうございます。
どれも試したんですけど異様に速くなりました、大助かりです。
0199デフォルトの名無しさん2016/11/29(火) 14:25:54.69ID:4c1nW30W
あれ?作ってる間に解決しちゃった?

Sub 仕分け()
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Application.Calculation = xlCalculationManual
  Dim r As Long, I As Long, J As Long, M As Long, N As Long
  I = Cells(Rows.Count, "I").End(xlUp).Row + 1
  J = Cells(Rows.Count, "J").End(xlUp).Row + 1
  M = Cells(Rows.Count, "M").End(xlUp).Row + 1
  N = Cells(Rows.Count, "N").End(xlUp).Row + 1
  Application.CutCopyMode = False
  For r = Cells(Rows.Count, 5).End(xlUp).Row To 75 Step -1
    Cells(r, 5).Copy
    Select Case Cells(r, 5).Interior.ColorIndex
    case 6
      Cells(I, "I").PasteSpecial : I = I + 1
    case 3
      Cells(J, "J").PasteSpecial : J = J + 1
    case 44
      Cells(M, "M").PasteSpecial : M = M + 1
    case 43
      Cells(N, "N").PasteSpecial : N = N + 1
    End If
  Next
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  Application.Calculation = xlCalculationAutomatic

End sub
0200デフォルトの名無しさん2016/11/29(火) 15:26:54.18ID:Bu/YI1ZB
コピペするより直接値を入れた方が早いんでねえか
値を移すだけだよね?
0201デフォルトの名無しさん2016/11/29(火) 15:27:32.34ID:Bu/YI1ZB
まあ、たぶん更新オフするだけで倍くらい早くなる感じだけど
0202デフォルトの名無しさん2016/11/29(火) 15:36:05.49ID:Ic876T3y
更新オフするときはプログレスバー表示させるようにしてる。長いときはね
0203デフォルトの名無しさん2016/11/29(火) 19:29:44.06ID:SxpggBZW
最近じゃ画面更新はオンにするよう心掛けてるけどね。
0204デフォルトの名無しさん2016/11/29(火) 20:49:24.52ID:I2cETkzm
頻度分布(配列数式になる)をvbaから扱いたくて試行錯誤しています。
既に書き込まれているヒストグラムの
配列数式が入っている領域を調べる方法ってないですか?

セル単体なら HasArray で判定出来ますが、
そうではなくて配列数式が入っているセルの範囲を取得したいのです。
0205デフォルトの名無しさん2016/11/29(火) 20:56:45.18ID:7L8IQyuG
>>204
formulaarrayてのがぐぐったら出てきたけど
0206デフォルトの名無しさん2016/11/29(火) 21:04:11.30ID:sGpU+tuW
サブルーチンとかクラスモジュールって、
実は罠じゃね?

重複する処理を省いていったら、
あっちに飛んだり、こっちに飛んだり。

すげぇ追いづれぇ。
0207デフォルトの名無しさん2016/11/29(火) 21:05:36.04ID:7L8IQyuG
>>206
同じ処理を複数に書くと修正するとき複数修正したり
修正漏れしたりする
02082042016/11/29(火) 21:11:25.94ID:I2cETkzm
>>205
レスありがとうございます。
formulaarray は配列数式の取得(と設定)は出来ますが、
配列数式が入っているセルの範囲が分かるわけではないようです。
0209デフォルトの名無しさん2016/11/29(火) 21:14:53.30ID:7L8IQyuG
>>208
配列数式が入ってるセルから
範囲を広げつつチェックしていけば?
手元に今エクセルないから想像だけど
0210デフォルトの名無しさん2016/11/29(火) 21:20:26.95ID:vJHdqcHB
>>206
他の罠にかかってやんのw
0211デフォルトの名無しさん2016/11/29(火) 22:11:48.69ID:Ic876T3y
>>204
自分だったらこうするな
�@あらかじめ作業用のシートを一つ追加しておく
�AHasArrayを使って、作業用のシートの同じアドレスのセルにたとえば"1"とかフラグ立てさせる
�BUsedRange.Selectで、そのセル範囲を取得する
0212デフォルトの名無しさん2016/11/29(火) 22:12:25.19ID:iqerI5Uh
>>206
それは設計の問題
まぁプログラムに慣れるまではその感覚を持ってて当然だと思うけどね
0213デフォルトの名無しさん2016/11/29(火) 22:32:35.46ID:m98wb1d0
MsgBoxが表示されないで返り値が返ってくるのって設定の問題でしょうか
0214デフォルトの名無しさん2016/11/29(火) 22:32:41.82ID:Bu/YI1ZB
>>206
追わなくてもいいようにクラスを作るんだぜ
0215デフォルトの名無しさん2016/11/30(水) 00:03:18.84ID:SxJugRcT
>>208
CurrentArrayのこととは違うの?
02162042016/11/30(水) 11:38:07.36ID:A7S95sPt
>>215
それです。バッチリできました。
どうもありがとうございます。

>>209,211 のお二人もアドバイスありがとうございました。
0217デフォルトの名無しさん2016/11/30(水) 14:28:38.41ID:X+IOWY5Y
最近、「○○○(笑)」っていうのを、
「○○○()笑」って、括弧をずらしてるのを見かけるが、
Sub main()が元と考えてよいか?
0218デフォルトの名無しさん2016/11/30(水) 15:39:55.02ID:n8iShQZi
>>217
マジレスすると誤字が元だろうし、なんかずれてる感じがハマったんだろうし、そもそもちょっと古い
そしてそれならfunction Fnc() as 笑の方がしっくり来そう
0219デフォルトの名無しさん2016/11/30(水) 20:19:27.59ID:c7D4Y83i
>>213
「エクセルvba msgboxが表示されない」でググったらいいことあるかも
0220デフォルトの名無しさん2016/11/30(水) 22:23:01.07ID:Cdked1mZ
http://i.imgur.com/0GvlUvb.png
図のようにA列の数値が下の行と同じだった場合は
先頭行の数値だけ残してクリアするコードを組みたいのですが
以下のコードを処理しても何も起きません
アドバイスお願いします

Sub Sample()

Dim i As Integer
For i = 24 To 2
If Cells(i, 1).Value = Cells(i - 1, 1).Value Then
Cells(i, 1).Select
Selection.ClearContents
End If
Next i

End Sub
0221デフォルトの名無しさん2016/11/30(水) 22:30:12.25ID:G7TXpy6k
For i = 24 To 2 Step -1
0222デフォルトの名無しさん2016/11/30(水) 22:33:18.95ID:SxJugRcT
>>220
For i = 24 To 2
0223デフォルトの名無しさん2016/11/30(水) 22:33:43.71ID:SxJugRcT
リロードしてなかったw
0224デフォルトの名無しさん2016/11/30(水) 22:34:09.98ID:Cdked1mZ
>>221
解決しました
ありがとうございます
初歩的なつまずきですみません
もっと精進します!
0225デフォルトの名無しさん2016/11/30(水) 23:07:38.86ID:peC29ddm
>>224
期待してる
0226デフォルトの名無しさん2016/12/01(木) 01:44:22.83ID:WV6MWzRC
For nextを入れ子にして、参照したセルが特定の値だったときに
x = 'Sheet1の最終行をとる
Sheets('1').Cells(x,1) = Sheets('2').Cells(1,i)
Sheets('1').Cells(x,2) = Sheets('2').Cells(j,1)
Sheets('1').Cells(x,3) = Sheets('2').Cells(4,i)
みたいな処理を入れたんだが、
抜き出す個数は合ってるのに、↑の処理で抜き出した値を見るとiを+1したとこのセルが抜き出されたりしてて上手くいかない

書き直したりググったがどうしても分からないので原因と直すところを教えて欲しい
0227デフォルトの名無しさん2016/12/01(木) 01:50:04.88ID:qbmZssP5
>>226
コードは省略せず全部書け
0228デフォルトの名無しさん2016/12/01(木) 05:00:23.62ID:GSYGTwDe
>>220
クリアするだけなら一括ですればループ必要ないと思いますが
0229デフォルトの名無しさん2016/12/01(木) 05:12:02.46ID:CgxT78nm
>>226
それだけじゃわからないですね。
0230デフォルトの名無しさん2016/12/01(木) 07:43:23.10ID:1nlifDzR
>>226
抜き出すならせめてforを書いてほしい
0231デフォルトの名無しさん2016/12/01(木) 18:07:28.94ID:4kUT93Wf
質問させてください

VBAで複数のシートを串刺しのように集計したくて
Vlookup関数を使っているのですが
時々、数値を "."で認識してしまったり、emptyと認識してしまい
正しく集計できない箇所があります

その個所を、普通のセルにのVlookup関数として入力すると
正しく数値として認識し、集計できます

数値が"."やemptyとして認識されてしまう原因は、何か考えられますでしょうか?
0232デフォルトの名無しさん2016/12/01(木) 18:18:41.60ID:dtYAYyM6
>>231
コードに問題がある可能性が考えられる
0233デフォルトの名無しさん2016/12/01(木) 18:20:51.19ID:CgxT78nm
バージョンは?
検索の型は?
0234デフォルトの名無しさん2016/12/01(木) 18:38:22.70ID:1nlifDzR
vbaでやらねばならない理由がないのであれば今できてる普通のセルにVlookup関数として入力するやり方でいいと思う
0235デフォルトの名無しさん2016/12/01(木) 18:54:43.59ID:4kUT93Wf
ありがとうございます。

各シートの検索値の個数、順列が同じでないために、VBAでvlookupを利用して集計しないと、串刺しできないと考えてます。
バージョンはエクセル2003です
コードは、
Application.WorksheetFunction.VLookup(No, Worksheets(t).Range("a:t"), Cn1(s), False)

Noは顧客コード
変数t シート名
cn1(s) のsは行数を代入した変数

としてます
0236デフォルトの名無しさん2016/12/01(木) 18:55:43.79ID:UrqhyqO0
質問します
見えてる行だけ削除する方法はわかるのですが

Sub 見えてる行だけを削除()
Dim myRange As Range
Set myRange = Selection
myRange.SpecialCells(xlCellTypeVisible).Delete
End Sub

見えてない行だけ削除するマクロをおしえてください
0237デフォルトの名無しさん2016/12/01(木) 19:05:21.20ID:fsrOpsKt
ワークシートファンクションでvlookup使うのって一般的なん?
値検索ならfor eachでやりたい気がするけど
串刺しってのが良くわからんがシートまたがって検索したいってこと?
0238デフォルトの名無しさん2016/12/01(木) 19:06:44.61ID:fsrOpsKt
>>236
for eachでループして非表示か判定してデリートすりゃいいんじゃね
0239デフォルトの名無しさん2016/12/01(木) 19:20:54.79ID:DdJ1vfW8
>>235
>>cn1(s) のsは行数を代入した変数

"sは行数を代入した変数" というのは分ったけど

cn1() は 配列? 関数?
cn1(s) ←この値がおかしいとか?
0240デフォルトの名無しさん2016/12/01(木) 19:29:43.52ID:T/RQ1Yi1
cn1(s)の値は合ってます

for each を調べてみます

現在の状況は
シート数24×1500行×6列のデータを1500行×6列のシートに合計集計しています
このデーター数に対して、1〜3行(×6列全部)に対するエラーと
1,2個のエラーが発生します

エラーとなる対象のデータタイプは数値になっているのですけど
Vlookup関数では、文字列もしくは空欄と認識してしまうのです
0241デフォルトの名無しさん2016/12/01(木) 19:41:38.96ID:1nlifDzR
>>240
ごめんなさい
やりたいことが全く見えないです

cn1とは何ですか?
行数を指定するならhlookupだと思います
集計するのにデータ数は変わらないのですか?
0242デフォルトの名無しさん2016/12/01(木) 19:55:29.83ID:99opF8JX
>>240
エラーとなる対象のデータに何か共通点はないの?
エラーが出るデータは本当に数字?
0243デフォルトの名無しさん2016/12/01(木) 20:17:11.39ID:fsrOpsKt
どちらにしても返ってくる値は空の意味の値だよ
「.」は空文字、emptyはセルが空という意味だと思われる
数値型でこの二つの値が出ることはないと思うんだがな
vlookupが返す値の型は知らんけどな
0244デフォルトの名無しさん2016/12/01(木) 22:07:39.82ID:VwZQjyuE
シート名にハイフン入れると、
シート名を取得出来ないって仕様ですか?
0245デフォルトの名無しさん2016/12/01(木) 22:13:11.29ID:5vd1VDHh
>>235
vlookupって昇順か降順にソートしてないと正しく動かなかったんじゃね?
0246デフォルトの名無しさん2016/12/01(木) 22:22:09.86ID:VwZQjyuE
>>245
それは高速VLOOKUPでは?
0247デフォルトの名無しさん2016/12/01(木) 23:05:45.27ID:DdJ1vfW8
>>244
そんな事ないと思うぞ
実際どんなシート名で どうゆう コードの時 取得できないの?


>>245
第4引数の 検索方法が False の"完全一致"の時は ソート必要ないよ
0248デフォルトの名無しさん2016/12/01(木) 23:47:14.27ID:UrqhyqO0
>>238
できました
0249デフォルトの名無しさん2016/12/02(金) 00:03:02.36ID:JjyyFj7+
>>248
おめでとう
unionで結合してから消すのがおすすめだぞ
0250デフォルトの名無しさん2016/12/02(金) 00:29:59.89ID:5/G0etdx
A1に任意の数字、B1に計算記号、C1に任意の数字、D1に計算結果って感じのマクロ教えて。課題なの。
0251デフォルトの名無しさん2016/12/02(金) 00:37:42.24ID:494MXyvy
>>250
cells(1,1)= ”任意の数字”
cells(1,2)= ”計算記号”
cells(1,3)= ”任意の数字”
cells(1,4)= ”計算結果”
0252デフォルトの名無しさん2016/12/02(金) 00:43:58.63ID:+5Uwt65C
課題なら自分でやらなきゃ。
計算記号というのがランダムなのかなんでもいいのか分からないけど。
0253デフォルトの名無しさん2016/12/02(金) 00:49:48.84ID:Asb2uwSR
>>250
Cells(1, 4).Formula = "=" & Cells(1, 1) & Cells(1, 2) & Cells(1, 3)
0254デフォルトの名無しさん2016/12/02(金) 01:59:59.40ID:5/G0etdx
>>252
なんでもいい
要はセルを跨いで計算式って感じ
0255デフォルトの名無しさん2016/12/02(金) 02:05:08.49ID:rdJQBVqZ
変数も使わない、ループもなし、条件分岐もなし。
がんばって。
0256デフォルトの名無しさん2016/12/02(金) 07:39:38.72ID:YFqVXqrk
>>241
ありがとうございます

A列に上から順に顧客コードを1500件程度入力され
B〜G列に商品ごとの各月別売上データが格納されているシートが5年分あり
それらを集計する作業をしています
5年の間に顧客が増減していたり、商品の増減がありますので
検索したい顧客コード行数や商品名列数を、シートごとに変数に格納して集計に使っています

Cn1()の配列には、各シートごとに、Cn1(1)〜Cn1(6)まで、対象となる商品の毎の列数を格納してます

>>242
エラーとなる対象データをType関数で調べると数値になりますし
手入力でVlookup関数を使った時の戻り値も、Type関数で見ると数値になります

>>243
ありがとございます
とても勉強になります
0257デフォルトの名無しさん2016/12/02(金) 08:02:52.89ID:IK5yXvqR
>>250
値はそのまま計算に使う
演算子は分岐
これでわかんなかったら愚図
>>256
ためしに、戻り値をclngとかで型変換してみれば?
あと、空文字とかemptyが返ってくるときもlongかなにか知らんが数値型で帰ってきてる?
0258デフォルトの名無しさん2016/12/02(金) 08:04:01.58ID:IK5yXvqR
分岐なしならformulaだな
0259デフォルトの名無しさん2016/12/02(金) 08:09:19.75ID:pOHsdbQe
連結してEvaluateしてもいいかもね
0260デフォルトの名無しさん2016/12/02(金) 08:12:20.96ID:ICEEaGnY
課題でそんな面倒な問題を出すか?
誰でもできるレベルにするだろ普通は
0261デフォルトの名無しさん2016/12/02(金) 08:15:40.74ID:IK5yXvqR
>>260
言うほど面倒か?
VBAなんだからいくらでもアプローチの仕方があるってだけだろ
0262デフォルトの名無しさん2016/12/02(金) 08:15:55.61ID:jbEu1BDa
課題ってなんだ?
今時はどういう段階でそういう課題が出るんだろう?高校くらい?
0263デフォルトの名無しさん2016/12/02(金) 09:56:31.02ID:494MXyvy
>>256
なるほど
要件としてはSQLなら

select A, B, Sum(C), Sum(D), Sum(E), Sum(F), Sum(G)
from 売上データ
group by A, B

で済むことをエクセル管理だからvbaで手段を探してるってことですよね?
0264デフォルトの名無しさん2016/12/02(金) 12:10:23.24ID:ACCGXexq
>>256
シートでsql使えば良い
0265デフォルトの名無しさん2016/12/02(金) 16:41:06.89ID:pwt3cxF3
>>263>>264
ありがとうございました!
データーベースは忘れてしまったので
SQLについて確認してみます
それでも解消できなければまた質問させてください。
ほんとうにありがとうございます
0266デフォルトの名無しさん2016/12/02(金) 16:51:33.48ID:pwt3cxF3
ちなみに、VBAでSQLを学ぶことができる初心者用のサイトってありませんか?
0267デフォルトの名無しさん2016/12/02(金) 17:52:11.94ID:jbEu1BDa
SQLはSQLだよ。VBAとか関係ない。
0268デフォルトの名無しさん2016/12/02(金) 18:35:40.30ID:PNoycjpu
>>266
SQLをすでに知ってる人がVBAに実装するサイトなら見つけたけど、その逆は見つからないね
アクセスがあれば、それに接続するの組むことで勉強にはなるだろうけど
0269デフォルトの名無しさん2016/12/02(金) 18:46:38.44ID:rJHcu9fS
>>268
アクセスを直接使えばいい様な
0270デフォルトの名無しさん2016/12/02(金) 18:53:59.31ID:zvN95jB2
>>266
それは効果的でない
0271デフォルトの名無しさん2016/12/02(金) 19:10:36.96ID:YFqVXqrk
目前の業務では、時間的にVBAで対するしかないようです
エラー個所を手入力で入れなおしてもエラーになるので
エラーの出るシートを作り直して対応してみます
同じように入力した数値でエラー率0.01%(空欄、空文字)となるのはどうしてか・・

みなさま、ありがとうございました
0272デフォルトの名無しさん2016/12/02(金) 21:09:40.43ID:ZW/oP1Fu
クリスマスも近いので
可愛い彼女ができるコードを教えてください
0273デフォルトの名無しさん2016/12/02(金) 21:24:24.52ID:494MXyvy
exit sub
0274デフォルトの名無しさん2016/12/02(金) 22:33:29.62ID:rRSQCExt
ちょっと質問

・おもむろにファイルエクスプローラを開く
・なんでもいいからファイルのプロパティを開く
・そこの作成日時をドラッグする
・セルのA1にペーストする

例えば 2013?年?12?月?1?日、??17:02:28
これを(すでに文字化けしてると思うが)
2013/12/1 17:02:28
に整形したいんだけど
どうすればいいんだ?
半角に見えるけどサクラでみるとU+200Fとなっている
中には数値の間にも混入しているのもある
最初からFSOで取得するのは無しで
すでに手動で取り込んだ数百件ものデータなんだ
よろしくお願いします
0275デフォルトの名無しさん2016/12/02(金) 22:49:07.05ID:494MXyvy
dir /tc 格納パス
0276デフォルトの名無しさん2016/12/02(金) 22:52:06.49ID:rRSQCExt
>>275
ゴメン、同一ディレクトリ、同一PCじゃないんだ
すでに無いファイルもあるし
0277デフォルトの名無しさん2016/12/02(金) 23:04:07.70ID:PNoycjpu
>>274
単純に文字列関数(Replaceとか)では整形できないの?
0278デフォルトの名無しさん2016/12/02(金) 23:09:28.69ID:494MXyvy
>>276
なーるほど
もう取り込んでるけど化けてて使い物にならないわけですな

replaceって手を考えるけど化けた文字の特定が難しいか

まどろっこしいやり方であれば
まず、下記を取得
s(0)=先頭から『年』の前まで
s(1)=『年』の次から『月』の前まで
s(2)=『月』の次から『日』の前まで
s(3)=『日』の次から最初の『:』の前まで
s(4)=最初の『:』の次から最後の『:』の前まで
s(5)=最後の『:』の次から最後まで

次にそれぞれに入ってる数字だけ取る

後は組み合わせる
0279デフォルトの名無しさん2016/12/02(金) 23:13:56.67ID:AN4H0CiB
>>274
Sub test()
  '選択範囲の文字を日付型に変更
  Call Selection.Replace(ChrW(&H200E), "")
  For Each c In Selection
    Date_Time = Split(c.Value, "、")
    c.Value = DateValue(Date_Time(0)) + TimeValue(Date_Time(1))
  Next
End Sub
0280デフォルトの名無しさん2016/12/02(金) 23:33:19.22ID:pOHsdbQe
>>274
Win10+Excel2016 で 試したけど
ファイルのプロパティからコピぺすると 0x200E と0x200F 二つあるな
取りあえず A1セルだけ

Sub test()
Str1 = Range("A1").Value
Str1 = Replace(Str1, ChrW(&H200E), "")
Str1 = Replace(Str1, ChrW(&H200F), "")
Str1 = Replace(Str1, "、", " ")
Range("B1") = CDate(Str1)
End Sub
0281デフォルトの名無しさん2016/12/02(金) 23:58:37.00ID:lnmKrIMO
初めまして教えてください

マクロメ、ビジュアルベーシックどちらも真っ白で何も書かれてないのに、マクロが実行できちゃうのです。もちろん他のエクセルファイルは裏で開いてません。不思議です。プログラムは一体どこに書かれているんですか。
0282デフォルトの名無しさん2016/12/03(土) 00:07:37.10ID:MyQ8FskT
どうやってマクロを実行したの(されちゃったの)?
0283デフォルトの名無しさん2016/12/03(土) 00:22:21.16ID:OzARptjh
 ____
      /  | | |   /  __
    |/    |    /|         |
    |     |\    |        /
  /      |      |   __/
0284デフォルトの名無しさん2016/12/03(土) 00:39:53.44ID:nOKssCOt
URLで指定されたWeb上にある画像の縦横サイズを知るには
どういうマクロを書けばいいのでしょうか
0285デフォルトの名無しさん2016/12/03(土) 05:41:35.59ID:HocSlEH2
>>282
FUNCTIONです
02862742016/12/03(土) 06:47:29.48ID:ChSYpI5v
レス下さった方々どうもありがとう

Replace(Str1, ChrW(&H200E), "")

こういう書き方があったんですね。
勉強になりました。

大変助かりました
重ねてありがとうございます
0287デフォルトの名無しさん2016/12/03(土) 09:19:09.02ID:n/AqAmtP
>>285
マクロ書いてますね
0288デフォルトの名無しさん2016/12/03(土) 09:45:06.35ID:HocSlEH2
>>287
どこに?全体を見渡す方法はないですか
0289デフォルトの名無しさん2016/12/03(土) 10:07:04.20ID:OzARptjh
>>288
デザインモードボタンの右あたり。
0290デフォルトの名無しさん2016/12/03(土) 10:26:47.21ID:n/AqAmtP
>>288
functionはどこでわかりましたか?
0291デフォルトの名無しさん2016/12/03(土) 11:28:39.41ID:MyQ8FskT
>>284
一度画像をDLしないと無理じゃないかなぁ
0292デフォルトの名無しさん2016/12/03(土) 12:22:23.11ID:MyQ8FskT
>>284
切り貼りして作ってみた

Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub test()
Dim SaveFileName As String
Dim DownloadFile As String
Dim Ret As Long
Dim P As Object

SaveFileName = "C:\○○○.jpg"
DownloadFile = "http://〜/△△△.jpg"

Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0)
DoEvents

If Ret = 0 Then
MsgBox "ダウンロードできました。"

Set P = LoadPicture("C:\○○○.jpg")
MsgBox CLng(P.Width * 0.0378) & " × " & CLng(P.Height * 0.0378)

Else
MsgBox "エラーが発生しました。"
End If
End Sub
0293デフォルトの名無しさん2016/12/06(火) 05:33:01.09ID:epR51daM
フィルターに関する質問です。A列に色々な果物の名前が入っているとします。
A列にフィルターを適用し、マクロの記録で「いちご、みかん、りんご」で抽出すると
次のようなコードが出ます。

Sub Macro1()
ActiveSheet.Range("$A$1:$A$19").AutoFilter Field:=1, Criteria1:=Array("いちご" _
, "みかん", "りんご"), Operator:=xlFilterValues
End Sub

この "いちご" , "みかん", "りんご" の部分を変数に置き換えて次のようにしましたが
うまく抽出されません。どこがいけないのでしょうか。

Sub Macro2()
Dim fruits As String
fruits = "いちご" & "," & "みかん" & "," & "りんご"
ActiveSheet.Range("$A$1:$A$19").AutoFilter Field:=1, Criteria1:=Array(fruits), Operator:=xlFilterValues
End Sub
0294デフォルトの名無しさん2016/12/06(火) 05:43:55.80ID:xBUjrFX7
>>293

fruits=Array("いちご" , "みかん", "りんご")

ActiveSheet.Range("$A$1:$A$19").AutoFilter Field:=1, Criteria1:=fruits, Operator:=xlFilterValues
0295デフォルトの名無しさん2016/12/06(火) 08:04:40.33ID:PzVoNBRe
>>293
Array関数を調べてから出直してきて
02962932016/12/06(火) 08:58:18.37ID:epR51daM
>>294
うまくいきました、ありがとうございます。

>>295
そうですね。今度からもうちょっと調べてから聞くようにしたいと思います。
0297デフォルトの名無しさん2016/12/06(火) 16:47:47.49ID:n52TsHhO
Execl2010 Win7の環境での質問です。
共有ブックで(複数ユーザーの編集により)ファイル保存時に競合が発生する場合があります。
この時”競合の解決"ダイアログが出るのですが、この中身(どのセルが競合しているか)をVBAで取り込む方法はないでしょうか?
やりたい事は、競合している内容で判断して保存するかどうか(変更を反映するかどうか)を変えたい、です。
よってダイアログを出さずに競合変更箇所の情報が取れるならもっとも望ましいです。
保存後に変更履歴を調べられる事はわかったのですが保存前に行いたいとなるとやり方がわかりませんでした。
どなたかお知恵を貸してください。
0298デフォルトの名無しさん2016/12/06(火) 18:22:44.38ID:YPrsoJsb
>>297
別名で保存して目視で比較
0299デフォルトの名無しさん2016/12/06(火) 18:48:27.21ID:gXV5LH5j
>>297
別名で保存してfor eachで比較
0300デフォルトの名無しさん2016/12/07(水) 03:18:30.35ID:hqVuC59g
競合してるかどうかはSync.Statusあたりで分かりそうだけど
どのセルが競合してるかとなると、サーババージョン取得して全検査ぐらいしか手が無いのでは
0301デフォルトの名無しさん2016/12/07(水) 21:30:08.74ID:ko89pn9s
質問です

シート1
  A   B
1 東京  10
2 東京  15
3 東京  9
4 大阪  25
5 大阪  4
6 名古屋 5
7 名古屋 42
↓
シート2
  A   B
1 東京  34
2 大阪  29
3 名古屋 47
このような感じで、シート1のデータを参照してシート2にそれぞれの合計を入力するコードを教えてください
最終的にはシート2のデータをグラフに起こす予定です
0302デフォルトの名無しさん2016/12/07(水) 21:49:15.61ID:bGR95WEz
>>301
部分ごとの集計はVBAを使わなくてもピボットテーブルで可能なのは知った上でVBAを希望?
0303デフォルトの名無しさん2016/12/07(水) 22:07:08.47ID:8exYmjRo
>>301
ピポッドでも関数でもできそう
vbaでやるのはいいけど、forとかifくらいは理解してるか?
配列は?
集計条件は決め打ちか?動的か?
0304デフォルトの名無しさん2016/12/07(水) 22:11:04.60ID:j/iCRxZG
>>301
この手順をVBAで作ればいいんじゃね?

1)シート1のA列をシート2のA列にコピペ(Copy メソッド)
2)シート2のA列の重複を削除(RemoveDuplicatesメソッド)
3)シート2のA列のセル一つずつの値に対し WorksheetFunction.SumIf()して
 その結果を隣のB列に書き出す
0305デフォルトの名無しさん2016/12/07(水) 22:42:41.28ID:9YpE3wzx
>>301
シートでSQLだな。
0306デフォルトの名無しさん2016/12/07(水) 22:52:15.40ID:8exYmjRo
ワークシートファンクション使うの嫌いだわ〜
まあ、使えば便利なんだけど
0307デフォルトの名無しさん2016/12/07(水) 23:23:27.23ID:6Yw6pR2H
ピボットテーブルをマクロの記録してvbaで実行
0308デフォルトの名無しさん2016/12/08(木) 00:24:32.24ID:Fvqb+cch
普通にワークシート関数でsumifじゃダメなのかな。
0309デフォルトの名無しさん2016/12/08(木) 00:31:42.34ID:aI8hpPNX
>>308
たぶんsheet2のA列も自動で作りたいんだと思う
sumif単品だとA列ができている前提じゃなきゃ困っちゃう
0310デフォルトの名無しさん2016/12/08(木) 00:33:16.04ID:3TNZQYrl
>>301
SUMIFとかSUMPRODUCT関数使えば一番早いんじゃね?
03113082016/12/08(木) 02:10:15.34ID:Fvqb+cch
>>309
なるほど。
VBAで「重複しないリストを作る」方法がいろいろ紹介されてるので、それコピペでいけそう。
0312デフォルトの名無しさん2016/12/08(木) 12:50:53.05ID:4vmn+DTZ
A列に1/1/2016みたいな文字列が何個かあって1/2/2016になるまで1/1/2016の個数を数えるループ処理が上手くできない
offsetで1行↓移動させたらループすぐ抜けるし、比較演算子を変えたら無限ループする
どこか初歩的な見落としがあるのかもしれんがわからぬ…
0313デフォルトの名無しさん2016/12/08(木) 12:55:36.27ID:aa5GIQq7
>>312
offsetで移動させても
起点となるセルは移動しないよ

offset(1,0)の下を見るには
offset(2,0)とかやらないと
0314デフォルトの名無しさん2016/12/08(木) 13:56:21.16ID:83x0M9fe
>>312
まずはコード晒せ
0315デフォルトの名無しさん2016/12/08(木) 14:06:07.10ID:Uai3hSgC
>>314
途中までなんだけど、

Sub macro2()

Dim mycell As String

Range("N2").End(xlDown).Select
ActiveCell.Offset(, -13).Select

If ActiveCell.Value <> "" Then
Do Until ActiveCell.Offset(1).Select <> mycell

Loop

Else

End If

End Sub

正確に言えばN列のデータのある最終行まで↓に行って、そこからA列に移動して
A列に日付文字列の値があるなら次の日付まで↓に行ってoffsetで一行↑に戻して
1日の範囲を数えるというのをやろうとしていたんだがloopの後どうすればいいのかわからなくて
0316デフォルトの名無しさん2016/12/08(木) 14:42:10.32ID:83x0M9fe
>>315
いちいちSelectするんじゃなくて、数え始める行がわかればいいんだから、まずは
startRow = Range("N2").End(xlDown).row
ってやって行だけを求める

そしたら次は
r = startRow
Do While Cells(r, 1) = 目的の日付
  r = r + 1
Loop
ってな感じで調べながらループ
ループを抜けたら変数 r には一番下の行が入ってるから
r - startRow
って引き算すれば個数がわかる
0317デフォルトの名無しさん2016/12/08(木) 15:10:44.49ID:Uai3hSgC
>>316
言われた通りに試したらちゃんと数えられた有難う
手探りでやり始めて、何かに付けてactivecellとかselectを多用してしまう
0318デフォルトの名無しさん2016/12/08(木) 15:17:26.29ID:krWkenKW
「最近になってVBAをやり始めた人」ってのもいるんだな。
盲点だったわ。
新規参入者なんてもうほとんどいない言語だと思い込んでいたけど、早合点だったか。
0319デフォルトの名無しさん2016/12/08(木) 15:26:57.90ID:HI3obDVl
プログラミング言語としての VBA(VB ver6)は既に過去のものだけど
Excel等(office)を便利にそして自動化するマクロ言語としての価値は
まだまだ十分にあると思う
0320デフォルトの名無しさん2016/12/08(木) 17:08:20.38ID:E4uYVyow
>>317
アクティブうんちゃらとかセレクト系はなるべく使わないように
シート上の動き見られるのは便利なのでそういう使い方ならわかるけども
0321デフォルトの名無しさん2016/12/08(木) 19:32:22.83ID:S4tHP/Ae
特に今年は、趣味の延長でVBAマクロ組んで社内業務のオートメーション化を進めていたが、
五ヶ年縛りの関係で引き継ぎしなきゃならなくなった事務員プログラマも多いだろうから、
来年度からVBAスレが阿鼻叫喚の地獄絵図になるんじゃないかなと予想してる。
0322デフォルトの名無しさん2016/12/08(木) 19:36:32.37ID:krWkenKW
>>321
なにそれ
0323デフォルトの名無しさん2016/12/08(木) 19:38:11.39ID:aI8hpPNX
>>321
はじめてきいた
0324デフォルトの名無しさん2016/12/08(木) 19:39:03.13ID:E4uYVyow
>>321
ワイは地雷を生みまくっとるぞ
ドキュメント?知らん
0325デフォルトの名無しさん2016/12/08(木) 20:47:41.53ID:q1Xyhpju
もうvba中級者名乗っていいレベルに達したと思ってるんだけどもう一皮むけたい
どうすれば上級者になれるだろうか

他の言語やればいいとも聞くが、昔からc++も書いてるしこれ続けてもvbaのマニアックな知識がつくとは思えん
0326デフォルトの名無しさん2016/12/08(木) 20:55:25.00ID:vq5FWDvF
その前に
〜が出来たら中級者、〜が出来たら上級者ってそれぞれに定義してくれ。イメージで話進められても困る。
0327デフォルトの名無しさん2016/12/08(木) 21:00:54.71ID:aI8hpPNX
どこまで行っても初心者感覚は抜けない
0328デフォルトの名無しさん2016/12/08(木) 21:24:53.19ID:Aj4WgEQO
右上のバッテンボタン、終了コマンドで、終了することが出来ないエクセルってどうやって作ればいいのですか?VBAで出来るのですか。
0329デフォルトの名無しさん2016/12/08(木) 21:25:48.96ID:83x0M9fe
できる
0330デフォルトの名無しさん2016/12/08(木) 21:27:15.05ID:q2rSz5MQ
>>325
ライブラリをツクール
0331デフォルトの名無しさん2016/12/08(木) 21:41:21.38ID:HI3obDVl
俺は思う
>>もうvba中級者名乗っていいレベルに達したと思ってる〜〜
こうゆう発想がある限り 初級を抜けてない
0332デフォルトの名無しさん2016/12/08(木) 21:52:55.96ID:Aj4WgEQO
328です。本当お願いします
0333デフォルトの名無しさん2016/12/08(木) 21:55:19.69ID:S4tHP/Ae
>>332
ThisWorkbookに

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub

と書く。
0334デフォルトの名無しさん2016/12/08(木) 22:11:53.55ID:S4tHP/Ae
>>326
初心者:マクロの記録の延長でActiveSheetやSelectionを使用し、ホットキー動作の延長のようなマクロを作れる。
初級者:追加の参照設定をせずに使える範囲の変数を利用し、シートやフォームのオブジェクトに依存しない計算が出来る。
中級者:Declareを含む追加の参照設定を利用してエクセルに依存しない挙動を実装できる。
上級者:自己書き換えコード式学習プログラムや他言語のコンパイラを実装できる。

という定義はどうだろう。
0335デフォルトの名無しさん2016/12/08(木) 22:12:32.91ID:q2rSz5MQ
でもそういうのって迷惑だよねー
0336デフォルトの名無しさん2016/12/08(木) 22:14:58.71ID:Aj4WgEQO
すみません、明日試してみます。

ThisWorkbookに書かないとダメなんですか。あとマクロをじぶんから実行しなくてもいいのですか。
0337デフォルトの名無しさん2016/12/08(木) 22:17:36.76ID:Aj4WgEQO
336は333に対する返信です
0338デフォルトの名無しさん2016/12/08(木) 22:19:25.51ID:1AIJ9s0+
>>334
結局5ヶ年縛りってなに?
0339デフォルトの名無しさん2016/12/08(木) 22:25:31.45ID:niZg3S4G
>>334
上級の意図がわからん
0340デフォルトの名無しさん2016/12/08(木) 22:25:59.75ID:S4tHP/Ae
>>338
有期雇用の雇用限界。
会社勤めなら皆頭抱えてると思ってたが、調べてみたら2018年04月が最短だからあと一年余裕あるのか。
0341デフォルトの名無しさん2016/12/08(木) 22:33:27.47ID:S4tHP/Ae
>>339
エクセル関数に依存しない → エクセルオブジェクトに依存しない → エクセルに依存しない → 言語に依存しない

という流れで書けば良かったと後悔している。
0342デフォルトの名無しさん2016/12/08(木) 22:35:02.72ID:mDqDNpb5
>>340
正社員にはそんなのなくね?
0343デフォルトの名無しさん2016/12/08(木) 22:52:00.76ID:q2rSz5MQ
>>341
それは中級者でしょ?そこはわかる
上級者がわからん
0344デフォルトの名無しさん2016/12/08(木) 22:55:48.20ID:g3bJU1VM
正社員は無期雇用だから関係ないね。

ExcelのVBA書いてるのは有期雇用の人が多いってことじゃないかな?
そもそも自分の周りだと正社員含めて、(ワークシート関数やピボッドテーブルなど使って)満足にExcel使える人もほとんどいないけど。
0345デフォルトの名無しさん2016/12/08(木) 23:36:17.11ID:vq5FWDvF
>>334
上級者ってVBAと全然関係なくね?w
その定義でいうなら、unlha32.dllをdeclareで使ったりDBとやりとりができてる俺は中級者か。やったーw
0346デフォルトの名無しさん2016/12/09(金) 00:29:04.76ID:b9ky9erQ
会社のパソコンはPythonが使えないけどExcelは入ってる
涙をのんでVBAを学習する
つらい…
0347デフォルトの名無しさん2016/12/09(金) 03:40:05.25ID:8cyy7TcK
何がつらいの?
0348デフォルトの名無しさん2016/12/09(金) 04:10:41.10ID:2mFmAOtu
単純作業を自動化したいけど会社ではコンパイラのインストールは許可されないからVBAを使うしかない
と解釈した

VBScriptもけっこう使えるよ
0349デフォルトの名無しさん2016/12/09(金) 05:30:45.93ID:+FF0njzt
嫌だ・・・インテリセンスも使えなければ定数も使えないVBSは嫌だぁぁぁ!!
0350デフォルトの名無しさん2016/12/09(金) 06:25:47.86ID:uzv0Owyj
無料でもダメなの?
0351デフォルトの名無しさん2016/12/09(金) 07:07:00.02ID:K++XEq18
powershell_iseあるやんけ
0352デフォルトの名無しさん2016/12/09(金) 07:22:58.42ID:CLppIZfJ
>>350
たぶん金の問題じゃなくてセキュリティのせいかと
0353デフォルトの名無しさん2016/12/09(金) 08:21:53.15ID:o6zCM5vx
>>345
そこまでいったら中級でいいんじゃね?
まあコードコピペ卒業してないと話にならんけど
0354デフォルトの名無しさん2016/12/09(金) 08:41:11.73ID:8cyy7TcK
どこかの誰かが決めたクラスタリングで最低だとしてもコピペはやめないな
コピペしてから必要なところを手直ししていく

全部覚えて全部書くとか時間足りなくなっちゃう
0355デフォルトの名無しさん2016/12/09(金) 08:49:05.46ID:nvgqC8jJ
セキュリティわかるけどMicrosoft謹製とかOracle様謹製とかで無料だったら「標準的なツールでーす」で
通して欲しいところ。
0356デフォルトの名無しさん2016/12/09(金) 10:53:41.16ID:o6zCM5vx
>>354
調べてもいいけど手打ちはするべきだわ
0357デフォルトの名無しさん2016/12/09(金) 11:18:08.13ID:cvI4vmhk
>>349
インテリセンスは無理かもだけど
wsfファイルで VBS使えば タイプライブラリ指定できるから ExcelVBA定数とかなら 使えるぞ
0358デフォルトの名無しさん2016/12/09(金) 11:18:33.67ID:8cyy7TcK
>>356
べき論はよくわかんないけどお前はお前のやり方でやればいい
俺は確実性を採る

それだけの話
0359デフォルトの名無しさん2016/12/09(金) 12:30:41.47ID:cvI4vmhk
コピペ元がある状況下で効率性や確実性を取って
コピペをするのは良いとは思うのだけど

コピペ元がない状況下で
"お手上げになる人" と "手打ちをしてでも何とかなる人"
の場合 どっちが中級者を名乗っていいのか? って話かと
0360デフォルトの名無しさん2016/12/09(金) 12:45:27.35ID:8cyy7TcK
>>359
なるほど

ごめんなさい
Excelが入ってる以上はヘルプくらいは見れると思いこんでた
そこも見れない状況で自分でも組んだことなくてわからないことがあれば何かしらで調べて手打ちするね

クラスタリングには興味ないので好きに分けてくださいな
0361デフォルトの名無しさん2016/12/09(金) 12:50:23.86ID:cvI4vmhk
>>325 から始まった
クラスタリング?の話題で >>325のコピペ云々の話に参加しておきながら
興味ないとは 不思議に思う
0362デフォルトの名無しさん2016/12/09(金) 12:53:12.86ID:cvI4vmhk
×  >>325のコピペ云々の話に参加しておきながら
〇  >>353のコピペ云々の話に参加しておきながら
0363デフォルトの名無しさん2016/12/09(金) 12:57:21.05ID:8cyy7TcK
>>361
どこかの誰かが決めたクラスタリングで最低だとしてもコピペはやめないよ
ってだけ
0364デフォルトの名無しさん2016/12/09(金) 12:57:56.64ID:nvgqC8jJ
上級者よりエヴァンジェリストが欲しいな
0365デフォルトの名無しさん2016/12/09(金) 13:20:32.71ID:o6zCM5vx
俺が変な突っつきかたしたのが悪かったすまんな
0366デフォルトの名無しさん2016/12/09(金) 17:24:13.79ID:cOteDwNo
他人のコードが読めないのでコピペして修正するより
自分で1から書いた方が早い
0367デフォルトの名無しさん2016/12/09(金) 17:32:55.65ID:2mFmAOtu
プログラマー格言「昨日の自分は他人」
他人の書いたコードが読めないと、自作の古いコードもメンテできなくなる
0368デフォルトの名無しさん2016/12/09(金) 19:34:54.02ID:+FF0njzt
1.コピペで済む。
2.時間が足りない。
3.全部覚える必要が無い。

これプログラマじゃなくてコーダーだから、そもそも分野が違うだろ。
0369デフォルトの名無しさん2016/12/09(金) 19:38:59.49ID:nvgqC8jJ
力抜けよ
0370デフォルトの名無しさん2016/12/09(金) 21:02:43.51ID:EGB1gDys
まあtypoを避けるためにコピペするのはわかるけどペーストしてる内容を理解してるのが前提だわな
0371デフォルトの名無しさん2016/12/09(金) 21:44:48.96ID:o6zCM5vx
>>370
それもあるけど、やっぱ自分で打つって大事だと思うなあ
脳に与える信号の量が違う
コピペはその場しのぎにしかならん
0372デフォルトの名無しさん2016/12/09(金) 22:36:48.18ID:uzv0Owyj
まだまだ空いてるからなんか投稿しようぜ
http://qiita.com/advent-calendar/2016/vb
0373デフォルトの名無しさん2016/12/10(土) 08:48:26.52ID:UQBZDQLB
コピペしてると多機能マクロの変数名が皆コピペ元の癖でそれぞれ違って気持ち悪い
0374デフォルトの名無しさん2016/12/10(土) 09:10:41.85ID:jVYdFP66
上級になる条件の一つはアルゴリズムとかデータ構造とか、言語に依存しない知識を持ってるかどうか
0375デフォルトの名無しさん2016/12/10(土) 10:32:11.50ID:pe8BdvyA
>>373
コピペのせいなのか、IF文を理解していない人間に共通する書き方なのか分からないけど、

If A Then

Else
 (処理)
End If

みたいな書き方を複数の(別人の)マクロで見るんだよな。
Accessマクロか何かからコピーしてくるんだろうか。
0376デフォルトの名無しさん2016/12/10(土) 10:45:31.32ID:iUc/mNcx
>>333

名前変更したいのですが、変更するとマクロが作動しない。なぜですか。



Private Sub Workbook_BeforeClose(Cancel As Boolean) を
Sub AAA(Cancel As Boolean)にしたいのですが。
0377デフォルトの名無しさん2016/12/10(土) 10:48:43.62ID:R9UsBJO4
マクロの記録を土台にしてこのスレで聞いたりネットとリファレンス本で調べたりして、やっとやりたかったマクロができそう
ツギハギだらけで整った感じがしないけど手作業で1時間以上かかるのが2分ぐらいで済むようになったw
0378デフォルトの名無しさん2016/12/10(土) 10:56:28.05ID:VIKfqNe3
>>376
イベントを受け取る関数のインターフェースは固定だから。
必要ならそのAAAって関数をイベント関数から呼ぶようにする。
0379デフォルトの名無しさん2016/12/10(土) 11:00:03.02ID:pe8BdvyA
>>376
イベントが起きた際に、固有の名前のプロシージャを拾う仕組みになっているから。
標準モジュール以外で、コード書くところの上部にある(General)と(Declarations)でイベント一覧見られる。
0380デフォルトの名無しさん2016/12/10(土) 11:40:10.29ID:onDIAfWB
>>375
Else節にしか処理がないって意味?
0381デフォルトの名無しさん2016/12/10(土) 12:08:24.20ID:UQBZDQLB
>>375
理解してないというか、それIf Notを知らんだけじゃないの?
0382デフォルトの名無しさん2016/12/10(土) 12:21:24.62ID:YRX+c+Bx
>>374
アルゴリズムとデータ構造はむしろ基礎じゃね?
0383デフォルトの名無しさん2016/12/10(土) 12:52:49.90ID:2yEuAhZx
>>376
変更できないものを変更すりゃ、そら動かんわ
0384デフォルトの名無しさん2016/12/10(土) 13:04:34.51ID:pe8BdvyA
アーキテクチャとかアルゴリズムとかデータ構造とかって、
どう設計すればいいのか思いつかず悩んでいる時に手を出して、
「結局のところケースバイケースやんけ!」と毎回なる。そんな印象。
0385デフォルトの名無しさん2016/12/10(土) 14:23:47.00ID:15RnwqyZ
基礎として知っておいて損はないアルゴリズムってあるよね
未だにVBAで実装してないのが謎な 配列ソートとか
0386デフォルトの名無しさん2016/12/10(土) 17:04:00.53ID:2fEwvIev
配列のソート、もしあったとしてもワークシートのと同じくらいの機能しかできなかったろうし、
今更新たに追加される訳もないしな。
0387デフォルトの名無しさん2016/12/10(土) 17:13:54.99ID:iUc/mNcx
>>379
シート上に閉じるのボタンを設置したい

どんなマクロを作ればいいのですか。
0388デフォルトの名無しさん2016/12/10(土) 17:16:17.73ID:YRX+c+Bx
>>387
シートのモジュールにボタンクリックをハンドルする関数とかを作ってapplicatin.quit()とか
0389デフォルトの名無しさん2016/12/10(土) 17:22:34.51ID:15RnwqyZ
>>386
ワークシート・ソート レベルで十分な気がする
それ以上の高機能を求めるなら 自分で実装すれば と思うのよね

俺なんか こまごまとした少量の配列ソートは バブルソートでサクッと作ってたりする
(アルゴリズムが簡単なので 手打ちで十分作れるから 大量データは死ぬほど時間かかるけどw)
0390デフォルトの名無しさん2016/12/10(土) 17:55:31.56ID:15RnwqyZ
>>387

>>333のコードと一緒に使うなら
Sub ExcelEnd()
 Application.EnableEvents = False
 Application.Quit
End Sub

かな? (これは マクロ名変更可能よw)
0391デフォルトの名無しさん2016/12/10(土) 19:13:46.43ID:XiiYXH4d
>>375
最初の処理が要らなくなったが、
書き直して余計なバグ発生させたくないとか。
0392デフォルトの名無しさん2016/12/10(土) 19:34:06.06ID:iUc/mNcx
ボタンで終了、ボタン以外では終了出来ない。それが良いのですが。。
0393デフォルトの名無しさん2016/12/10(土) 19:41:02.72ID:9aWolb9D
>>375
コーディング規約とかで禁止じゃなきゃ普通に使ってる。
何もしないのを明示したいときとか、あとで変更する可能性が高いときとか。
必ずコメントはつけてるけど。
0394デフォルトの名無しさん2016/12/10(土) 19:43:45.19ID:15RnwqyZ
>>392
>>390 のマクロを ボタンにマクロ登録すればいけると思うが・・・

もしかして
マクロでも終了できなくしたいって事 考えてる?
そうまでししたい理由を教えてほしいな
0395デフォルトの名無しさん2016/12/10(土) 19:46:08.09ID:9aWolb9D
>>392
よこからだけど、
390は標準モジュールに記述してボタンにマクロを登録。
332はthisworkbook(イベントプロシージャ)に。
0396デフォルトの名無しさん2016/12/10(土) 20:20:19.63ID:YRX+c+Bx
>>389
何回も作るのは無駄
クラスにすれば良いんじゃね
0397デフォルトの名無しさん2016/12/10(土) 20:25:36.28ID:onDIAfWB
>>392
通常のインタフェースを殺すのは迷惑だと思われるかもよ?
0398デフォルトの名無しさん2016/12/10(土) 20:53:30.95ID:onDIAfWB
>>396
関数でも一個で済むような気がするんだが
0399デフォルトの名無しさん2016/12/10(土) 21:02:30.15ID:15RnwqyZ
>>396
一々クラス作って呼びだすまでもない時 初歩的なソートという意味で書いたのね

もちろん 大量データ用に アドイン内に クイックソート作ってクラス化はしてるけど
そこまで必要ない時とか 他PCで動かしたいけど アドインインスコするまでもないとかね
いろいろあるのよ
0400デフォルトの名無しさん2016/12/10(土) 21:13:15.32ID:onDIAfWB
>>399
myQuicksort(v) という関数と比べて使い勝手は向上するの?
0401デフォルトの名無しさん2016/12/10(土) 21:16:25.21ID:15RnwqyZ
>>400
myQuicksort()って
関数VBAであるの? 知らない教えて
0402デフォルトの名無しさん2016/12/10(土) 21:29:33.20ID:15RnwqyZ
>>400
myQuicksort()でぐぐってみたけど
ぐぐり方が悪いのかヒットしないな

知らないものとは比較できないし
そもそも 使い勝手なんか 多分に主観が入るから
俺がこうだって言ったって意味ないと思うので

使い勝手云々は 逃げたと思われたとしても スルーさせてもらうね
0403デフォルトの名無しさん2016/12/10(土) 21:45:18.77ID:onDIAfWB
>>402
myQuicksort() って名前は仮だよ。そういう関数を作ることはできるわけじゃん。
>>399で「クラス化してる」って書いてたから、単なる関数と比べてどういう利点があるのかな?って意味。
わかりにくかったらスマソ
0404デフォルトの名無しさん2016/12/10(土) 21:49:19.67ID:883lVJyP
>>403
クラスの話は過去に色々あった様な
カプセル化とかなんとか
ソートに限れば大差ないのかもしれないけど
一般的には再利用する様なコードはクラスにした方が良いと言われている
04054022016/12/10(土) 21:51:03.82ID:15RnwqyZ
>>403
クラス化してるのはクラス化したかったからと答えておく
それ以外の理由は >>402 で書いたとおり 主観の問題もあるから答えない
0406デフォルトの名無しさん2016/12/10(土) 21:51:16.61ID:cjh5FBfC
クラスにしろとかファンクションにしろとか宗派みたいなもんだろ
0407デフォルトの名無しさん2016/12/10(土) 21:52:23.68ID:883lVJyP
>>403
意図せずに関数が参照している変数を書き換えてしまうと関数が誤動作してしまう

自分が作ったのなら判るだろうけど
忘れたりする可能性もある

クラスにしてメソッドが使う変数をカプセル化してそれを防ぐとか
0408デフォルトの名無しさん2016/12/10(土) 22:07:21.51ID:onDIAfWB
>>405
なるほど。主観の要素が大きいならしょうがないね。

>>407
ソートってユーザーから渡された配列を受け取って、ソートが終わったらおしまい、っていうものだよね?
何か状態を保持し続けたりするわけでもないし、書き換えてしまうおそれのある変数って
受け取った引数かローカル変数しか思い当たらない。
04094022016/12/10(土) 22:10:03.83ID:15RnwqyZ
>>406
そそ クラスが必用?不要? の展開になると 宗教戦争みたくなるから
あまり関わりたくはないんだよね
0410デフォルトの名無しさん2016/12/10(土) 22:14:06.73ID:VIKfqNe3
データベースの接続とか状態保持が必要なものはクラスにするけど、必要無いものはわざわざクラスにはしないな。
VBAだとクラスの機能自体、半端だし使い勝手が悪くなるだけな気がする。
0411デフォルトの名無しさん2016/12/10(土) 22:25:22.60ID:883lVJyP
>>408
だからソートだけなら大差ないかもしれない
一般的には再利用するならクラスの方が安全
0412デフォルトの名無しさん2016/12/10(土) 22:30:04.51ID:onDIAfWB
>>411
了解

見返したら俺が反論したかったのは>>396だけだったと気づいた
0413デフォルトの名無しさん2016/12/10(土) 22:35:14.53ID:iUc/mNcx
>>395
ありがとうございました。
394さんも。
0414デフォルトの名無しさん2016/12/10(土) 22:36:42.44ID:Mx1Yrknq
vbaってなんでインタフェースだけ継承できるの?
インタフェースの継承って、大規模開発のためのものでしょ?
0415デフォルトの名無しさん2016/12/11(日) 00:09:57.73ID:26poxuXb
UserFormが必要で、シートが要らなかったらどうする!?

と思ったが、シートがないと状態の保存ができない!!

どうする。

ムズッムズッムズッムズッムズッムズッムズッムズッムズッ
0416デフォルトの名無しさん2016/12/11(日) 00:51:27.18ID:86HicU2B
アドインにして本体のシート使えば
0417デフォルトの名無しさん2016/12/11(日) 00:55:31.82ID:4iLJwZQ7
>>415
ThisWorkbookモジュールは使えないんだっけ?
0418デフォルトの名無しさん2016/12/11(日) 02:35:58.29ID:tI/9HBMa
エクセルでマウスホイールのイベントを取得するために
グローバルフックをするサイトが確かあったんですが見つかりません。
どなたか知っている方いらっしゃいますか?
橙色を基調としたエクセルやVBAのチップ集が載っているサイトです。
0419デフォルトの名無しさん2016/12/11(日) 10:14:33.57ID:JsC+H88A
>>415
form表示の際に
Application.Visible = False
にしてExcel本体は見えないようにしてる。
それで我慢しろよw
0420デフォルトの名無しさん2016/12/11(日) 15:39:45.56ID:sVYwzRFZ
>>418
それだけのキーワードが確定してるなら検索できそうな気がするけどな
0421デフォルトの名無しさん2016/12/11(日) 16:17:22.39ID:023xDB9g
100行以上あるプロシージャAを呼び出すとします。
普段は普通にこのプロシージャAを呼び出しているんですが
ある特定の場所から呼び出すときのみそのプロシージャAの中のたった2-3行だけは実行しないようにするためには
どうやって対処するのが定番ですか?

もちろん単細胞的にプロシージャBをコピペで作りこのプロシージャBからその対象の2-3行だけ削除して
その特定の場所からはプロシージャAではなくプロシージャBを呼び出すことにすれば可能ですが
コピペに罪悪感があります。
0422デフォルトの名無しさん2016/12/11(日) 16:23:13.76ID:BwhVVnuL
何を悩むことがあるんだ?
フラグになる変数渡してif節使うだけだろ
0423デフォルトの名無しさん2016/12/11(日) 16:41:40.64ID:023xDB9g
>>422
そりゃフラグでも使えばなんでもできるようになるけど
この場合のリスクはたったそれだけのことにフラグを無駄に1つ増やすことによる「複雑化のリスク」なんです。
この程度のことになにかフラグを1つ増やすとなるとこんなことは多様にあるのでそのつどフラグやらなにやらそれだけのために新しいものを増やすことばかりすると
コードが複雑になり美しくない。

プログラミングの神様ならこのようなときどうしますか?定番みたいなのはないですか?
0424デフォルトの名無しさん2016/12/11(日) 16:46:07.60ID:JsC+H88A
美しいとか美しくないとか言って本来やるべきことが出来なくなったら本末転倒もいいとこなんで勝手に悩んでおきなよ
0425デフォルトの名無しさん2016/12/11(日) 16:47:19.88ID:023xDB9g
ここは悩む価値のある悩みだと思うのですが。
逆になにも考えず結果だけを求めると技術スキルの向上が望めないと思うのですが。
0426デフォルトの名無しさん2016/12/11(日) 16:51:14.81ID:0xRb/7vz
>>421
ある特定の場所から呼ぶときだけわかる様にする
引数とか変数とか
0427デフォルトの名無しさん2016/12/11(日) 16:52:03.84ID:0xRb/7vz
>>425
悩む価値が無いと考える人がいても良いんじゃね
なぜ価値があると思うのか
0428デフォルトの名無しさん2016/12/11(日) 16:57:33.31ID:023xDB9g
>>426
引数は少ないほど理想です。
たくさんあるとそのプロシージャの自由度・汎用性が制限され、いろんなところから使いにくいプロシージャとなってしまいます。

このプロシージャは100行くらいあってたった3行のために1つ引数を増やすのが気持ち悪いです。
もともとこのプロシージャは引数は1個も無いですから。

>>427
スキルアップのためです。
0429デフォルトの名無しさん2016/12/11(日) 17:15:01.05ID:0xRb/7vz
>>428
気持ち悪いというのはあなたの感じ方だから他の人も同じ感じ方をするか判らない

数行を実行しない事をなんらかの形で情報伝達しないと実現できない
定番の方法は引数を追加する方法
他にもあるだろうけど
0430デフォルトの名無しさん2016/12/11(日) 17:17:00.52ID:97kSj4nq
特定の場所から呼び出す場合に対応できないほど自由度・汎用性の低いプロシージャAを作り直しましょう
0431デフォルトの名無しさん2016/12/11(日) 17:19:40.23ID:023xDB9g
もうあきらめて応急処置として呼ばれたプロシージャの情報を得られるプロパティを見つけました。
Application.Caller
というやつです。
でもこれどうやって使うんですか?
if文でApplication.Callerを使って判別しようとしたけどApplication.Callerの値の型が分からない。
0432デフォルトの名無しさん2016/12/11(日) 17:20:25.46ID:sVYwzRFZ
100行あるプロシージャの時点で美しくないw
0433デフォルトの名無しさん2016/12/11(日) 17:22:30.87ID:SGarNxNy
>>431
https://msdn.microsoft.com/ja-jp/library/office/ff193687.aspx
0434デフォルトの名無しさん2016/12/11(日) 17:23:59.01ID:0xRb/7vz
>>431
application.callerでは呼び出し元プロシージャは判らない

定番はoptional引数追加
0435デフォルトの名無しさん2016/12/11(日) 17:24:39.21ID:97kSj4nq
抽象的な話しかしてないから抽象的な話しかしないけど、
普段呼び出す場合と特定の場所から呼び出す場合で、処理の意味が違うなら素直に別のプロシージャを作る
同じような処理なのに、特定の場所から呼び出す場合に対応できないならプロシージャAの設計が悪い

プロシージャAは引数なしだと言うが、無意識にデフォルト引数を考慮しているだけでは?
自由度・汎用性というなら、引数を取るのが正解なんじゃないか?

適切で必要な引数を取ることを複雑になるとは思わない
むしろ引数がないからこそ汎用性が下がって複雑になる場合もある
0436デフォルトの名無しさん2016/12/11(日) 17:53:50.89ID:bBR4GMik
100行以上あるうちのその2、3行を共通処理として別関数に切り出しては
0437デフォルトの名無しさん2016/12/11(日) 17:57:25.86ID:wm/1F8TY
まぁoptionalやろな。
0438デフォルトの名無しさん2016/12/11(日) 18:09:01.09ID:cu/yECuQ
>>428
> もともとこのプロシージャは引数は1個も無いですから。
グローバル変数でやり取りしてるのか?
真面目に基礎からやり直した方がいい
もっといいのはこの業界から足を洗うことだと思う
0439デフォルトの名無しさん2016/12/11(日) 18:41:17.45ID:4iLJwZQ7
>>428
引数が1個もない、ということから複数の可能性が考えられる

いつも同じ制御をたどって同じ結果を返す
グローバル変数などを参照・変更しつつ制御をコントロールし、異なる結果を返す
ワークシートを参照・変更しつつ 〃

あんたのはどれ?
0440デフォルトの名無しさん2016/12/11(日) 18:41:33.01ID:joPEoOmt
Excelだとシートの文脈とハードコードでなんとかなってしまうからな
0441デフォルトの名無しさん2016/12/11(日) 20:10:02.64ID:Qe/hbe0F
>>428
どんな目的なんだその
プロしジャー。

自由度と汎用性は
目的次第な面があるけど
、意味に踊らせれてる感があるよ
0442デフォルトの名無しさん2016/12/11(日) 20:46:30.28ID:NaScrWu0
簡単に言うならフラグで分岐作らん限りはvbaじゃ無理だろ
グローバル変数使う方が引数増やすよりよっぽどクソだろ
0443デフォルトの名無しさん2016/12/11(日) 22:19:14.14ID:4iLJwZQ7
ワークシートという隠れグローバル変数ga
0444デフォルトの名無しさん2016/12/11(日) 22:21:43.58ID:cu/yECuQ
>>442
>>421 のプロシージャがどんなもんかがわからんのでなんとも言えないけど

Sub A1
処理1
処理2 ' たった2〜3行
処理3
End Sub

みたいな奴なら

Sub A1
Call P1
処理2
Call P3
End Sub

Sub A2
Call P1
Call P3
End Sub

Sub P1
処理1
End Sub

Sub P3
処理3
End Sub

ってやるかな
0445デフォルトの名無しさん2016/12/11(日) 22:29:58.55ID:fmXJdiQ8
わずか数行でも不可分のまとまった処理ならSubに分けた方が見通しが良くなるケースはあると思うけど、まあ作る人にしかわからんもんなあ

VBだと昔のBASICの名残であんまり分けないことが多い気がするけど、C言語は複雑で意味のわかりにくい数式だとたった1行でも関数に分けて
読みやすくしたがる人もいるからなあ
そんなのはコメントを書けば十分という人もいるし、まあ人それぞれだな

こういうのは人に聞いたってしょうがない
自分で悩んで経験を積んでマイルールを決めていくもんだ
そういう部分でいちいち悩まないのが上級者ってやつだと思う
0446デフォルトの名無しさん2016/12/11(日) 23:12:57.98ID:NaScrWu0
>>444
確かに、そうするべきだな
100行以上あるプロシージャーって時点でまずそこが間違ってるわ
0447デフォルトの名無しさん2016/12/11(日) 23:29:27.06ID:3yj6gm48
宗教じみてて相手するだけ無駄な奴っぽい

>>444
多分P1とP3の間で変数やりとりするのに引数大量に必要になるから、それもダメでは?
全部グローバル変数にするとか愚の骨頂だし
0448デフォルトの名無しさん2016/12/11(日) 23:51:10.91ID:gxiyMp/k
>>447
そうだね
定番を聞いてきたから 定番を答えたら
それは (神の)教えに反する間違ってる(異端だー)だもの
0449デフォルトの名無しさん2016/12/11(日) 23:51:43.37ID:88RT9zSF
大量の引数は配列や構造体でまとめるもんだ
それができないとしたらプロシージャの設計が悪い
もっと言えばアルゴリズムが悪い
0450デフォルトの名無しさん2016/12/11(日) 23:57:07.93ID:sVYwzRFZ
シンプルさという観点からいえば1つの処理は出来るだけ短く、
引数やローカル変数の数は出来るだけ少なく、グローバル変数は極力使わず、
制御構造のネストは出来るだけ浅くが基本だからな

企業によっては妙な縛りを言語に詳しくない奴が勝手に決めてて出来ない理由もあるかも
知れないが
0451デフォルトの名無しさん2016/12/12(月) 00:33:41.56ID:7hVHE+7/
>>444
まあ無難なところだわな
0452デフォルトの名無しさん2016/12/12(月) 01:17:20.35ID:ydTJn2WH
>>450
IF や Withを使う方が一行で書くより処理が早いことも可読性が高いことも多々あるからそんな基本気にするのは初心者のうちだけだろ
0453デフォルトの名無しさん2016/12/12(月) 01:31:12.04ID:i6nITIBn
アルゴリズムを見直してスピードが倍になるなら直す価値がある

しかし計算式を短縮して1%のスピードアップならやらない方がいい
見通しが悪くなったおかげで、それ以上の時間を保守で浪費するだけ
0454デフォルトの名無しさん2016/12/12(月) 06:17:00.66ID:0MvKSkg9
最終的に使用する変数から逆算してプロシージャを分離出来ると思うけど、
もし気にくわない量の引数が必要になるんだったらクラスのメンバーとして管理すればいい。
0455デフォルトの名無しさん2016/12/12(月) 08:06:41.47ID:F69iUWZo
たしかに、引数が多くて困るならクラスにまとめちゃうのがいいわ
配列とかコレクションでもいいけど要素数とか型とかかっちりしたいならクラスの方がよさげ
0456デフォルトの名無しさん2016/12/12(月) 08:16:39.09ID:Ca0fyYhP
>>418
RelaxTools ってアドインがグローバルフックでリストボックスのマウススクロールに対応しとったで
0457デフォルトの名無しさん2016/12/12(月) 09:53:28.60ID:WwPYZCAL
分離することが大事。
クラスにまとめて(たくさんの状態を抱えても)外から見えなくすればOK、というものではない。
最初からそうしろということではなく、二度目からはね。
0458デフォルトの名無しさん2016/12/12(月) 10:31:42.47ID:F69iUWZo
>>457
依存性やらなんやらってことか
できるだけ一対一くらいでやり取りしたいわな
0459デフォルトの名無しさん2016/12/12(月) 11:52:56.78ID:WwPYZCAL
>>458
そう。
パターンは複数あるだろうから、最初から全方位に向けて汎用性を求めるなんて出来ないけどね。
最初は大きかったクラスがだんだん小さくなるってのがいい兆候。
0460デフォルトの名無しさん2016/12/12(月) 12:33:16.72ID:8Gj445kL
>>456 ありがとうございます。
探していたサイトは無くなってました。
https://web.archive.org/web/20131112102506/http://veaba.keemoosoft.com/2013/11/728/
0461デフォルトの名無しさん2016/12/12(月) 12:46:02.51ID:F69iUWZo
>>459
いうてその処理内でしか使わないならそこまで気にせんでも良さそうだが
何回もいろんなとこで使うんかね
0462デフォルトの名無しさん2016/12/12(月) 12:55:48.13ID:aLE+Z42Q
>>455
Type って知ってる?
0463デフォルトの名無しさん2016/12/12(月) 13:00:03.60ID:WwPYZCAL
>>461
「二度目からは」ってのは複数箇所から参照したくなったりしたら、という意味。
0464デフォルトの名無しさん2016/12/12(月) 13:01:59.88ID:HOkh+6ez
>>460
これ↓なんかどうなんだろうか? 使った事ないから間違ってるかもだけど

Visual Basic 6.0 IDE でマウス ホイール イベントが機能しません。
https://support.microsoft.com/ja-jp/kb/837910

>>注 ほとんどの VBA 環境でこのアドインを使用することもできます
とか書いてるし
0465デフォルトの名無しさん2016/12/12(月) 14:53:18.92ID:KHTlL8cv
Excelで初めて、Application.OnTimeを使いました
シート上に専用のボタンを作ってそこで

Application.OnTime EarliestTime:=TimeValue("12:00:00"), Procedure:="Test"

としたのですが、このTestというサブルーチンなのですが、
マクロが出来る別の標準モジュール(Module1とか)に作ればそのTestという
サブルーチンが実行されるのですが、このボタンを作った
シートのところ(Sub Buttun_Clickがあるところ)に
Public Sub Test()
--
End Sub
としても、Testがありませんというエラーメッセージが出てきます
ボタンと同じシートのところのサブルーチンも扱えるようには出来ませんか

時間がきたときに、他のボタンを実行させたいのです
0466デフォルトの名無しさん2016/12/12(月) 15:44:28.73ID:HOkh+6ez
>>465
やり方を2つほど
その1)
Application.OnTime EarliestTime:=TimeValue("15:02:00"), Procedure:="sheet1.Test"
注意)ここで sheet1は シート名 ではなく シートオブジェクト名を指定する

その2)
標準モジュールに下を書いておいてそれをOnTimeで実行するようにする
Sub testx()
Call Sheets("Sheet1").Test
End Sub
0467デフォルトの名無しさん2016/12/12(月) 16:06:42.11ID:KHTlL8cv
>>466
ありがとうございました。できました
0468デフォルトの名無しさん2016/12/12(月) 20:07:36.83ID:iMrIDuU/
3度目の法則だっけ?
3回同じパターンがあったらまとめろって言うの
0469デフォルトの名無しさん2016/12/12(月) 20:09:50.87ID:0MvKSkg9
>>462
Collection型やDirectory型に役目を食われて使いどころの分からないTypeか。
ほんとあれ何処で使うんだよ。
0470デフォルトの名無しさん2016/12/12(月) 21:00:47.48ID:HNke9LPW
>>469
お前なにか勘違いしてね?
型をかっちりしたいの意味もわかってないのかよ w
0471デフォルトの名無しさん2016/12/12(月) 21:08:19.40ID:0MvKSkg9
>>470
ああ、「かっちりしたい」を読み飛ばしてたわ。
でもそれならClassでいいわ。
0472デフォルトの名無しさん2016/12/12(月) 21:11:51.35ID:F69iUWZo
ユーザー定義型もいいけど、ね
みんな結構使うんか?
0473デフォルトの名無しさん2016/12/12(月) 21:12:03.53ID:zdzgclww
AnataniOnTimeだと良い感じなのになぁ。
0474デフォルトの名無しさん2016/12/12(月) 21:58:06.60ID:HNke9LPW
>>472
ユーザー定義型で済むところにクラスなんて使ったことない
0475デフォルトの名無しさん2016/12/12(月) 23:11:36.90ID:UOaCcZ7S
構造体collectionに入れられないからやっぱり使いどころ少ない
0476デフォルトの名無しさん2016/12/12(月) 23:26:54.93ID:FiQhBLz2
ユーザー定義型って代入はできるくせにByValでは受けられないんだな。
0477デフォルトの名無しさん2016/12/13(火) 21:46:01.65ID:3SM5S2zT
win32apiを使うときは必須だけどな
結構使い方にクセがあるけど
0478デフォルトの名無しさん2016/12/13(火) 22:26:57.67ID:QH1BpzM1
シートにShapeが100個くらい貼り付けてあって
重なっているものもありそういうのは文字が見にくいです。

そのためマクロで重なりを自動的に回避して例えば右下に移動させたいのですがどういうコードを書けばいいでしょうか?
単に2つを比べて移動させると、その移動によってあらたな重なりも生じてしまう可能性も考えなければなりません。
0479デフォルトの名無しさん2016/12/13(火) 22:41:26.99ID:roU5iSXl
>>478
全シェイプを左上から一列に並べるのが一番簡単で早い
0480デフォルトの名無しさん2016/12/13(火) 22:47:02.05ID:QH1BpzM1
>>479
それじゃ困ります。
Shapeはシートのセルの説明みたいなものだからそれぞれのShapeはそのセルの近くに置く必要があります。
0481デフォルトの名無しさん2016/12/13(火) 22:47:13.86ID:jG3FZ5+u
>>478
そもそも なぜそのような状況が発生してしまうのか?
対処療法考えるより 根本原因を改善した方が良いのではないのか
0482デフォルトの名無しさん2016/12/13(火) 22:50:15.43ID:QH1BpzM1
>>481
重なってしまうからです。
ふつうは説明すべきセルは離れ離れだけどたまたま密集していることもあるのです。
0483デフォルトの名無しさん2016/12/13(火) 22:52:49.32ID:nYjosj1h
セルの説明ならコメント機能使えばいいのでは。
0484デフォルトの名無しさん2016/12/13(火) 22:55:30.58ID:jG3FZ5+u
>>482
そもそもとして最初から重ならないように配置すべきで
100個も貼り付けてしまった後で何とかしようとするのが間違い
0485デフォルトの名無しさん2016/12/13(火) 22:59:21.03ID:bhfgIeBn
>>478
セルの位置とシェイプの大きさを取得して
からならない様にシェイプを移動させるコードを書けば良いよ
0486デフォルトの名無しさん2016/12/13(火) 23:30:03.28ID:8Fw4niJC
>>480
そういうのは移動の方向や距離などの条件を細かく決める必要があって
プログラムを作る上で、これが一番面倒で難しい作業であると同時に
それはあなたにしか決めることができない
よって、ここで解決は無理
0487デフォルトの名無しさん2016/12/13(火) 23:57:11.79ID:bDsracPE
重なっている図だけを色を変える処理を入れれば良いだろ。
あとは色の変わっているところだけ手動で位置調整をすれば良い。

全部自動とか全部手動とかこだわるから思考停止になるんだよ。
自動化を一番迅速に楽に実装できる部分だけに絞って効果を最大化することを考えろ。
0488デフォルトの名無しさん2016/12/14(水) 04:18:56.26ID:13eYjjoE
人間よりも精度低いマクロ側で重なり判定とか効率悪そう。
0489デフォルトの名無しさん2016/12/14(水) 11:43:25.11ID:onXTJmaJ
重なり判定自体は出来たはず
ただ、移動とか座標を取得しなきゃいかんし糞ほどめんどくさそうだな
APIいじらないかんでしょたぶん
0490デフォルトの名無しさん2016/12/14(水) 15:53:09.41ID:jk7qaWMV
処理自体は簡単

座標と幅と高さを取得して、重なってたら重なってるObjectの右下に移動させる
これをオブジェクト番号順ではなく座標が左上にある順にひたすらループするだけ

ただしその結果が希望するような見やすい位置になってるかどうかは全く別の話だし
多重ループで処理時間はかなりかかると思われる
0491デフォルトの名無しさん2016/12/14(水) 16:24:12.61ID:KjcwbQ3M
Shape領域を隙間なく詰めたとしても
図形によっては図形間の隙間が結構空いてて結局手動で詰める事になったり
0492デフォルトの名無しさん2016/12/14(水) 20:30:34.17ID:13eYjjoE
シェイプの頂点取得してギリギリのラインを攻める事も出来ない事はないけど、
やろうとするとベジェ曲線のコリジョン判定処理を独自にくみ上げる必要が出てくるし、
要求に応える為の様々なオプションを付けるとすれば割と途方もない規模になるよなぁ。
04934782016/12/14(水) 22:59:05.42ID:4v+aZ1SH
みんな頭悪いね。
結局自分で考えてこうすることにした。

(1)すべてのShapesが重なりがなくなるまで小さくする。
(2)その状態ですべてのShapesをグループ化して1つのShapeにする。
(3)そのグループ化したShapeを先に小さくした分だけ大きくする。

なにごとも天才なら頭の良さとヒラメキでどうにでもなるものだ。
0494デフォルトの名無しさん2016/12/14(水) 23:05:28.53ID:M5SiyZhJ
何も変わらねえじゃん

というか偽物だろw
04954782016/12/14(水) 23:12:34.47ID:4v+aZ1SH
>>494
かさならなくなった時点で1つのShapeにGroup化してるから
そこからいくら大きくしてもかさならないことが保障されている。
0496デフォルトの名無しさん2016/12/14(水) 23:18:31.66ID:M5SiyZhJ
目的のセルから離れるじゃんw
意味ねえw
0497デフォルトの名無しさん2016/12/14(水) 23:24:02.76ID:1EAbcBEm
しかも右下の方にあるオブジェクトほど倍々ゲームで元の位置から離れていくww
0498デフォルトの名無しさん2016/12/14(水) 23:25:16.56ID:4v+aZ1SH
>>496
>>497
縮小するときは左上の座標で言うと(0 , 0)を焦点として縮小するから
元の位置とほぼ同じになる。
0499デフォルトの名無しさん2016/12/14(水) 23:30:28.90ID:M5SiyZhJ
再配置するよりも一旦全てのシェイプを非表示にして特定のキーを押すごとに
1つずつ順繰りに表示するようにした方がいい気がする
0500デフォルトの名無しさん2016/12/15(木) 00:01:54.49ID:pjYBUiDU
画像やオートシェイプがスプライト並みに動いたらなぁ・・。
ちょっと動くだけでチラチラチラチラチラチラチララチラチラチラチララチラチラチラチラ

くそっ。
0501デフォルトの名無しさん2016/12/15(木) 00:10:12.59ID:RCWBglWc
>>498
君が元質問者で それで目的達成すると言うなら
それでいいんじゃね

ただ
>>(1)すべてのShapesが重なりがなくなるまで小さくする
この時点で 各Shapesの縮小率がいっしょならいいね
違うと (3)どうするんだろ? という疑問が残るが
もしかして 最大の縮小率に合わせるのか?
まどうでもいいけど 色々破綻しそうな理論ではある
0502デフォルトの名無しさん2016/12/15(木) 00:12:38.37ID:HWr5hmeF
エクセルは通常の使い方でも更新されない場所が出たりと、映像面に弱いんだよな。
多人数で好きなように拡張していく形式の最終形って感じがするね。
0503デフォルトの名無しさん2016/12/15(木) 06:58:24.42ID:U+Bcsm2o
>>498
嘘つきバレバレ
やってみたけどならない
縮小はそれぞれのシェイプの位置で行われるのに、グループ化して拡大したら位置関係も拡大されるんだからなるわけない
アホらしい
0504デフォルトの名無しさん2016/12/15(木) 07:19:51.54ID:IMweaaWq
始めから釣り臭さがプンプンしてたから
0505デフォルトの名無しさん2016/12/15(木) 09:09:02.75ID:JpPj6O8e
シェイプ関連はクソめんどくさそうだからvbaでやりたくないってかエクセルにシェイプ使いたくない
つーか、シェイプの処理を自動化しなきゃいかん時点でかなり破綻してるような
どういう運用の時発生するんだろう
0506デフォルトの名無しさん2016/12/15(木) 10:27:00.20ID:hyaJa9BR
>映像面に弱いんだよな。

Excelをそういう方面に使うほうが間違っている
0507デフォルトの名無しさん2016/12/15(木) 16:13:55.04ID:14l+W1u0
www
0508デフォルトの名無しさん2016/12/15(木) 18:49:57.97ID:RKFY0LMW
方眼紙は一発で作れるから間違ってないよね
0509デフォルトの名無しさん2016/12/15(木) 21:09:08.62ID:pjYBUiDU
確か2013あたりだったか、オートシェイプを3D化する機能が付いたけど、
それならポリゴンばりばりでも良いと思うんですよ。

目標は秒間300万ポリゴン
0510デフォルトの名無しさん2016/12/15(木) 23:19:47.37ID:22t341mU
アップロードされる画像をIE操作でクリックしたいのですが、画像の番号が一致しなかった場合(みつからなかった場合)
オブジェクトエラー424となってしまいます。
エラー自動的に回避をして再度、この処理を繰り返すことは可能なのでしょうか?

For Each objTag In objIE.document.getElementsByTagName(
0511デフォルトの名無しさん2016/12/15(木) 23:21:36.47ID:22t341mU
For Each objTag In objIE.document.getElementsByTagName("img")
If InStr(objTag.outerHTML, "探す画像番号") > 0 Then
objTag.Click

このあとに書くべきコード(エラー回避して繰り返し実行)
どなたか教えていただけますでしょうか。
よろしくお願い致します。
0512デフォルトの名無しさん2016/12/16(金) 00:08:39.42ID:gLG6TFVG
エラーのdescriptionは?
0513デフォルトの名無しさん2016/12/16(金) 00:14:42.49ID:YdJc2ZoQ
どういう条件がそろったときにとのコードでどんなエラーが出るのかを特定しよう
5w1hな
0514デフォルトの名無しさん2016/12/16(金) 20:16:25.06ID:YsuG8/qs
>>511
そこを関数にして、関数の中でOn Errorでエラーをキャッチして、
そのエラーの状態を戻り値なり参照渡しの引数なりで関数の外に受け渡して、
それを見て対象のエラーならDo WhileやDo Until、
回数を制限するならFor Nextでもいいけど、
そんなんでループさせてやるのが楽だと思う。
0515デフォルトの名無しさん2016/12/16(金) 21:56:20.80ID:sih3dP1I
エラーを握りつぶして問題ないならon error resume nextしちゃえばいい
ただ、エラーになる原因突き止めてそうならないようにちゃんとするべきだと思う
0516デフォルトの名無しさん2016/12/16(金) 23:24:10.89ID:ab20H/kd
On Error Resume Next
良い響きだ。
まじめに処理書くのが面倒な時の、魔法の言葉。
0517デフォルトの名無しさん2016/12/16(金) 23:46:16.14ID:ojLHIDWP
5000行ぐらいある処理の最初に書いておけばいいよ
0518デフォルトの名無しさん2016/12/17(土) 00:36:25.87ID:WZMzwZtI
エラーメッセージは真面目に書かないと駄目であるか。
本当は「エロー」って書きたいのに、
会社のやつだから、仕方なく「エラー」って書いてる、小心者の私。
0519デフォルトの名無しさん2016/12/17(土) 06:49:51.36ID:RJpi1Tn9
セルA1にシート名を書いておき、
SHEETS(RANGE(”A1”)).SELECTでその名前のシートをアクティブにできるかと思いやったんですがダメなんですがどう書けばいいのですか
0520デフォルトの名無しさん2016/12/17(土) 06:57:46.39ID:PQF9A4Zq
Sheets([A1].Value).select
ってやってできたけど
0521デフォルトの名無しさん2016/12/17(土) 07:07:21.64ID:RJpi1Tn9
>>520
バリューが必要ですか、サンクス
0522デフォルトの名無しさん2016/12/17(土) 08:15:11.39ID:nEjxq6yb
sheetsの引数(でいいのかこれ)って文字列指定じゃないんだな
数値とか日付を考慮してのことか?
0523デフォルトの名無しさん2016/12/17(土) 08:40:25.86ID:v5A0SLHP
>>522
シートのプロパテイ見てみろよ。オブジェクト名を指定するんだよ
0524デフォルトの名無しさん2016/12/17(土) 09:38:44.05ID:s55gxQDX
>>522
数値はインデックス番号になる
日付はやったことないけど文字列に変換するんじゃね?

>>523
文字列と数値の両方を受けるためにオブジェクトになってるだけ
0525デフォルトの名無しさん2016/12/17(土) 12:28:46.23ID:nEjxq6yb
>>523
まあなんというか、暗黙的に受け取らないんだなって思っただけ
0526デフォルトの名無しさん2016/12/17(土) 12:41:39.57ID:w1J67MDz
20日分誰


か

http://qiita.com/advent-calendar/2016/vb
0527デフォルトの名無しさん2016/12/17(土) 18:16:35.28ID:0wFiop+F
かゆうま
0528デフォルトの名無しさん2016/12/17(土) 20:17:25.37ID:WZMzwZtI
セルがこんな風になったら格好いいのにな。
 __________
 \  \  \  \  \
   | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄|
   |__|__|__|__|
   \  \  \  \  \
    | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄|
    |__|__|__|__|
    /   /   /   /   /
   /   /   /   /   /
   | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄|
   |__|__|__|__|
 /  /  /  /  /
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0529デフォルトの名無しさん2016/12/17(土) 21:12:59.59ID:pr4QSNov
バグ増えそうだ
0530デフォルトの名無しさん2016/12/17(土) 21:13:10.76ID:ymMZ5Rhw
>>528
見づらい
0531デフォルトの名無しさん2016/12/17(土) 21:42:53.62ID:7cqgcho+
Sub アクションクエリ1()
Dim myCon As ADODB.Connection, myCmd As ADODB.Command, myCmb As ADODB.Command, FileName As String

Set myCon = New ADODB.Connection
Set myCmd = New ADODB.Command
Set myCmb = New ADODB.Command

FileName = ThisWorkbook.Path & "\\○○"
myCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName

With myCmd
  .ActiveConnection = myCon
  .CommandText = "○○"   '仕様書アクションクエリを指定
  .Execute                      'クエリを実行
End With

With myCmb
  .ActiveConnection = myCon
  .CommandText = "○○"   '仕様書アクションクエリを指定
  .Execute                      'クエリを実行
End With


Set myCmd = Nothing
myCon.Close: Set myCon = Nothing

End Sub
0532デフォルトの名無しさん2016/12/17(土) 21:43:17.48ID:7cqgcho+
ExcelマクロでACCESSのアクションクエリを実行するためにコードを組んだのですが、
Excelを立ち上げ、参照設定を変更し、上記のコードを貼り付けるとクエリが実行できますが、
次にExcelファイルを開いてコードをはしらせるとオートメーションエラーが出てしまいます。
解決策をよろしくお願いします。
0533デフォルトの名無しさん2016/12/17(土) 22:14:15.09ID:rR+vbhBv
>>532
どこでエラーが出るのか
コネクションが出来てないとか?
0534デフォルトの名無しさん2016/12/17(土) 22:18:28.10ID:7cqgcho+
>>533
myCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName
ここでエラーになります。
0535デフォルトの名無しさん2016/12/17(土) 22:24:05.96ID:7cqgcho+
>>533
すみません。
初心者でコネクションがよくわかりません。
0536デフォルトの名無しさん2016/12/17(土) 22:50:10.37ID:rR+vbhBv
>>534
そこがコネクションを張ってるところ
アクセスを終了してないからかも
タスクマネージャとかでプロセスを見てみたら?
0537デフォルトの名無しさん2016/12/17(土) 23:11:50.27ID:7cqgcho+
>>536
見てみます。
ありがとうございます
0538デフォルトの名無しさん2016/12/18(日) 09:26:31.47ID:rplAK2uh
アクセスとか持ってないし、データベースの事なんてサッパリ分からないけど、
ファイル名の指定で\が2つ続けてあるのはそれで合ってるの?
エクセル使っててそういうファイル名を使った事がないんだけど。
0539デフォルトの名無しさん2016/12/18(日) 10:31:41.68ID:SPvC2mfN
\\は、普通はネットワークだけど、
パスの後に\\ってのは聞いたことないな。
0540デフォルトの名無しさん2016/12/18(日) 10:58:00.23ID:uFjJW9PE
ACCESSは自分では持ってなかったけどSQL Server Expeessをダウンロードしたら普通に使えた。
ACCESS の存在意義的にどうなんだろ。
0541デフォルトの名無しさん2016/12/18(日) 11:11:31.54ID:x5kxwi+u
>>540
SQLは単なるデータベース
Accessはデータベースに便利なツールを含む統合環境
0542デフォルトの名無しさん2016/12/18(日) 11:50:52.45ID:RI1Pajt6
AccessはMS自身が開発嫌がってる的な話あるからなぁ。
早くユーザーをSQL Serverへ移したいんじゃないのかな。
0543デフォルトの名無しさん2016/12/18(日) 11:54:26.43ID:uFjJW9PE
Management Studioが、って書こうとしてなぜか起動しないことに気付いた。
もう一度SSMS(16.5.1)ダウンロードしてるところw
0544デフォルトの名無しさん2016/12/18(日) 14:40:35.54ID:JzZ8hCKj
Accessほんとうんちだからやめてくれた方がいいわ
同時にいじったら壊れるってなんやねん
0545デフォルトの名無しさん2016/12/18(日) 15:21:57.98ID:V0Dt9dCT
>>544
個人向けの設計だからじゃね
その代わり手軽に使える

本格的にやるならORACLE, SQL SERVER, POSTGRESQL, MYSQLとか使うんじゃね
0546デフォルトの名無しさん2016/12/18(日) 16:20:53.49ID:JzZ8hCKj
>>545
officeしか使えない環境ってのがあるのよ
まあでもなくなったら代替策すら検討されなさそうだけど
AccessVBAも何となく好きじゃないわ
0547デフォルトの名無しさん2016/12/18(日) 16:54:57.93ID:uFjJW9PE
>>546
クライアントとしてSQL Serverを参照するだけならOfficeのみでいけるけどね
0548デフォルトの名無しさん2016/12/18(日) 17:07:35.96ID:F6KIg1cK
Excel2010使ってるけどわからなくなっちゃった、誰か教えて。

【したいこと】
大量にあるセルのうち一部だけ移動

【例】
| A | B | C | D | E |
-----------------------
1 | |や |あ | | |
-----------------------
2 | | |お |は |よ |
-----------------------
3 | | |マ |リ |オ |
-----------------------
4 | | | | | |
-----------------------
5 |○ |× |△ | | |
があったとき、
B1の「や」とC1の「あ」を1文字左へ、
A5,B5,c5の○×△を1文字右へずらしたい。(2−4行目は変更なし)

誰か教えてくださいお願いします
0549デフォルトの名無しさん2016/12/18(日) 17:50:32.80ID:CFuzcgv7
>>548
マクロの記録でいいんじゃね?
0550デフォルトの名無しさん2016/12/18(日) 17:57:03.28ID:708kAp5E
>>548
なにその方眼紙状態www

ループ処理して
A/B列両方に何か入ってたら A列以降を Cut & Paste で一セル右へ
A列空でB列に何か入ってたら B列以降を Cut & Paste で一セル左へ
これでいいんじゃね?

Cut & Paste はマクロ記録すれば分る
0551デフォルトの名無しさん2016/12/18(日) 18:50:46.14ID:JzZ8hCKj
>>547
そういうもんなの?
いじれるなら移行したいわ
0552デフォルトの名無しさん2016/12/18(日) 18:52:27.70ID:JzZ8hCKj
>>548
条件があやふやすぎる
単純にアドレス指定のコピペでダメな理由がある?
0553デフォルトの名無しさん2016/12/18(日) 19:22:26.04ID:SPvC2mfN
全部配列に入れて、
ループとIFで処理して、
結果を貼り付け。
0554デフォルトの名無しさん2016/12/18(日) 20:24:26.33ID:uFjJW9PE
>>553
shiftとかrotateとかそういうやつね
0555デフォルトの名無しさん2016/12/18(日) 21:34:55.78ID:CFuzcgv7
>>551
SQL-Server にアクセスしたいだけなら Office なんてなくても PowerShell でもできるで
0556デフォルトの名無しさん2016/12/19(月) 08:26:52.28ID:G23cuE2I
>>555
パワーシェルも使えんぞ(憤怒)
0557デフォルトの名無しさん2016/12/19(月) 08:36:06.28ID:s4WNerU2
>>556
お前の能力のなさをこんなところで開陳されても困る
0558デフォルトの名無しさん2016/12/19(月) 10:10:32.47ID:FVK2IiuV
>>557
権限の話じゃね?
0559デフォルトの名無しさん2016/12/19(月) 12:53:26.86ID:s4WNerU2
>>558
PowerShell まで禁止してる所があるの?
0560デフォルトの名無しさん2016/12/19(月) 13:00:35.38ID:K4KX9bpo
>>559
されとるよ
0561デフォルトの名無しさん2016/12/19(月) 14:08:44.01ID:f+ROaaHN
chocolatyも使えないとは不便だな
0562デフォルトの名無しさん2016/12/19(月) 15:57:02.06ID:FVK2IiuV
exeやdllをダウソして動かすだけならOKだけどインストールが発生するのは要申請(無料で著名ならほぼOK)、Powershellダメってのが一般的かと。
0563デフォルトの名無しさん2016/12/19(月) 17:47:43.58ID:nkfgQpHK
>>560
マジで?
そりゃ知らんかった
0564デフォルトの名無しさん2016/12/19(月) 17:49:40.84ID:nkfgQpHK
>>562
> exeやdllをダウソして動かすだけならOK
なのに PowerShell はダメなの?
すごく不思議なポリシーやね
0565デフォルトの名無しさん2016/12/19(月) 17:51:59.31ID:AHYBAmxP
>>563
なんも使えないからせめて標準でついてるPowershell勉強したろ!って思ったら弾かれて涙
0566デフォルトの名無しさん2016/12/19(月) 19:03:53.21ID:bgqj3/OB
自宅のPCでやればいいんじゃね?
0567デフォルトの名無しさん2016/12/19(月) 20:05:16.09ID:hsT/+yfz
Windowsのデフォルト機能すら使えないのはしんどい

はじかれた理由は知りたいね
モノを知らずに外から取り入れなきゃならないと感じてしまったためにダメって言われたのならまだ巻き返せる
0568デフォルトの名無しさん2016/12/19(月) 20:17:52.13ID:vRLCGPAT
定型的な作業にしかパソコン使わないならOSを自社開発できそう。
そしてそれくらい出来るヤツがいた方がセキュリティ的には安心。
0569デフォルトの名無しさん2016/12/19(月) 20:41:16.66ID:x+r4kjDE
インストールはモンどう無用で禁止だなうちは
あとタスクバーの位置すら変えられないしコマンドプロンプトも起動できない
0570デフォルトの名無しさん2016/12/19(月) 20:54:30.15ID:fyiPi9B4
>>568
自社でしか使わないOSを開発してメリットあるの?
他社と情報交換とかしないの?
0571デフォルトの名無しさん2016/12/19(月) 20:54:30.43ID:4V94P68w
>>567
でっかい会社の子会社だからガチガチなのよ
変なところで
0572デフォルトの名無しさん2016/12/19(月) 20:57:05.82ID:fyiPi9B4
>>571
ちゃんと理由とか名目があるだろう
子会社→powershellを使えない
は論理的ではない
0573デフォルトの名無しさん2016/12/19(月) 20:59:30.47ID:4V94P68w
>>572
いや知らんがな
権限無いもんは無い
0574デフォルトの名無しさん2016/12/19(月) 21:04:00.66ID:fyiPi9B4
>>573
何の説明もない会社なの?
自分が知らないだけじゃない?
0575デフォルトの名無しさん2016/12/19(月) 21:06:13.75ID:FVK2IiuV
いんたーねっつ環境が気になる。
どの程度見られるの?
0576デフォルトの名無しさん2016/12/19(月) 21:07:23.27ID:I1HgbcB8
PSは実行ポリシーの事知らんくて当時???状態だったな
0577デフォルトの名無しさん2016/12/19(月) 21:10:31.69ID:4V94P68w
インターネッツ見られる端末はCドラがいじれん
もうひとつの端末はインターネッツが見れん
端末監視されてるから権限いじったら間違いなく怒られるだろ
0578デフォルトの名無しさん2016/12/19(月) 21:14:01.84ID:vRLCGPAT
>>570
他社との情報交換にOSの違いがなんか影響するのか?
0579デフォルトの名無しさん2016/12/19(月) 21:20:10.86ID:oMD81TTK
それにしてもExcelVBAの話はどこに消えたのだろう
0580デフォルトの名無しさん2016/12/19(月) 21:29:24.02ID:fyiPi9B4
>>578
オフィスが動かなくて市役所のLinux利用が中止になったりしただろ

でメリットあるの?
0581デフォルトの名無しさん2016/12/19(月) 21:38:41.45ID:vRLCGPAT
>>580
会社として意図しない動作を抑制する事が出来て比較的簡単にセキュリティ性を向上させられるというメリットがある。
銀行とか独自OSだし、セキュリティが最重要視される所だと割と一般的なアプローチだと思うよ。
もちろん技術者次第ではあるんだけど、会社の業務が非常に限定的ならそこまで金掛けずに開発出来そう。

そして情報交換とアプリケーションが動くかどうかは別問題だろ。
0582デフォルトの名無しさん2016/12/19(月) 21:49:55.52ID:FVK2IiuV
日本のホワイトカラーの生産性がどうたらこうたら
0583デフォルトの名無しさん2016/12/19(月) 21:53:58.31ID:WICqKmJg
情報流出による損失がなんたらかんたら
0584デフォルトの名無しさん2016/12/19(月) 21:58:07.34ID:fyiPi9B4
>>581
銀行のどこが何て言うOS?
0585デフォルトの名無しさん2016/12/19(月) 22:00:48.29ID:FVK2IiuV
PCと汎用機の混同がほげふが
0586デフォルトの名無しさん2016/12/19(月) 22:02:28.01ID:z+7jE5Cs
インタネットはほぼ見れない
ブログ系サービスは全滅
githubもスタックオーバーフローも当然見れない
いちいちググりながらじゃないとコード書けないやつは生きていけない業界です。
0587デフォルトの名無しさん2016/12/19(月) 22:12:13.67ID:FVK2IiuV
オフィス環境と開発環境の話はさすがにごっちゃにするとワケワカンネ
0588デフォルトの名無しさん2016/12/19(月) 22:25:59.65ID:dOY4oZJl
>>586
じゃ俺ダメだわw
0589デフォルトの名無しさん2016/12/19(月) 22:53:15.00ID:OpihZzPh
ところでwindows10でコマンドプロンプトがpowershellに変わるとか


fossBytesに11月19日(米国時間)に掲載された記事「Microsoft Replaces Command
Prompt With PowerShell As Windows 10 Default Shell」が、Windows 10の
デフォルトシェルがコマンドプロンプトからPowerShellに変更されると伝えた。
Windows 10 Insider Build 14971ですでに入れ替えが実施されたと説明がある。
http://news.mynavi.jp/news/2016/11/21/374/

shell関数でプログラムを走らせるのって正常に出来るの?
こっちはwin7しか持って無く、これから新しいpcはwin10にしようかと
思ってたとこなんで、教えて
0590デフォルトの名無しさん2016/12/19(月) 23:05:05.43ID:I1HgbcB8
コマンドプロンプトがメニューから多少見つけ難くなる程度でほぼ何も変わらんよ
0591デフォルトの名無しさん2016/12/19(月) 23:13:58.13ID:OpihZzPh
ありがと。(OSの話になってしまうけど、)win7からだと相当に使い勝手が変わりそうで^^;
0592デフォルトの名無しさん2016/12/19(月) 23:47:31.90ID:Rjs2eiTp
変な制限かけてる会社多いのな。
ウチもだけど。
制限かけまくりで、仕事非効率にしてどうすんのって思うけど。
0593デフォルトの名無しさん2016/12/20(火) 07:36:16.56ID:w8JR6Zsp
不思議なことに最新技術を提供しているはずの最前線で扱ってるものは古かったりする
0594デフォルトの名無しさん2016/12/20(火) 08:16:39.42ID:kvfnt0Ie
>>593
提供してる側は最新が最善でないことを知ってるから...
0595デフォルトの名無しさん2016/12/20(火) 08:24:05.09ID:LAl9nS1N
客に売りつけるのは最新でも自分が使うのは少し古くて安全が確認できてる物に決まってるやんか
0596デフォルトの名無しさん2016/12/20(火) 09:03:25.97ID:JmB9QU54
そんな事情だったのか
怖い
0597デフォルトの名無しさん2016/12/20(火) 09:38:01.86ID:+L17/HsE
アーマライトM-16カスタム
0598デフォルトの名無しさん2016/12/21(水) 09:11:04.68ID:peeNl1w2
江戸時代の小咄思い出した

夜泣き蕎麦屋が、毎晩夜中に夜食を食べに家に戻る
女房 「夜食くらい自分で蕎麦作って食べればいいじゃない」
そばや「こんなもん!汚くて食えるか」
0599デフォルトの名無しさん2016/12/21(水) 10:40:03.67ID:bYQ3jOYA
最近クラスモジュールで色々書いてるんだけど、これって迷惑なんかな
一度使い出すと便利すぎて戻れんのだが
0600デフォルトの名無しさん2016/12/21(水) 10:52:24.77ID:DgPf7ezo
迷惑じゃないな
0601デフォルトの名無しさん2016/12/21(水) 11:31:21.40ID:vsqlMPnS
利益や回転を考えなきゃいけないから、売り物と自分用で差が付くのは当たり前の話なのに
0602デフォルトの名無しさん2016/12/21(水) 12:10:30.73ID:I5jJlidF
>>599
迷惑って例えば?
0603デフォルトの名無しさん2016/12/21(水) 19:44:28.31ID:lvWf/WQu
>>599
コモンライブラリとして扱うと
生産性向上
はうあ快感
0604デフォルトの名無しさん2016/12/21(水) 20:01:02.97ID:I5jJlidF
アドインにすると外から直接New出来ないの地味に不便じゃない?
0605デフォルトの名無しさん2016/12/21(水) 20:10:06.06ID:wT+HxCxO
VBAのクラスはなんちゃってオブジェクト志向だけど無いよりはマシだわな
0606デフォルトの名無しさん2016/12/21(水) 21:11:11.08ID:IjHRd5MJ
>>602
スタティックおじさんが多いとか
0607デフォルトの名無しさん2016/12/21(水) 21:38:53.02ID:DwxfAhsu
一周してオブジェクトおじさんの方がウザいかも
0608デフォルトの名無しさん2016/12/21(水) 21:41:50.60ID:IjHRd5MJ
>>607
ことVBAならそうやな
0609デフォルトの名無しさん2016/12/21(水) 22:20:14.61ID:vO1nUoqV
デバッグ用のログを作るのにクラスを活用してるわ。
コンストラクタが使えればもっと綺麗に書けるのになぁという思いが強い。
0610デフォルトの名無しさん2016/12/21(水) 22:31:59.30ID:MSzLf9x6
>>609
俺もログはクラスにしてる
> コンストラクタが使えればもっと綺麗に書けるのになぁという思いが強い。
ほんそれ
0611デフォルトの名無しさん2016/12/21(水) 23:05:52.60ID:R5AsjT35
initializeメソッドってなかったっけ?
0612デフォルトの名無しさん2016/12/21(水) 23:13:37.01ID:IjHRd5MJ
>>611
引数なし!
0613デフォルトの名無しさん2016/12/21(水) 23:17:59.23ID:iSBY4/tK
その引数がないってのがどういう状況なのかわからん。
標準モジュール的に使ったら使えたが・・。
0614デフォルトの名無しさん2016/12/21(水) 23:21:07.13ID:DwxfAhsu
>>613
文字通り引数がない
だからいろんな値で初期化するなんてことができない
0615デフォルトの名無しさん2016/12/21(水) 23:21:36.92ID:IjHRd5MJ
>>613
なんだったか忘れたが引数なくて困ったことがあったぞ
0616デフォルトの名無しさん2016/12/21(水) 23:29:08.86ID:R5AsjT35
メソッドオーバーロードが無いからな

VBAは.net化しないのかねえ?
0617デフォルトの名無しさん2016/12/21(水) 23:37:17.48ID:oYfzfznv
VSTOがあるからしないんじゃない
組み込みで.NETである必要が無い
0618デフォルトの名無しさん2016/12/21(水) 23:41:45.77ID:R5AsjT35
pythonとかluaも使えたらいいのにな
VBAは残していいから
0619デフォルトの名無しさん2016/12/21(水) 23:47:54.69ID:DwxfAhsu
VBAがなくなったら一大事だろうね
0620デフォルトの名無しさん2016/12/21(水) 23:50:10.63ID:y5LGh6e4
今はjavascript APIが本命じゃまいか
0621デフォルトの名無しさん2016/12/21(水) 23:58:57.65ID:aMg6pWuy
毎度毎度
>VBAは.net化しないのかねえ?
みたいな奴多いな

君らみたいなプログラマばっかりじゃないんだよ。
あれがドラスティックな変化起こしたら困る人間のほうが圧倒的に多いわ(想像だけどw
0622デフォルトの名無しさん2016/12/22(木) 00:03:54.04ID:1eZ5r9p6
jsは自由すぎなイメージがあって苦手だなあ
0623デフォルトの名無しさん2016/12/22(木) 00:08:17.90ID:tM2Q7LY3
>>619
データ加工業務が多い中小企業が軒並み壊滅するな
0624デフォルトの名無しさん2016/12/22(木) 00:21:24.55ID:AbkOolfU
VBAは規格として古すぎる上に環境上、他の言語よりも他人が読む時の配慮を意識しなきゃならない場合が多いから、
簡素な書き方が出来るあれやこれやが自然と欲しくなってくる。

VBAが〜〜っていうよりはVBEが複数の言語を扱えるようになればいいんだけどね。
0625デフォルトの名無しさん2016/12/22(木) 00:27:20.52ID:blvnx7Ig
>>624
VBEはエディタでしょ
テキストエディタで書いたのをインポートしても動くよ
コーディングするだけならテキストエディタでできる
0626デフォルトの名無しさん2016/12/22(木) 04:15:45.61ID:Ez/LeE21
他人に配慮して書こう→簡素な書き方で→VBAの限界→他の言語で→メジャーなスクリプト言語のpythonかRubyで→メンテできる人が激減

なんか本末転倒のような気がする
0627デフォルトの名無しさん2016/12/22(木) 04:27:16.92ID:0Mrlmz5Y
VBAは残した状態で他の言語も使えるといいんだよなぁ。
0628デフォルトの名無しさん2016/12/22(木) 06:13:53.88ID:mVBC6l07
オープンオフィスの方は複数のスクリプトに対応してるから不可能ではなさそうなんだけどな
0629デフォルトの名無しさん2016/12/22(木) 11:53:30.86ID:743PRFN5
COM使える言語ならVBAと同じことできるでしょ
何もOfficeの上で動かす必要ないし
0630デフォルトの名無しさん2016/12/22(木) 12:02:40.24ID:uTQf0x1y
つまりWindows標準でjavascriptやらpythonやらruby載せてくれれば良い
0631デフォルトの名無しさん2016/12/22(木) 12:55:28.31ID:YVr1LIe6
>>629
C# から COM 使うのが異常に面倒だから
System.Runtime.InteropServices.Marsha l.ReleaseComObject(System.Object) をちゃんと隠蔽してくれよ...
なのでずっと vbs 使ってたけど最近 PowerShell に移行した
0632デフォルトの名無しさん2016/12/22(木) 14:28:19.55ID:l2ODmaOL
A1セルにカーソルを合わせるとA140とA280に入力されている数字や文字列がコメントとして表示されるようにすることは可能ですか?
既存の機能でできそうにもなく、VBAではどうなのか調べてみても見つからなかったのでこちらで質問しました。
0633デフォルトの名無しさん2016/12/22(木) 14:35:16.47ID:u2SDU6lK
>>632
AddCommentメソッド
0634デフォルトの名無しさん2016/12/22(木) 22:00:01.57ID:ijyoU16T
VBAは相当かけるのにインターフェイスを作るセンスが絶望的に欠けている人がうちの会社のマクロ開発担当で地獄や
頼まんで自分で作れるからいいけど、既存の社内ツールとか使うのすごいストレス
0635デフォルトの名無しさん2016/12/22(木) 22:01:34.48ID:IkDwdq0/
複数(大量の)セル範囲を名前(Name)定義しているときに、
(Name).RefersToRangeを呼び出すと
実行時エラーになるんだけど、
セル範囲の個数等に制限があるかどうか知っている人います?
0636デフォルトの名無しさん2016/12/22(木) 22:17:56.05ID:AbkOolfU
>>634
インターフェースってフォームとかのGUIの事? それ現場と切り離してない?
実際に運用するヤツの隣で作業させれば嫌でも分かりやすい形を目指すようになるぞ。
なんせ使い勝手が悪いと「これ分からないんですけど」って質問を使うたびにされる羽目になるからな!(体験談

>>635
参照範囲が#REF!とかになってない?
0637デフォルトの名無しさん2016/12/22(木) 22:25:00.49ID:IkDwdq0/
>>636
参照範囲に#REF!はないです。
ただ、離れた複数のセルを指定しています。
(例: A1,B2,D2:E4,....)
Rangeの引数に制限があるので、その影響かなと思っていますが、
参考資料がなく断定できないのです。
0638デフォルトの名無しさん2016/12/22(木) 23:16:07.66ID:PBpENT/R
300列x3000行くらいで全セル数値が入っているシートがあって
全セルに重複がないことを確認したいんだけど
Dictionaryに突っ込んでチェックするしかないかな?
出来ればワークシート関数でできるとありがたいのだが
0639デフォルトの名無しさん2016/12/22(木) 23:19:27.23ID:AbkOolfU
>>637
Sub test()
Dim r As Range
Set r = Cells(1, 1)
For i& = 2 To 1024 Step 2
Set r = Union(r, Cells(i, 1))
r.Name = "test"
Debug.Print r.Count
Debug.Print ThisWorkbook.Names("test").RefersTo
Debug.Print ThisWorkbook.Names("test").RefersToRange.Address
Next
End Sub

で試してみたら参照セルが18を超えるとダメっぽいね。
0640デフォルトの名無しさん2016/12/22(木) 23:42:27.19ID:1gi9RDSs
>>638
CSV→SED|uniqなら一瞬で結果が出せるんだけどなあ
0641デフォルトの名無しさん2016/12/23(金) 00:20:23.38ID:Lyl7nXDN
>>638
ワークシート関数とか読み難くなるだけだろ
マクロでサクっと書いてシートは原文ママが理想
いっそマクロはvbsで動くように書いてシートと分離しておくとメンテもし易い
0642デフォルトの名無しさん2016/12/23(金) 00:25:49.34ID:vg49py8A
>>638
隣のシートの同番地でCountifとか?
0643デフォルトの名無しさん2016/12/23(金) 00:39:39.44ID:KgePRwKX
重複があったらその箇所をチェックしたいってんなら基本的にちからわざになるんじゃないのか
重複の有無だけならエクセルの機能のやつでバリアントの配列にいれてゴニョゴニョできそうな気がするけど試してない
0644デフォルトの名無しさん2016/12/23(金) 00:48:22.47ID:qpIamhkn
>>638
条件付き書式の「重複する値」をマクロで記録して
使い回すじゃダメなの
0645デフォルトの名無しさん2016/12/23(金) 00:59:18.52ID:zNUIuAUA
>>638
1列にしてからソートして隣との差がゼロにならないことを確認するくらいかなあ...
06466382016/12/23(金) 01:16:59.24ID:sWtCGeNB
みなさまありがとうございます。
今回は>>640さん、>>645さんの案でいけそうです。
sedで縦にできるのかな
0647デフォルトの名無しさん2016/12/23(金) 04:37:08.98ID:jiSEHcxr
xargs で、1行5列を、5行1列に出来るのかな?

区切り文字は、データに絶対に含まれない、タブ文字などの方が、誤動作しなくていいかも
0648デフォルトの名無しさん2016/12/23(金) 05:47:25.72ID:XuyY8bd+
>>638
重複の削除をマクロの記録する
0649デフォルトの名無しさん2016/12/23(金) 05:50:25.46ID:XuyY8bd+
>>647
worksheetfunction.transpose()で出来るのでは?
0650デフォルトの名無しさん2016/12/23(金) 10:36:53.32ID:CrN1xF7/
最近vbaを始めたものだがイマイチ、クラス化のメリットがわからない
アクセスvbaのレコードセット的なクラスを作ってみたけど
普通のモジュールで対応出来るような気がするし
0651デフォルトの名無しさん2016/12/23(金) 11:38:09.00ID:42pskRy9
>>650
気持ちはわかる
そして対応出来てしまう。

両方の経験を積むと
じわじわくる

dbに関する処理をクラスに
まとめて便利に使ってる。
0652デフォルトの名無しさん2016/12/23(金) 11:38:39.76ID:UkyQFfHw
>>650
オブジェクトが自身の状態を持つ
オブジェクトを複数使うシチュエーションがある

両方満たしていたらクラス化のメリットは大いに感じられるはずだと思う。
そうでなければあまりメリットがないこともあるかも。
0653デフォルトの名無しさん2016/12/23(金) 11:39:20.57ID:LpkEeXbt
>>614
>>615
う〜ん、やっぱわからん。
標準モジュールからクラスモジュールに値を渡せればいいんでしょ?
0654デフォルトの名無しさん2016/12/23(金) 11:42:16.93ID:LpkEeXbt
>>650
俺もよくわからん。
標準モジュール側が楽になったのはわかる。
でもクラスモジュール側が面倒くさい。
0655デフォルトの名無しさん2016/12/23(金) 11:51:42.70ID:UkyQFfHw
>>653
set Obj = New myClass(1)
などといった書き方ができない、っていう意味でしょ

set Obj = New myClass
Obj.pineApplePen = 1
なんて書くのがイヤだと
0656デフォルトの名無しさん2016/12/23(金) 12:13:30.92ID:CrN1xF7/
確かにクラスで書くとコードがかなり綺麗になるのは便利だし
他のvbaでの共有できたりして
シートのコピーとかではすごい捗るのは確かだが
使いまくるとクラスがモジュールが増えてくのが難点だなあ
後は会社じゃ俺以外クラスがわからんらしい
0657デフォルトの名無しさん2016/12/23(金) 12:29:42.91ID:KLz8a+9a
標準モジュールに書いたコードなんて所詮書捨てになりがちじゃないか?
クラスにキレイにまとめとけば使い回しが楽
0658デフォルトの名無しさん2016/12/23(金) 13:03:28.04ID:roeigQor
>>653
Newするときにクラス初期化するでしょ
そんときに渡したい値があったりするでしょ
たまにあるんだよ
具体例は使えないから忘れたよw
0659デフォルトの名無しさん2016/12/23(金) 13:05:02.68ID:kPjVlfxv
>>639
同じようなerrorがでて、おそらくRefersToの文字長が制限なんじゃないの
正確な制限は255より短いようだけど内部で何かしらもっているからじゃないの
っていうのが以下ページでQAされていました。
Excel VBA: Named range can't be assigned to range object
MSDNとかに説明があれば判定できるのになあ。
0660デフォルトの名無しさん2016/12/23(金) 13:08:18.39ID:roeigQor
標準モジュールだと管理が雑になりがちだし、感覚的に機能ごとにしっかりまとめる意識が出てくるよ
大抵のことは標準モジュールでできるんだけど、手続き的に書くとちょっとした変更がダルいし
0661デフォルトの名無しさん2016/12/23(金) 13:13:29.89ID:XuyY8bd+
>>658
どうしても渡したいならシートのセル使えばよくない?
0662デフォルトの名無しさん2016/12/23(金) 13:19:59.09ID:roeigQor
>>661
気持ち悪い感じがね
0663デフォルトの名無しさん2016/12/23(金) 13:20:33.35ID:CrN1xF7/
あとクラスはサイトと参考書籍が皆無に近い
0664デフォルトの名無しさん2016/12/23(金) 13:24:35.34ID:roeigQor
>>663
三ヶ所くらい使えるサイトあるな
書籍はほぼないから、オブジェクト指向関連の本を読んでVBAに落とすしかない
ついでに他言語勉強するのが一番いいよね
0665デフォルトの名無しさん2016/12/23(金) 13:26:28.32ID:zNUIuAUA
>>661
それだと再利用性は完全に諦めだからクラスにした意義がほぼ失われる
0666デフォルトの名無しさん2016/12/23(金) 13:27:02.38ID:roeigQor
>>665
むしろこれか
0667デフォルトの名無しさん2016/12/23(金) 13:34:30.57ID:CrN1xF7/
シートの操作とかは意外とええやん
0668デフォルトの名無しさん2016/12/23(金) 13:42:25.90ID:i2qAMoBQ
クラスっていうのはとっちらかった標準モジュールを目的別に手順化して整理する為にあるので、
一定以上の大きさにならないと恩恵が少ないってのはある。
0669デフォルトの名無しさん2016/12/23(金) 13:57:31.65ID:yNZGCB3R
VBAでクラス作るなら他の言語からCOM経由でExcelいじったほうがマシ
0670デフォルトの名無しさん2016/12/23(金) 14:14:53.83ID:o3BktLeh
>>664
そのサイトを教えてください
0671デフォルトの名無しさん2016/12/23(金) 14:15:55.59ID:XuyY8bd+
>>665
受け渡し用シート名を固定すればいい
クラスを使う側は毎回変わるわけだからクラスの再利用の点では同じ
0672デフォルトの名無しさん2016/12/23(金) 14:17:39.74ID:XuyY8bd+
>>669
エクセルしか使えない人も居たりする
他の言語だとインストールしたり設定変えたりしないといけない事がある
0673デフォルトの名無しさん2016/12/23(金) 14:18:02.69ID:7Lwgocmx
相変わらずクラスがどうのこうの
そういうのは別スレ立ててtそこでやれっつーの
0674デフォルトの名無しさん2016/12/23(金) 14:31:56.26ID:roeigQor
>>670
excel vba オブジェクト指向でググれば上の方に出てくるよ
0675デフォルトの名無しさん2016/12/23(金) 14:42:03.46ID:zNUIuAUA
>>673
Excel VBAの守備範囲内だからしょうがない
0676デフォルトの名無しさん2016/12/23(金) 14:44:03.52ID:XuyY8bd+
コンストラクタで引数渡さなくても
とりあえずデフォルト値にしておいて
後でプロパティをセットすれば良いんじゃね
0677デフォルトの名無しさん2016/12/23(金) 15:06:22.43ID:CrN1xF7/
クラスは非常に面白いな
情報保持とかにも向いてるような気がする
クラスの方が処理が速いとか無いよね?
0678デフォルトの名無しさん2016/12/23(金) 15:09:12.18ID:zNUIuAUA
>>676
Property Setを用意するといつでも変わってしまう。
コンストラクタで最初にキメたらその後不変、ってよい性質。
0679デフォルトの名無しさん2016/12/23(金) 15:30:18.60ID:tydkaaKw
>>676
プロパティを外部から書き込めるのは...
って言うのもあるからそんなことするなら Setup( ) とかのメソッド作って New したら必ず呼んでね
ってした方がいい
068012016/12/23(金) 15:59:54.98ID:b81zndJj
A B C D E F G H I
5 1.00 1.09 1.14 1.17 1.210 1.219 1.221 1.222 1.235 ・・・・
6 1.10 1.11 1.12 1.15 1.17 1.189 1.191 1.199 1.208 ・・・・
7 1.13 1.14 1.15 1.17 1.171 1.179 1.180 1.185 1.191 ・・・・
8 1.19 1.19 1.193 1.2 1.210 1.217 1.240 1.242 1.250 ・・・・
9 1.26 1.27 1.273 1.28 1.283 1.294 1.311 1.329 1.303 ・・・・

A B C D E F G H I
31 1.00 0.98 0.99 1.01 1.012 1.019 1.021 1.022 1.021 ・・・・
32 1.10 1.11 1.10 1.12 1.012 0.989 1.020 1.020 0.998 ・・・・
33 1.13 1.31 1.00 1.19 1.22 1.019 1.020 1.030 1.998 ・・・・
34 1.19 1.01 1.30 1.29 1.210 1.219 1.040 1.122 1.666 ・・・・
35 1.26 1.81 1.17 1.32 1.001 0.994 1.111 1.029 0.933 ・・・・

A B C D E F G H I
71 1.00 0.78 0.79 0.80 0.81 0.819 0.821 0.812 0.811 ・・・・
72 1.10 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.69 ・・・・
73 1.13 0.45 0.48 0.51 0.52 0.53 0.531 0.535 0.567 ・・・・
74 1.19 0.25 0.26 0.21 0.29 0.23 0.271 0.245 0.217 ・・・・
75 1.26 0.11 0.12 0.11 0.19 0.13 0.21 0.141 0.122 ・・・・

sheet2にある上記のような3種類の表内から条件に合う数字をsheet1に抽出したいと思っています。
0681デフォルトの名無しさん2016/12/23(金) 16:05:41.68ID:8HH7yn5v
>>680
えっと ちょっと聞きたいが
EXCEL総合スレにも同じような趣旨の書込みがあるけど 君なの?
もしそうなら どっちか統一した方がよくねか?

あとここは VBAスレだから VBAでやりたいって事よね?
068212016/12/23(金) 16:10:57.40ID:b81zndJj
sheet1は計算式を入力する用途のシートなんですが、
sheet1の特定のセルで「1.19」という値が弾き出されて、その隣のセルに「1.2」という数字(≒条件)が入力されていたとした場合

�@sheet2の真ん中の表のA列から「1.19」に完全合致する行34を特定
�Asheet2の真ん中の表の行34から「1.2」以上の数字になっている列C、D、E、F、I…を特定
�Bsheet2の一番上の表のA列から「1.19」に完全合致する行8を特定
�Csheet2の一番上の表の行8から�Aで導き出した「C、D、E、F、I…」に該当したセルの数字をsheet1に引用(横方向にズラーッと)
�Dsheet2の一番下の表のA列から「1.19」に完全合致する行74を特定
�Esheet2の一番下の表の行74から�Aで導き出した「C、D、E、F、I…」に該当したセルの数字をsheet1に引用(横方向にズラーッと)

こういう処理を行うマクロを組みたいのですがどうしていいのか見当もつきません。
どなたか助けてください。
0683デフォルトの名無しさん2016/12/23(金) 16:12:48.84ID:b81zndJj
>>681
そうです、VBAのマクロでやったほうがいいという意見を聞きまして。
0684デフォルトの名無しさん2016/12/23(金) 16:40:20.88ID:8HH7yn5v
>>683
まずは ご自分で作って 分んない所 質問すればいいと思うぞ

1) A列を FORループで1.19が出てくるまで探す
2) ↑で1.19が出て来た行を横に 同様にFORループで1.2以上の数値が出るまで探す
これでいける

ちなみに ループ回すときに必要となる 最終行番号と最終列番号は
最終行番号
 ENDROW = Cells(Rows.Count,"A").End(xlUp).Row
最終列番号
 ENDCOL = Cells(35, Columns.Count).End(xlToLeft).Column
とかで取得できる
がんばって下さい
0685デフォルトの名無しさん2016/12/23(金) 17:13:16.65ID:roeigQor
この程度で検討つかないなら基礎の基礎から勉強しなきゃダメだわ
とりあえずfor文ごり押しでどうにでもなるんだから
配列使うかworksheetfunctionでやるのが早いだろうけどね
0686デフォルトの名無しさん2016/12/23(金) 17:19:58.80ID:rD6U2I4j
>>685
助けてやれば?w
0687デフォルトの名無しさん2016/12/23(金) 17:23:35.19ID:roeigQor
>>686
vbaスレでforとかifの説明するのってなんかちがくね?
そのくらい自分で勉強してほしくね?
0688デフォルトの名無しさん2016/12/23(金) 17:36:46.93ID:XuyY8bd+
>>682
マクロの記録で
1.19を探す
その行を選択する
そこまで記録してみる

あとそのマクロをVBEで編集して動かして結果を確かめる

これを繰り返す
0689デフォルトの名無しさん2016/12/23(金) 19:19:54.82ID:fQSmgloy
VBAのクラスはインターフェースまでは使えなかったっけ?

VB6と記憶がごっちやになってる
0690デフォルトの名無しさん2016/12/23(金) 19:41:26.86ID:lwtV9Zgb
>>689
インターフェイスは使える
0691デフォルトの名無しさん2016/12/23(金) 19:48:16.47ID:fQSmgloy
継承はできないけどちょっとした多態はできるって事だね
0692デフォルトの名無しさん2016/12/23(金) 21:55:13.08ID:i2qAMoBQ
多態性についてはVariant型ないしObject型で実現出来るから、
インテリセンス効かせる程度の意味合いしかないんだよな。

同じメソッド名を持つクラスなんてそんなに沢山作る状況もないだろうし。
0693デフォルトの名無しさん2016/12/23(金) 22:08:19.03ID:PmMZNVGd
ホットスポットの為のフックになる、と書いてもピンと来ないだろうな

ハリウッドの原則を実現するためにメソッド参照かこれが必要になるんだが
0694デフォルトの名無しさん2016/12/23(金) 22:22:57.69ID:lwtV9Zgb
インテリセンス効かせるのって大事だと思うわ
めちゃめちゃ効率上がるじゃん
0695デフォルトの名無しさん2016/12/23(金) 22:30:28.10ID:0G02nH7W
実際VB.NetやC#やってからVBAのクラスを使おうとすると色々制限があって頭を使うので中々面白い。

難点があるとすればマルチスレッドがVBA単体では使えないこと、
VBEでフォルダ構成のように配置出来ないし1クラス1モジュールになるので余りクラスを作ると管理し辛くなること、
継承はインターフェースである程度カバー出来るが、例えばフォームやシート継承してそのプロパティを追加したい場合は
インターフェースで行うには限界があるのでその辺を考慮して設計しなければならないこと、
静的変数が.Netとは少し意味が違うので、シングルトン的な使い方をし辛い。

くらいか。VariantやObjectを使うのは暗黙の型変換や型が緩いことの危険性をよく理解してから使った方がいいかな。
0696デフォルトの名無しさん2016/12/23(金) 22:47:26.21ID:PmMZNVGd
例えば一番身近な例だとイベントハンドラなんかが
インターフェースの実装なんだけどこれも分かり難いかな
0697デフォルトの名無しさん2016/12/23(金) 23:04:49.57ID:i2qAMoBQ
>>694
わざわざ継承しなくてもClass単体でインテリセンス効くし、
インテリセンス効かなくてもメソッドにアクセスする事は出来るし、
類似クラスのどれかを使ってインテリセンス効かせながら書いてからObject型とかに直しても動作するわけで、

1.同じメソッド名を持ちつつ別の挙動を行うクラスを
2.同じ引数として受け取って処理するプロシージャを書く際に
3.インテリセンス効かせておきたい

というとんでもなく局所的な使い方の時に、労力に見合わないほど些細な利便性を獲得する際にしか利用出来ない

>>696
そんなレベルの低い話はしてないと思う。
0698デフォルトの名無しさん2016/12/23(金) 23:09:49.44ID:PmMZNVGd
レベルが低いってわかってて言ってるのかなw?
0699デフォルトの名無しさん2016/12/23(金) 23:22:35.12ID:PmMZNVGd
http://qiita.com/mitaken/items/42f16c2661caa7ff0002

デフォルトプロパティを使った疑似コンストラクタ引数のアイデアは俊逸だわ
最後のオチも含めて
0700デフォルトの名無しさん2016/12/23(金) 23:44:25.59ID:i2qAMoBQ
>>698
インターフェースの基礎知識をドヤ顔で語る馬鹿でないのなら、
VBAでフレームワーク自作して運用しろって言っている馬鹿か?
0701デフォルトの名無しさん2016/12/23(金) 23:51:55.39ID:tydkaaKw
>>699
やろうとは思わないけどこれは思い付かなかったな
0702デフォルトの名無しさん2016/12/24(土) 00:09:11.49ID:hHONY+Dd
saveしてloadするとチャートのフォントサイズが変わるのは
どこが原因でしょうか
0703デフォルトの名無しさん2016/12/24(土) 00:51:46.97ID:VKHHalJR
まあ自分がバカでないと信じたい気持ちもわかるがもう少し落ち着け
0704デフォルトの名無しさん2016/12/24(土) 01:20:16.05ID:ixcSg5vj
>>697
すまん、継承云々の話ね
デモサポートしてくれた方がいいよね
0705デフォルトの名無しさん2016/12/24(土) 01:30:36.20ID:MsPpHedf
>>697
俺はObject型はそうせざるを得ない時のみ使ってるかな。
確かにインテリセンスの問題もあるんだけど、
例えばObject型に入れたインスタンスに無いメソッドやプロパティを使用したとして、
エラーは実行時にならないと起きないから。

もしそれがインターフェースにインスタンスを入れたものならコード入力の時点で発覚するので
潜伏したバグとならないで済む。

ここに今いる人達は、俺はレベルが低いとは思わないよ。
Object指向言語やってる訳でもないのにここまでポリモーフィズムのことを理解しているのは逆に凄いと思う。
0706デフォルトの名無しさん2016/12/24(土) 01:50:56.24ID:MsPpHedf
>>696
イベントハンドラはここで今言っているインターフェースより
どちらかと言えば.Netで言うDelegateのそれだね。

まぁ型合わせはしなければいけないのは同じだけど、
インターフェースはクラスのインスタンスを格納するもの。
イベントハンドラはコールバックでメソッドを呼び出すもの。

クラスを扱うものか、メソッドを扱うものかの違いがある。
VBAで言うならAPIでコールバックを行なったりCall By Nameを使ったりするのに近い。
0707デフォルトの名無しさん2016/12/24(土) 01:51:54.26ID:kcDzEr5V
多態したくてインターフェース使ってみたけど、貧弱だからvbaは手続き的な記述で書くのが1番しっくりくる。
0708デフォルトの名無しさん2016/12/24(土) 03:20:09.21ID:1oQDwUOk
schema.iniで256列以上取り込めないんだけど、何とかならん?
Excelのバージョンは、255列しか使えない97じゃなくて、
16384列まで使える2013なんだけど。

[かつしん.csv]
ColNameHeader=True
Format=CSVDelimited
Col1=もう Char Width 255
Col2=パンツは Char Width 255
Col3=はかない Char Width 255
     ・
     ・
     ・
Col255=方が Char Width 255 ←ここまではOK
Col256=いいかな Char Width 255 ←これ以上はODBCエラー

マジうんこ。
0709デフォルトの名無しさん2016/12/24(土) 10:31:13.46ID:YUUdnwHC
>>708
直に代入じゃなくてvariant型の配列にしてペタッとしてもダメ?
0710デフォルトの名無しさん2016/12/24(土) 12:00:09.52ID:jvMGVJFm
では毎年恒例ですが、彼女の出来るプログラムを挙げてください。
0711デフォルトの名無しさん2016/12/24(土) 13:31:55.96ID:1oQDwUOk
>>709
テキスト取り込みとか、ファイルオープンして配列に入れるとか、
他に方法はあるんだけど、
CSVを直接SQLで処理したいんだよね。
処理速度的に。
0712デフォルトの名無しさん2016/12/24(土) 13:39:56.93ID:vL0KvqDu
>>711
何でその方法を選んだ?
他の実現方法は検討したのかな
アクセスでも良いだろうし
0713デフォルトの名無しさん2016/12/24(土) 13:48:03.95ID:OpOi9D7n
アクセスも256列までしか取り込めないからなぁ。
列を分割して取り込むことでなんとかなるけど。
0714デフォルトの名無しさん2016/12/24(土) 13:54:24.44ID:vL0KvqDu
じゃsqliteで良いんじゃね
SQL使うんだろう

あとiniファイルだからダメなんじゃね?
0715デフォルトの名無しさん2016/12/24(土) 15:54:42.90ID:yMvVW4sX
>>708
>Excelのバージョンは、255列しか使えない97じゃなくて、
ODBCドライバが対応してないだけでExcel関係ないよ
256列は設計見直した方がいい
0716デフォルトの名無しさん2016/12/24(土) 19:27:36.48ID:1oQDwUOk
>>712
>>714
Excelしか使えない環境だから。
後、iniファイルがないと、勝手に型変換されて、
001が1になったりするんだよね。
あらかじめ、シートを文字列型にしておいても駄目だった。

>>715
そのCSVが、客先のシステムのやつなんだよ。
最初の10数列と、最後の300列あたりにデータが入っていて、
間は空という、嫌がらせのようなファイル。
0717デフォルトの名無しさん2016/12/24(土) 19:43:57.41ID:OpOi9D7n
>>716
FSOとかで空白列抜かして読み込んで、シートをADODBで繋げばSQL使える。
0718デフォルトの名無しさん2016/12/24(土) 19:53:32.02ID:PRjVXR46
もはやsqlを使う事がエクセルの目的
いいんかそれで?よく考えろよ
0719デフォルトの名無しさん2016/12/24(土) 19:55:26.41ID:vL0KvqDu
>>716
最初の8行くらいをみて自動的に型を推定するはず
全部テキストとして読み込むように接続時のオプション指定があったと思うけど
0720デフォルトの名無しさん2016/12/24(土) 21:18:21.67ID:vK4MP9IZ
空白があるんなら空白なしにしてもっかいiniファイルに落とし直すとか無理なん?
0721デフォルトの名無しさん2016/12/24(土) 21:20:14.56ID:SFMtO5ue
Do While 童貞歴 = 年齢
If 彼女 = True Then Exit Do
If 彼女 = False And 年齢 > 20 Then GoTo 風俗
  年齢 = 年齢 + 1
童貞歴 = 年齢
Loop
0722デフォルトの名無しさん2016/12/24(土) 21:37:28.54ID:QxCgnJZA
彼女は引数として俺を与えて

彼女(俺)とすべきでは?
0723デフォルトの名無しさん2016/12/24(土) 22:17:06.48ID:nbBc4uog
Errって使い回すことができますか?
あるプロシージャでErr.raiseでエラーメッセージ等を設定して、ON ERROR GoTo でキャッチして、さらにその後またErr.raiseで呼び出し元のプロシージャでもキャッチしたいんですけど、出来ますか?
何か注意点はありますか?
0724デフォルトの名無しさん2016/12/24(土) 22:39:06.51ID:NogtYgyx
>>723
んー、やったことないけどErrorObject型の変数に入れることはできるんじゃない?
仮にそれが無理でもDescriptionとかNumberとかを個別に取得してCollectionに突っ込むとかで解決できそう
0725デフォルトの名無しさん2016/12/24(土) 22:44:40.35ID:rbuG+j7H
>>723
やりたい事 こうゆう事?

Sub Test1()
 On Error GoTo Err
 Call Test2
 Exit Sub
Err:
 Debug.Print "[Test1]"; Err.Number; Err.Description
End Sub

Sub Test2()
 On Error GoTo Err
 Err.Raise "999", , "えらー だよーーん"
 Exit Sub
Err:
 Debug.Print "[Test2]"; Err.Number; Err.Description
 Err.Raise Err.Number, , Err.Description
End Sub
0726デフォルトの名無しさん2016/12/24(土) 22:45:48.53ID:yMvVW4sX
>>723
Dim tmp As Integer
On Error Goto Error_Handler

Error_Handler:
If Err.Number<>0 Then
tmp = Err.Number
Err.Clear
Err.Raise tmp
End if
みたいな感じにすれば親に再スローはできる
エラーがユーザー定義の場合は各プロパティに設定が必要
0727デフォルトの名無しさん2016/12/25(日) 00:15:05.61ID:zIj5btKp
>725,726

まさにこういったことです。ありがとうございます。
Err.raise Err.number,,Err.Description
ができるかどうかが知りたかったんです。
Err.raiseするときに初期化されてしまうのでは…とか思っていました。
0728デフォルトの名無しさん2016/12/25(日) 00:28:26.16ID:haayO3b2
クラスでエラーをproperty Getで取得するようにすれば呼び出しは可能と思うのよね
functionの戻り値variantにして戻り値として返しちゃってもいいような
0729デフォルトの名無しさん2016/12/25(日) 01:01:32.97ID:zIj5btKp
>728
なるほど。ありがとうございます。
0730デフォルトの名無しさん2016/12/26(月) 11:55:16.84ID:jBQYwGOJ
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=COUNTIF($B$2:$K$12,$A$1)=1"

これはうまく動くのですが、範囲($B$2:$K$12)を次のように変数指定しようとするとエラーが出ます

Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=COUNTIF(Range(Cells(r1, c1), Cells(r2, c2)),$A$1)=1"

どうしたら良いのでしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0731デフォルトの名無しさん2016/12/26(月) 12:08:04.68ID:/iMD3zus
>>730
RangeオブジェクトはVBAでしか扱えないから
ワークシート関数に渡したいならAddressで文字列に変換しないと
"=COUNTIF(" & Range(Cells(r1, c1), Cells(r2, c2)).Address & ",$A$1)=1"
0732デフォルトの名無しさん2016/12/26(月) 12:21:22.81ID:jBQYwGOJ
早い!

初心者ですが、また一つ勉強になりました
ありがとうございましたm(_ _)m
0733デフォルトの名無しさん2016/12/26(月) 15:37:20.09ID:M7JLaQhj
もしかしたら何言ってんのな質問かもしれんけど、クラスで
private type T
lng as long
bln as boolean
end type

public property get X as long
X = fnc.lng
end property

public property get Y as boolean
Y = fnc.bln
end type

private function fnc as T
fnc.lng = 100
fnc.bln = True
end function

みたいに、クラスないで構造体で分岐みたいにするのって問題ないよね?
マナー的におかしいとかないよね
0734デフォルトの名無しさん2016/12/26(月) 15:53:42.62ID:diLlvsXi
>>733
分岐ってどこにあるの?
0735デフォルトの名無しさん2016/12/26(月) 16:24:39.70ID:l7AoLD6f
>>733
どんなマナー?
そうする必要があるなら それで いいんじゃね? と思うけどな

PS
タイプミスあるぞーwww
0736デフォルトの名無しさん2016/12/26(月) 16:32:04.19ID:ZlGyyZtR
>>734
分岐って言い方まずかったな
語彙がなくてすまん
>>735
おけ、ありがとう
タイプミスごめんなさい
0737デフォルトの名無しさん2016/12/26(月) 17:40:10.59ID:at2BWtcV
指定のWebページのテーブルに特定のワードがある時にだけそのリンク先のwebページを開いて、
開いた先のwebページ内のテーブルからデータを取得するマクロ組みたいんですけど、
何か参考になるサイトとか教えてもらえませんか。

特定のワードがある時にだけリンク先にアクセスする方法が思いつきません。
07387372016/12/26(月) 17:44:08.69ID:at2BWtcV
追記です

最初に開くサイトのテーブルは、全てリンクが貼られていて、
特定のワードのリンク先のみ開いてデータを取得したいのです。
全て開くと冗長になってしまうので。
0739デフォルトの名無しさん2016/12/26(月) 18:17:13.35ID:l7AoLD6f
>>738
最初に開くサイトをIEで開きたくないって事?

APIのURLDownloadToFile か MSXML2.XMLHTTP とかとかで
HTMLソース取得して
MSHTML.HTMLDocumentにパースしてソース解析するしかないと思う
(テキスト解析でもいいけど)
0740デフォルトの名無しさん2016/12/26(月) 18:20:47.75ID:diLlvsXi
特定の単語の有無を調べるだけなら確かにテキストとして落としてからがいいと思う。
07417372016/12/26(月) 19:09:34.65ID:5dC605Ek
>>739
すいません
最初のサイトも開いて構いません
ただリンク先が多すぎるので、ワードでフィルターかけてからリンク先を開きたいんです
0742デフォルトの名無しさん2016/12/26(月) 19:18:49.47ID:diLlvsXi
>>741
だからテキスト中のhrefタグの中身をフィルタリングすればいいんじゃないの?
0743デフォルトの名無しさん2016/12/26(月) 19:31:01.37ID:l7AoLD6f
>>741
VBAでIE操作して情報を取得するやり方が 根本から分かってないのか?

"VBA IEオブジェクト"でググってみれば?
0744デフォルトの名無しさん2016/12/26(月) 19:51:29.88ID:ZlGyyZtR
getelementすればいいだけじゃないの
0745デフォルトの名無しさん2016/12/27(火) 14:03:54.63ID:1My9BP7W
HTMLの仕組みがわかってないとか
JavaScriptで動的に生成されるページだから手が出せないとか
0746デフォルトの名無しさん2016/12/27(火) 14:06:16.14ID:KwCXwFxZ
DOM勉強しる
07477372016/12/27(火) 15:14:06.72ID:FDOoKapW
今日1日チャレンジしてますが、なかなかうまく行きません。
URLを指定して、サイトを開くのは出来ましたが、まだテーブル内部にアクセスできません。

URLは固定なのですが、アクセスする日時でHTMLは自動生成され内容が変わります。
ソースにはdoctype htmlとなっているので、問題はありませんよね?

初めてのマクロなんですが、思ったより難しいです。
もう少し頑張ってみます。
0748デフォルトの名無しさん2016/12/27(火) 19:25:45.27ID:zArFxoGG
>>747
IEでソース開いて(表示→ソース だったかな)
目的の情報はある? 動的生成だったらちと難易度高いかもよ

<A HREF="?????" > 目的のワード</A>
とかなら簡単になんだけど
0749デフォルトの名無しさん2016/12/28(水) 00:39:42.11ID:FT5Og24D
サイトの仕組みがわからんとどうにもならんな
まず、特定したい文言がどのタグ要素に含まれてるか教えてよ
それが固定なのか、動的なのかも
0750デフォルトの名無しさん2016/12/28(水) 01:56:14.56ID:jEL1sH6Y
>>747
いいからさっさとURL貼れ
どうせギャンブルか投資かアダルトだろ?
07517372016/12/28(水) 06:37:50.55ID:mLqD6fX4
>>748
リンクが貼られてる列は見つけました。
ただテーブル要素を取れないんです。何か根本的に間違っていると思うのですが。
タグで行をコレクションして、中のtdを取り出す方法であってるのでしょうか。

>>749
同じサイズのテーブルが複数あって、取りたい情報はいくつかの列と、その中の1つがハイパーリンクです。
テーブルの順番は動的ですが、一度生成されたテーブルは固定で、新しいテーブルが順次最上段に追加される仕様です。

>>750
すいません、社内のサーバーなんです。
事務員のコピペ作業を簡略化する目的です。

機密関連の文字列を消して、ここにページのソースを貼り付けたり、テキストファイルを貼らせて頂いても良いのでしょうか?
0752デフォルトの名無しさん2016/12/28(水) 08:20:59.49ID:TpvJKrIK
フレームで区切られてたりすると階層が面倒なんだが
あとフォームだったりとか
目的の文字列があるエレメント取得してdocument.innertext(うろ覚え)ってすればいいはずなんだが
0753デフォルトの名無しさん2016/12/28(水) 16:10:15.94ID:zWNfYHVu
>>751
>ここにページのソースを貼り付けたり、テキストファイルを貼らせて頂いても良いのでしょうか?
君の 組織的に 問題ない ならいいよ

ただ htmlソースをそのまま貼っても 正しく貼れないと思うから
どっかにテキストファイルをアップロードして アップロードurlを書いてくれるかな
0754デフォルトの名無しさん2016/12/28(水) 16:53:56.39ID:NMOlmuol
ここにやり方書いてあるかな
http://www.vba-ie.net/sp/element/rowscells.html

うまく行かなければ、とりあえずtdの中身をfor文で全部調べていって、if文で特定の文字列と一致したら前後にあるリンクアドレスを抽出とか?これならあんまり考える必要もないかも?
0755デフォルトの名無しさん2016/12/28(水) 22:22:15.29ID:CV23GzcW
>>751
>すいません、社内のサーバーなんです。

あー、サーバーから直接取れば速いのに、
直接取る権限無くて困ってる系ね。
0756デフォルトの名無しさん2016/12/28(水) 23:59:18.91ID:q3/TSLT5
HTMLDocument って、createDocumentFromUrlするんじゃなくて手持ちのテキストファイルを
アタッチするみたいなことってできないのかな?

.textContent = 〜 ではダメだった。
0757デフォルトの名無しさん2016/12/29(木) 00:13:20.76ID:vsV3i/xB
>>756
テキスト(HTMLソース) VBAで読み込んでString変数へ入れておいて
writeメソッドで HTMLDocumentへ書き込むんじゃダメなのかい?

直接ファイルからなら createDocumentFromUrl だと思うが・・・
0758デフォルトの名無しさん2016/12/29(木) 00:25:28.44ID:NP/cw+55
>>757
Writeメソッド....

コンパイルエラー:
関数またはインターフェイスが予約されているか、またはVisual Basicでサポートされていないオートメーションタイプが関数で使用されています。

って出てきちゃう
0759デフォルトの名無しさん2016/12/29(木) 00:36:18.32ID:vsV3i/xB
>>757
Microsoft HTML Object Libraryの参照設定が必要してたりするよね
最近使ってなかったから忘れてたwww

インテリセンス使えんけど こうしてみ?

Dim HTMLDoc As Object
Set HTMLDoc = New MSHTML.HTMLDocument
07607592016/12/29(木) 00:38:59.49ID:vsV3i/xB
アンカみす >>758宛てね
0761デフォルトの名無しさん2016/12/29(木) 00:58:31.21ID:/tkccTc/
>>747
DOMは理解してるのか?
0762デフォルトの名無しさん2016/12/29(木) 07:11:42.77ID:NP/cw+55
>>759
Writeメソッドのところでダメになる(>>758のメッセージ)
07637592016/12/29(木) 14:38:28.82ID:vsV3i/xB
>>762
ダ・カ・ラ
HTMLDocument型で定義したオブジェクト変数で writeするとそうなるから
Objerct型で定義しる

Microsoft HTML Object Libraryの参照設定して↓のサンプル動かしてもダメなのかい?
(俺ん所の EXCEL2016 じゃ OK よん)

Sub TEST()
Dim HTMLDoc As Object
Set HTMLDoc = New MSHTML.HTMLDocument
With HTMLDoc
 .Open
 .write "<HTML><BODY><SPAN>TEST</SPAN></BODY></HTML>"
 .Close
End With
Debug.Print HTMLDoc.getElementsByTagName("SPAN")(0).outerHTML
End Sub

なお
インテリセンス使えない問題は 工夫次第で局所化できると思う
・Object型で書き込んで HTMLDocument型へキャストして使う
   or
・書き込む時だけObject型へキャスト
07647372016/12/29(木) 15:37:09.72ID:Wdzb25Hn
>>761
いえいえ、勉強中と言うのもおこがましい完全素人です。
上でアドバイス頂いたWebの情報見ながら頑張ります。

ここの皆様めっちゃ優しいので大変助かってます。
また壁にぶつかったらご相談させて頂きます。
0765デフォルトの名無しさん2016/12/29(木) 16:14:24.72ID:7Vmjozq3
>>763
実際の型ではダメでベースクラスの型では呼び出せるメソッド???
0766デフォルトの名無しさん2016/12/29(木) 16:20:24.98ID:vsV3i/xB
うん
詳しい事は MSに聞かんとわからんが
HTML Object Library内部定義と VBAの内部で バッティングしてるんだと思う
まあ これ VBA専用では ないからね

>>763 のテストコードを
Dim HTMLDoc As Object
を
Dim HTMLDoc As MSHTML.HTMLDocument
にしたら
>>758 になる
0767デフォルトの名無しさん2016/12/29(木) 20:58:48.56ID:NP/cw+55
>>763
をををw!!!!!
As Object にしたらできました!!
しかも CreateObject("htmlfile") にしたら参照設定も不要に!

>>759の"As Object"は見過ごしてました。
非常に不思議です!(>>765と同じ疑問)
0768デフォルトの名無しさん2016/12/31(土) 02:46:56.18ID:lht2/6/x
質問です.
ある規則に従って,セルの場所を返すFunctionを作って,返されたセルにデータを
書き込む,ということをしたいのですがFunctionの戻り値にセルの位置を返すやり方
としてはどういう方法がやりやすいのでしょうか?

ご教授お願いいたします.

例:
'セルの場所を返すFunction
Function foo(返す場所を決めるための値)
セルの場所を決める演算
foo = セルの場所
End Function

'セルに書き込むFunction
Function bar()
セルの場所 = foo(...)
セルの場所にデータを書き込む
End Function
0769デフォルトの名無しさん2016/12/31(土) 03:59:33.60ID:CRVQvMfq
>>768
人に聞くまでもなく

"自分にとって やりやすい方法"

で作ればいいかと
(やりやすい/やりずらい の判断基準は 人によって違うからね)
0770デフォルトの名無しさん2016/12/31(土) 07:27:31.14ID:VWit1SHs
>>768
今動いてるのならそれでいいと思う

ついでにここで聞くようなレベルは教授ではなく教示
0771デフォルトの名無しさん2016/12/31(土) 08:20:44.88ID:RP5GqFRc
>>768
環境が手元にないので記憶に頼ってるから細かいミスは見逃してちょ

Function Foo(S As Worksheet) As Range
Set Foo = S.Cells(1, 1)
End Function

Sub Bar
Dim R As Range
Set R = Foo(ActiveWorksheet)
R.Value = "Test"
End Sub

Foo(ActiveWorksheet).Value = "Test"
ってできたかどうかは覚えてない

>>769-770
年末まで意味のないレス乙
0772デフォルトの名無しさん2016/12/31(土) 09:02:13.43ID:XqWEiNg4
>>768
いくらでもやり方はある
そもそもセルの位置ってなんかプロパティでなかったか
0773デフォルトの名無しさん2016/12/31(土) 10:15:52.54ID:/2077635
>>768
セルのオブジェクトが必要ならRange
セルの位置を表す文字列が必要ならcellのaddressプロパティを使う
0774デフォルトの名無しさん2016/12/31(土) 10:27:26.68ID:lht2/6/x
>>771-773
皆さん、ありがとうございます.
Rangeオブジェクトを返すのがやりやすそうだったので作成したらできました
0775デフォルトの名無しさん2016/12/31(土) 16:59:32.94ID:7vG7PqoH
Sub Sample()

Static buf As string

buf = buf & "ABC"

Debug.print buf

End Sub

マクロSampleを3回実行した時、イミディエイトウィンドウに表示される文字は?
という問題で、英字は大文字/小文字を区別しなさいという問題。
解答はABCABCABCと大文字なんだけど、
何でこれ大文字になるの?
初心者なんで解答も含め丁寧に教えてほしいです。
0776デフォルトの名無しさん2016/12/31(土) 17:15:48.78ID:7vG7PqoH
質問その2

Sub Sample1()

Dim MyStr As String

My Str = "ABC"

Call Sample2(MyStr)

MsgBox MyStr & MyStr


Sub Sample2(ByVal tmp As String)

tmp = "DEF"

End Sub

ここでSample1を実行したら何が出るかという問題。
答えはABCABCなんだけど、これがなぜそうなるのかが分からないです。
値渡しがカギらしいけど、参照渡し・値渡しがよく分かってない。
ここもなぜこうなるのか丁寧に教えてほしいです。
あとCall Sample2(MyStr)とsample2の後ろにmystringとカッコ書きでありますが、
ここもどういう意味でしょうか?
0777デフォルトの名無しさん2016/12/31(土) 17:40:03.73ID:5M+LQLiE
初心者はまだそれを知る必要はない
その問題集は今すぐ焼きすてろ
0778デフォルトの名無しさん2016/12/31(土) 17:40:18.28ID:FgAD++uA
>>775
小文字のABCは、書けるのかな?
どういう形か分かるよね?

次は大文字が使われてるのは
分かるよね?

だからだよ
0779デフォルトの名無しさん2016/12/31(土) 17:43:02.91ID:6lBFVDjy
人工知能かな?
0780デフォルトの名無しさん2016/12/31(土) 17:44:50.38ID:506Jc6Db
Static buf As string
St☆ti☆ ☆uf As string
☆のところが小文字
0781デフォルトの名無しさん2016/12/31(土) 17:45:11.91ID:7vG7PqoH
>>778
間違えた。
何で大文字じゃなく、全角だった。
何で半角じゃなく、全角なのかな?って。
0782デフォルトの名無しさん2016/12/31(土) 17:46:15.50ID:7vG7PqoH
ついでに>>776もよろしくです。
参考書読んでもよく分からんです・・。
0783デフォルトの名無しさん2016/12/31(土) 17:46:15.97ID:UsB59Qin
>>775
なんで大文字かって?質問の意味がわからない。
abcabcabcって小文字に変わったらその方がよほど不思議だろ?
0784デフォルトの名無しさん2016/12/31(土) 17:50:36.17ID:UsB59Qin
>>781
リロードしてなかったごめん
0785デフォルトの名無しさん2016/12/31(土) 18:00:19.44ID:FgAD++uA
>>782
質問正しく二問とも書き直して。
解答欲しいなら良く校正してね
0786デフォルトの名無しさん2016/12/31(土) 18:12:31.18ID:2Xzfkrwi
質問文を理解できないのでちゃんと書いてほしい
0787デフォルトの名無しさん2016/12/31(土) 18:53:20.80ID:hU+zlM5k
>>786
いや、問題文そのまま写したんだけど・・・。
0788デフォルトの名無しさん2016/12/31(土) 19:03:53.22ID:bS0q0Exf
>>781
全角になんかならない。
もし全角になるというのなら、イミディエイトウィンドウに直接
Debug.Print "ABC"
と打っても全角になると思うが?
0789デフォルトの名無しさん2016/12/31(土) 19:13:01.55ID:KgiQh4Cj
なぜ大文字になるのかという問いはすごく難しいな
大文字になるようにコーディングしたからというのではだめなんだろう

このようなコードでなぜ大文字が返されるか深く考えなくてはいけないんだろう
0790デフォルトの名無しさん2016/12/31(土) 19:15:16.98ID:hU+zlM5k
さっきの問題、後で貼り直すので、とりあえず別の問題。

Sub MainProc()

Dim i As Long , j As Long

i = 1

j = 2

Call calc Date(i,j)

MsgBox i + j

End Sub


Sub CalcDate(x As Long , y As Long)

x = x * 10

y = y * 100

End Sub

↑上の2つのプロシージャを同一のモジュールで作成した。
MainProcを実行した時の説明として正しいのを選べ、という問題。

正解はメッセージボックスに210が出るというもの。
解説を見ると、データの渡し方を省略すると参照渡しになるからというもの。
i,yともに10を掛けてないのに、何でこうなるの?
0791デフォルトの名無しさん2016/12/31(土) 19:18:20.47ID:hU+zlM5k
>>788
解答が間違ってるとは思えないんだよね。
俺は単純にABCABCABCかな、と思ったんだけど、
なぜABCABCABCと全角になるのか。
まぁ試験問題なんであまり深く考えなくていいのかな・・。
0792デフォルトの名無しさん2016/12/31(土) 19:19:36.04ID:/2077635
>>790
コンピュータの仕組みを先ず理解した方が良いぞ
0793デフォルトの名無しさん2016/12/31(土) 19:31:56.65ID:hU+zlM5k
>>792
申し訳ないけど、答えられないなら、そういう回答はいらないです。
0794デフォルトの名無しさん2016/12/31(土) 19:39:25.82ID:FgAD++uA
>>790
1*10+2*100=210

これだけだ
0795デフォルトの名無しさん2016/12/31(土) 19:40:50.90ID:FgAD++uA
>>793
ごちゃごちゃ言う前に
こちらが出した要望に早く答えなさい
0796デフォルトの名無しさん2016/12/31(土) 19:43:48.12ID:CRVQvMfq
年末というか 冬休みだねぇー
0797デフォルトの名無しさん2016/12/31(土) 19:48:01.92ID:rQpeZEGh
>>793
答えられるけど答えないが正確だ
0798デフォルトの名無しさん2016/12/31(土) 19:48:29.89ID:dx9vbJE4
>>795
そもそも関数が何かとかなにも分かってないような
最低限、数学のy=f(x)が理解できないと

質問その2とか参照渡しとか何の関係も無いし
例えば君の質問
>あとCall Sample2(MyStr)とsample2の後ろにmystringとカッコ書きでありますが、
>ここもどういう意味でしょうか?
は
「あと f(x) と f の後ろに x とカッコ書きでありますが、ここもどういう意味でしょうか?」
と言ってるのと同じなんだ
理解できた?
0799デフォルトの名無しさん2016/12/31(土) 19:50:04.06ID:8SrFBOKr
>>790
あれれ?おかしいですよ。
MainProcは独立しているはずだから3が表示されると思ったら本当に210と出た。
どうなってるの?
0800デフォルトの名無しさん2016/12/31(土) 19:57:09.72ID:FgAD++uA
>>798
えっ?
自分?
でいいのこのレス?
0801デフォルトの名無しさん2016/12/31(土) 20:01:06.71ID:dx9vbJE4
スマン安価ミス
0802デフォルトの名無しさん2016/12/31(土) 20:05:44.64ID:Kmz/fYBF
そんな、クソ問題をやるから、どんどんプログラミングが出来なくなる

時間のムダだから、良問をやれ
0803デフォルトの名無しさん2016/12/31(土) 20:11:28.43ID:8SrFBOKr
いや、いままでプロとしてVBAやってきたが
なぜSUB呼んだときに元プロシージャが変わるんだ?
長年やってきたがこれは知らなかったぞ。
まあ呼ばれるプロシージャ側でその引数の値を変える操作は少なくとも意識してはやった記憶はないが。
0804デフォルトの名無しさん2016/12/31(土) 20:13:27.05ID:2Xzfkrwi
>>787
問題文じゃなく質問文の方
何を知りたいのかが全然わからない

問題文にしたってend sub足りてない、変なところにスペース入ってる等そのままとは思えない
0805デフォルトの名無しさん2016/12/31(土) 20:15:21.70ID:FgAD++uA
>>803
これ便利よ。
効果たかしされど副作用注意だな
0806デフォルトの名無しさん2016/12/31(土) 20:16:16.29ID:2Xzfkrwi
>>803
プロならbyrefを知ろう
0807デフォルトの名無しさん2016/12/31(土) 20:16:39.17ID:hU+zlM5k
Sub Sample1()

Dim MyStr As String

My Str = "ABC"

Call Sample2(MyStr)

MsgBox MyStr & MyStr

End Sub

Sub Sample2(ByVal tmp As String)

tmp = "DEF"

End Sub

さっきの質問�A、書き直しました。
途中でEnd Subが抜けていたので追加。
ここでSmaple1を実行した時に何のメッセージが表示されるかという問題。

正解→ABCABC

解説:変数MyStrを値渡しで渡しているため、
呼び出し先のプロシージャで値を変更しても、
呼び出し元の変数MyStrの値は変更されない。
そのため、メッセージボックスには"ABCABC"が表示される。
(解説そのまま抜粋)

こんな感じでどうでしょ?
これでもなかなか理解できないので、分かりやすく教えてください。
0808デフォルトの名無しさん2016/12/31(土) 20:18:32.40ID:hU+zlM5k
と、いうわけで、>>790>>807お願いします。
0809デフォルトの名無しさん2016/12/31(土) 20:19:29.64ID:hU+zlM5k
>>804
だから何でABCABCが出るのか?ってことです。
0810デフォルトの名無しさん2016/12/31(土) 20:19:57.31ID:bS0q0Exf
>>790
じゃあちょっと意地悪して,,,

Call calcDate(i, j)
の代わりに

Call calcDate(i + 0 ,j + 0)
とやったらどうなるかな?

もしくは
Call CalcDate((i), (j))
とやったら?
0811デフォルトの名無しさん2016/12/31(土) 20:23:07.43ID:2Xzfkrwi
>>809
出力対象がMyStr & MyStrだからMyStrの値を繰り返し出してるだけ
とてもシンプル
0812デフォルトの名無しさん2016/12/31(土) 20:26:57.79ID:FgAD++uA
>>808
>>790は>>794に処理書いたけど
あとなにが分からないの?

参照渡しと、値渡し説明できる?
0813デフォルトの名無しさん2016/12/31(土) 20:27:55.26ID:8SrFBOKr
>>812
矢切の渡しなら説明できます。五木ひろしの歌です。
0814デフォルトの名無しさん2016/12/31(土) 20:30:49.79ID:hU+zlM5k
>>812
だから値渡しとか参照渡しとかその辺が分からないんだって・・・・。
日本語通じないなぁ。
そして何で10掛けるのかと全然説明になってないし。
もう貴方は答えなくていいです。
0815デフォルトの名無しさん2016/12/31(土) 20:32:03.01ID:2Xzfkrwi
>>814
聞く側としての礼儀もなしか
0816デフォルトの名無しさん2016/12/31(土) 20:32:56.74ID:r+SEv/0u
>>814
通じてないなら説明が悪いんだよ
0817デフォルトの名無しさん2016/12/31(土) 20:33:26.83ID:hU+zlM5k
>>811
これ下がByValじゃなくByRefだったらDEFDEFになるのでしょうか?
だとしたらどうしてそうなるのか教えて欲しいです。
どうも値渡しと参照渡しがよく分からないです。
0818デフォルトの名無しさん2016/12/31(土) 20:35:35.87ID:FgAD++uA
>>814
calcdateで10掛けてるだろ。
0819デフォルトの名無しさん2016/12/31(土) 20:35:45.11ID:7jBT90pG
わからない部分がわかってるなら後は調べりゃ良いだけなのに。
0820デフォルトの名無しさん2016/12/31(土) 20:36:12.43ID:CRVQvMfq
>>808

ところで 逆質問なんだけど
>>790は
君の所で 実行できてるの?
>>正解はメッセージボックスに210が出るというもの。
とか書いてるけど

質問なら正しく書かないと
0821デフォルトの名無しさん2016/12/31(土) 20:38:05.97ID:FgAD++uA
>>817
そうなるよ。
それがまさに参照(見るだけ)と値(書き換え可能)の違いを表してる。
0822デフォルトの名無しさん2016/12/31(土) 20:38:12.08ID:bS0q0Exf
>>817
マジレスするとVBAのByRefは少し難しいよ
他言語の参照渡し(やポインタ渡し)とは微妙に違う面があるから
0823デフォルトの名無しさん2016/12/31(土) 20:38:40.20ID:hU+zlM5k
>>820
いや、実行していないですよ。
問題文と解説をそのまま写しただけなので。
0824デフォルトの名無しさん2016/12/31(土) 20:40:39.89ID:hU+zlM5k
>>818
calcdateでかけてるのはiとjではなく、xとyなわけですが?
0825デフォルトの名無しさん2016/12/31(土) 20:41:40.29ID:CRVQvMfq
>>823
やっぱね

正解は
Call calc Date(i,j)
が"構文エラー"となる だよ
0826デフォルトの名無しさん2016/12/31(土) 20:42:46.84ID:2Xzfkrwi
>>823
まず実行しよう
それでわからなければブレークポイント作って追おう
それでわからなければ調べてみよう
(検索ワード→Excel vba 値渡しと参照渡し)
それでわからなければもう一度聞けばよい
0827デフォルトの名無しさん2016/12/31(土) 20:44:52.58ID:fdrbXMRt
まあググれば解説サイトは山ほど出てくるけど

値渡し=変数(定数)の中身が渡される
参照渡し=変数そのものが渡される

結果的に仮引数は実引数の別名のように働く
0828デフォルトの名無しさん2016/12/31(土) 20:47:22.67ID:dx9vbJE4
>>814
値渡しの時はプロシージャを越えて他に影響を与えない
影響を与えたいのならば return 文かグローバル変数が必要

参照渡しの時は引数の値を変更したら引数に使った変数は
プロシージャの外まで影響がある

で分かるかな

答える気が無くなるよね
まあ、基本バカクズなんだろ
この程度の力量でプロだって胸張れるんだからある意味たいしたもんだ

解説見て理解したが、>>790 の要点は
0829デフォルトの名無しさん2016/12/31(土) 20:47:42.77ID:FgAD++uA
>>824
その返しからすると関数とその引数の
働きがわかってないのね。

じゃ質問
関数f(x)=10*xが在りました。
f(1)はいくつになる?
またf(z)は、どうなる?
0830デフォルトの名無しさん2016/12/31(土) 20:49:22.02ID:dx9vbJE4
要点はByなんとかを省略すると既定値ByRefってことなんだよねきっと
0831デフォルトの名無しさん2016/12/31(土) 20:56:37.84ID:hU+zlM5k
>>827-828
検索を色々かけたけど分からないんだよね。

あと別にプロとは一言も言っていない訳だが・・w
この力量でプロはあり得ないw
0832デフォルトの名無しさん2016/12/31(土) 21:00:28.27ID:dx9vbJE4
ああ、すまんな、ながらでよく読んでなかった
色々読み違えてるなオレ
0833デフォルトの名無しさん2016/12/31(土) 21:09:49.09ID:CRVQvMfq
参照渡しと値渡しって

参照渡し・・入れ物(変数)の場所(メモリ位置)を渡す
(呼び出した方も呼び出された方も 同じ入れ物を使う)

値渡し・・・その名前の通り 値を渡す
(入れ物 が違う)

でどう?
0834デフォルトの名無しさん2016/12/31(土) 21:11:08.43ID:2Xzfkrwi
>>831
調べた上でわからないのならスーパーざっくりのイメージを書いてみる

 値渡し :自分の財布に入ってる金額を教えて買い物してきてもらう
 参照渡し:自分の財布を渡して買い物してきてもらう

値渡しの時はレジ通す時に自分の財布からお金は減らないけど
参照渡しの時はレジ通す時に自分の財布からお金が減ってその状態のまま手元に返ってくる

こんな感じ
0835デフォルトの名無しさん2016/12/31(土) 21:12:46.95ID:5M+LQLiE
どうしてお前らは箱ごと渡すというごく自然な表現が出来んのだ頭が悪いな
0836デフォルトの名無しさん2016/12/31(土) 21:13:02.57ID:8SrFBOKr
あとこれね。

矢切の渡し・・・五木ひろしの歌

じゃあ参照渡しのとき(i)とカッコつけて渡したら?(i+1)と1を足して渡したら変数はどうなる?
0837デフォルトの名無しさん2016/12/31(土) 21:14:53.18ID:2Xzfkrwi
>>835
調べた上でわからないって言ってる以上は軽く調べただけで出てくるような表現で伝わるとは思えないからな
0838デフォルトの名無しさん2016/12/31(土) 21:18:21.80ID:5M+LQLiE
>>837
伝わらなかったらまず自分の無能を疑うべきだな
0839デフォルトの名無しさん2016/12/31(土) 21:19:19.22ID:2Xzfkrwi
>>838
当たり前だな
0840デフォルトの名無しさん2016/12/31(土) 21:20:20.89ID:hU+zlM5k
>>833-836

Sub Sample1()

Dim MyStr As String

My Str = "ABC"

Call Sample2(MyStr)

MsgBox MyStr & MyStr

End Sub

Sub Sample2(ByVal tmp As String)

tmp = "DEF"

End Sub

さっきの問題のたとえで言うと、ByValは値渡しだから、
値=tmp=DEFを渡すんじゃないの?素直に考えると。
だから正解はDEFDEFになると思ったんだけど。
0841デフォルトの名無しさん2016/12/31(土) 21:21:41.42ID:hU+zlM5k
あと>>790も丁寧に教えてほしい。
これはByRefが省略されてる?のかな。
0842デフォルトの名無しさん2016/12/31(土) 21:23:39.91ID:hU+zlM5k
>>840は難しく考えずに、
My Str = "ABC"だから、

Call Sample2(MyStr)

MsgBox MyStr & MyStr

は、ABCABCで良いって事?
0843デフォルトの名無しさん2016/12/31(土) 21:29:59.88ID:2Xzfkrwi
>>840
なーるほど
やっと質問を聞き出せた気がする

値渡しってのはsample2から見たら「値渡され」ってこと
値にしろ参照にしろ渡すのはそのメソッドを呼ぶときだけだよ
0844デフォルトの名無しさん2016/12/31(土) 21:33:05.11ID:/2077635
>>842
基本がわかってないから説明を正しく解釈出来ないんだよ

あと何でお前の質問にタダで答えてくれる人がいると思ってる?
0845デフォルトの名無しさん2016/12/31(土) 21:33:34.03ID:CRVQvMfq
>>836
>>じゃあ参照渡しのとき(i)とカッコつけて渡したら?(i+1)と1を足して渡したら変数はどうなる?
入れ物(箱)が VBA内部で作られてそれが 渡される この場合も動作は変わらんけど

内部で作られたものは使えないから 結果論的に 値渡しと変わらなくなる
0846デフォルトの名無しさん2016/12/31(土) 21:33:54.39ID:fdrbXMRt
素直に考えると渡されたのは"ABC"
0847デフォルトの名無しさん2016/12/31(土) 21:35:08.97ID:dx9vbJE4
>>841
そう
参照渡しなのでCalcDateの影響がある(上書きされてる)
MainProc内での名前はi,j
CalcDate内での名前はx,y
どちらも同じ変数

>>842
そう
値渡しは外に影響が無いのでSample2の影響がSample1には伝わらない
結果、意味の無い関数になっている
0848デフォルトの名無しさん2016/12/31(土) 21:38:06.80ID:mnvVNNIM
>>836
矢切の渡しは細川たかしの歌やで
0849デフォルトの名無しさん2016/12/31(土) 21:41:37.54ID:bS0q0Exf
>>840
ByRef tmp
と書いてあるところに変数 X を渡したら tmpは X と同じ実体。

ByVal tmp
と書いてあるところに変数 X を渡したら tmpは X のコピー。

基本はこれでいいが、変数それ自体じゃなくて x + 0 とかを渡したら?とか
ByRef tmp As Variant
と書いてあるところに
Dim i As Long と宣言された変数 i を渡したら?
とかいろいろ注意すべき点がある。
0850デフォルトの名無しさん2016/12/31(土) 21:45:29.06ID:91PLeCpZ
プログラムの仕組みで悩むならC言語辺りの基礎を身につけた方が早い。
0851デフォルトの名無しさん2016/12/31(土) 21:46:53.77ID:hU+zlM5k
>>847

>>790はxとyという箱にiとjがそれぞれ入ったっていう解釈でいいの?
だからi×10 j(2)×100で結果として210ってこと?

>>843
ごめんそれでもよく分からない。
メソッドとか呼び出すとかなるとこんがらがる。
0852デフォルトの名無しさん2016/12/31(土) 21:54:25.03ID:2Xzfkrwi
>>851
何がわからないのか何がこんがらがるのかを記載してほしい
でないと「そっかー」で終わる
0853デフォルトの名無しさん2016/12/31(土) 21:55:46.20ID:5M+LQLiE
>>850
cに参照渡しはないのだがw馬鹿だなお前w
0854デフォルトの名無しさん2016/12/31(土) 21:57:21.34ID:dx9vbJE4
>>851
>>849の説明が正しくて、参照渡しってのは実体は全く同じ変数で、別名称でやりとりしてるだけ
だから以降はその通り

別名称にしてる理由の一つは、保守しやすくなるから
変数の名前を変えたくなった時、片方のプロシージャ変数名だけ変えれば済む
他に、速度が速くなるとかの利点もある
0855デフォルトの名無しさん2016/12/31(土) 22:02:04.73ID:8SrFBOKr
>>848
あれそうだっけ?まあどっちでも一緒だ。
0856デフォルトの名無しさん2016/12/31(土) 22:02:20.00ID:hU+zlM5k
>>849の言うことを素直に考えると、

>ByVal tmp
と書いてあるところに変数 X を渡したら tmpは X のコピー。

だから、tmpはX(ここではABC)になる。
だから呼び出すtmp(ここではMyStr)はABCになるってこと?
0857デフォルトの名無しさん2016/12/31(土) 22:04:12.45ID:91PLeCpZ
>>853
ポインタがある。

内部的に同じ物だって事は分かった上でのレスだよな?
0858デフォルトの名無しさん2016/12/31(土) 22:04:22.50ID:hU+zlM5k
>参照渡しってのは実体は全く同じ変数で、別名称でやりとりしてるだけ

これ、すごく分かりやすい。

じゃあ値渡しは?xという変数はxという意味で、参照渡しと変わらないのでは?
0859デフォルトの名無しさん2016/12/31(土) 22:06:14.70ID:5M+LQLiE
>>857
お前は何も分かってない馬鹿だな
0860デフォルトの名無しさん2016/12/31(土) 22:08:02.50ID:91PLeCpZ
>>859
話についてこれないなら無理矢理入ってこようとしなくていいよ。
0861デフォルトの名無しさん2016/12/31(土) 22:08:42.93ID:bS0q0Exf
>>858
コピーだと言ったでしょ。
別の実体。

別の実体とは、元の実体と別の位置と寿命をもつモノ。
もちろん短い寿命ね。
0862デフォルトの名無しさん2016/12/31(土) 22:10:37.07ID:dx9vbJE4
>>856
最後の行がちょっと分からないけど、呼び出す時に渡した変数の値はABC
0863デフォルトの名無しさん2016/12/31(土) 22:10:57.14ID:5M+LQLiE
>>860
馬鹿の常套句「話についてこれない」
0864デフォルトの名無しさん2016/12/31(土) 22:12:09.68ID:bS0q0Exf
>>851
>メソッドとか呼び出すとかなるとこんがらがる。

オブジェクト型のByValはコピーではなく元の実体。
だからメソッド呼び出しは元のオブジェクトに対するメソッド呼び出しになる。

し か し
代入操作だけは違うんだな。
これがややこしい。

Object*
と
(Object*)&
の違いとでもいうべきか。
0865デフォルトの名無しさん2016/12/31(土) 22:12:32.06ID:91PLeCpZ
変数の動きだけなら仕組みをひとまず置いておいて、Debug.Print活用して色々実験すりゃだいたい分かる。
0866デフォルトの名無しさん2016/12/31(土) 22:14:04.40ID:5M+LQLiE
>>864
どうして馬鹿はcで例えたがるのか
プログラミング界の馬鹿の七不思議の一つだな
0867デフォルトの名無しさん2016/12/31(土) 22:17:33.47ID:fdrbXMRt
自分でコード打ち込んでデバッガでステップ実行させて効果の違い確かめた方が説明聞くより何十倍も理解早いよ
0868デフォルトの名無しさん2016/12/31(土) 22:20:42.00ID:bS0q0Exf
>>866
例えてないよ???
0869デフォルトの名無しさん2016/12/31(土) 22:28:23.69ID:91PLeCpZ
>>864
関数の引数がCPUの扱えるbit数を超えるか超えないかだから、
基本型とObject型で違うって覚えておけばそこまでややこしくない気がする。
0870デフォルトの名無しさん2016/12/31(土) 22:30:15.79ID:hU+zlM5k
sample2を呼び出す→変数はByValで値渡しだから、変数のコピーでABCのまま

ってこと?
0871デフォルトの名無しさん2016/12/31(土) 22:36:15.36ID:91PLeCpZ
>>840から関数を取っ払うと

Sub Sample1()
 Dim MyStr As String
 MyStr = "ABC"
 Dim tmp As String
 tmp = MyStr
 tmp = "DEF"
 MsgBox MyStr & MyStr
End Sub

という事。
0872デフォルトの名無しさん2016/12/31(土) 22:43:28.07ID:hU+zlM5k
>>871
ちょっとわかりにくい。

Sub Sample1()
 Dim MyStr As String
�@ MyStr = "ABC"
�A Dim tmp As String
�B tmp = MyStr
�C tmp = "DEF"
�D MsgBox MyStr & MyStr
End Sub

�@でMyStrがABCになる
�BでtmpがMyStrに。
�CでtmpがDEFに上書きされる。 tmp = MyStr = ABCから tmp = DEFに
�DでMyStr=ABCだからメッセージボックスはABCABCになるってこと?
tmptmpじゃなくて?
0873デフォルトの名無しさん2016/12/31(土) 22:45:41.28ID:bS0q0Exf
>>869
サイズは関係ないと思う
ByVal x As Variant
のxにでかい配列渡しても値渡しだし、Variant自体16(or 24)バイト
0874デフォルトの名無しさん2016/12/31(土) 22:47:38.69ID:bS0q0Exf
>>872
>�BでtmpがMyStrに。

ここが間違い

tmpはMyStrではなく、その値である"ABC"になるだけ。
0875デフォルトの名無しさん2016/12/31(土) 22:49:40.63ID:hU+zlM5k
>>874
なぜ?tmp=MyStrでは?
0876デフォルトの名無しさん2016/12/31(土) 22:53:21.02ID:91PLeCpZ
>>872
ByRef tmp As Stringなら、
Dim MyStr As Stringを引き継ぐんだけど、
ByVal tmp As Stringだから、
Sample2呼び出しの際に宣言されたDim tmp As Stringに渡されてる事になる。
0877デフォルトの名無しさん2016/12/31(土) 22:53:27.09ID:bS0q0Exf
>>875
違う

>�A Dim tmp As String
としたとき、tmp は String 型のひとつの実体となる。
実体がひとつ増えたんだ。

tmp = MyStr
と書いたからといって、tmp と MyStr が同一物だったとしたら「実体がひとつ増えた」ことに反してしまう。
0878デフォルトの名無しさん2016/12/31(土) 23:00:07.76ID:dx9vbJE4
>>872
値渡しでは、別の実体に中身の値をコピーした上で渡してるから、もう元の MyStr を上書きできないし、
呼び出し時に使った変数で呼出元に値を知らせることは出来ない約束になっている

コピー元のMyStrはABC のままで変わってない
コピー先のtmpはDEF これを元のプロシージャに伝える手段が何も無い別の実体だから

もし「Sample2の中」にも
msgbox tmp & tmp
があれば、DEFDEF がまず表示される
その後、Sample1に処理が戻ってから、ABCABC が表示される
0879デフォルトの名無しさん2016/12/31(土) 23:02:50.19ID:hU+zlM5k
つまりtmpとMyStrというのは別の変数ってことか。
じゃあtmp = MyStr は何を意味するの?
0880デフォルトの名無しさん2016/12/31(土) 23:09:16.85ID:dx9vbJE4
>>879
普通はそこに疑問を持たない
もし、そこに疑問を持つレベルなら、参照渡しとか値渡しとか以前に
プロシージャなんか使わずに、基本的なプログラムを数多く作るのが先だ
実際に自分で実行する必要がある
0881デフォルトの名無しさん2016/12/31(土) 23:14:36.35ID:F3qhDaCb
BASICの伝統とはいえ、代入と比較が同じ演算子ってのもなぁ
0882デフォルトの名無しさん2016/12/31(土) 23:17:24.02ID:hU+zlM5k
Sub Sample1()

Dim MyStr As String

MyStr = "ABC"

Call Sample2(MyStr)

MsgBox MyStr & MyStr

End Sub

Sub Sample2(ByVal tmp As String)

tmp = "DEF"

End Sub

よく分からない。
Sample2は値渡し。tmp(DEF)を呼び出すが、
その際にSample1の中身をコピーするので(ABC)、
値も変わってしまうって事?結果、ABCABCになる?
0883デフォルトの名無しさん2016/12/31(土) 23:18:43.81ID:FgAD++uA
みんながんばれー
0884デフォルトの名無しさん2016/12/31(土) 23:22:16.72ID:91PLeCpZ
>>882
全ての変数は代入文で中身を書き換えているのであって、初期値を定義しているわけではない。
順接の基本に沿って上から順番に処理していくのでtmpが書き換わっているのはSample2が呼び出された時。
各プロシージャは自分の範囲で宣言した変数しか知らないので、Sample1はSample2のtmpの中身を知らない。
0885デフォルトの名無しさん2016/12/31(土) 23:25:39.66ID:F3qhDaCb
>>882
Sample2を呼び出してる実引数はMyStrで値は"ABC"
呼び出されたSample2の仮引数はByValで宣言されているので、実引数の値のコピーを受け取る
だからtmpにまずセットされるのは、MyStrとは別の"ABC"
MyStrとは別なのでSample2の内部で変更しても、呼び出し元であるSample1のMyStrには影響しない

まあ、わかりにくいけど頑張れ
この先に参照型(VBAの用語ではないけど)っていうさらにややこしやつがあるからw
0886デフォルトの名無しさん2016/12/31(土) 23:28:38.80ID:hU+zlM5k
Sub Sample1()

�@Dim MyStr As String

�AMyStr = "ABC"

�BCall Sample2(MyStr)

�CMsgBox MyStr & MyStr

�DEnd Sub



�ESub Sample2(ByVal tmp As String)

�Ftmp = "DEF"

�GEnd Sub


>>884の説明を基にすると、�Bの時点ではまだ値は変わっていない。ABCのまま。
で、�CのメッセージボックスではMyStrであるABCABCが出るってこと?
0887デフォルトの名無しさん2016/12/31(土) 23:32:18.48ID:bS0q0Exf
>>886
>�Bの時点ではまだ値は変わっていない。ABCのまま。

Sample2側の変数 tmp の価は変わっているけどね。MyStr はそのまま。

あるフォルダにあるファイルを別フォルダにコピーしたあと、そっちをいじっても元のファイルに影響がないのと同じ。
0888デフォルトの名無しさん2016/12/31(土) 23:35:07.15ID:dx9vbJE4
>>882
前にもj(2)って書いてたのが気になったが
j(2)とかtmp(DEF)という表現は無いよ
一般的な使い方では無いので、意味も伝わらない
j=2 と tmp=2
しかも、=はイコールじゃなくて代入を表す

この辺が理解を妨げているのかも
0889デフォルトの名無しさん2016/12/31(土) 23:35:42.82ID:91PLeCpZ
>>886
そう。�Bの時点ではtmpの中には如何なる値も入っていない。
0890デフォルトの名無しさん2016/12/31(土) 23:48:54.45ID:hU+zlM5k
少し分かってきた気がする。みんなありがとう。

Sub Sample1()

�@Dim MyStr As String

�AMyStr = "ABC"

�BCall Sample2(MyStr)

�CMsgBox MyStr & MyStr

�DEnd Sub



�ESub Sample2(ByVal tmp As String)

�Ftmp = "DEF"

�GEnd Sub

じゃあこれが�EがBeRefになったら?
答えはDEFDEFとなるのは分かってるんだけど、原理が分かってない。
>>884の説明を基にすると、上から順に処理をするわけで、
�Bの段階ではMyStrはまだABCだから�CではABCABCとなる・・あれ?
0891デフォルトの名無しさん2016/12/31(土) 23:49:34.84ID:hU+zlM5k
>>890はBeRefじゃなく、ByRefだった。
0892デフォルトの名無しさん2016/12/31(土) 23:52:38.27ID:FgAD++uA
>>890
処理順が間違えてる。
やっぱり関数わかってないから
とんちんかんな解釈してる
0893デフォルトの名無しさん2016/12/31(土) 23:55:35.11ID:F3qhDaCb
>>890
MyStrとtmpをウオッチ式に入れてステップ実行で1命令ずつ実行させてみ
0894デフォルトの名無しさん2016/12/31(土) 23:57:23.73ID:91PLeCpZ
そうだな。F8キーでステップ実行すれば何やってるかだいたい検討つくか。
ついでに変数にマウスポインタ当てれば変化の具合も分かるわ。
0895デフォルトの名無しさん2016/12/31(土) 23:59:09.82ID:hU+zlM5k
ByVAL→呼び出しても元の変数の値は変わらない。
さっきレスで
「ファイルをコピーしてコピー先のデータを弄っても、元のデータは変わらない」
ってそういう意味か。
0896デフォルトの名無しさん2017/01/01(日) 00:13:12.03ID:wgGXbt0p
ByRefになったら参照渡しだから、変数に格納されてる値をそのまま代入する。
ここではDEFだから、Sample2はDEFになるのか。
0897 【中吉】 2017/01/01(日) 00:18:31.00ID:n3vbSfkd
あけおめ!
&
!omikuji
0898デフォルトの名無しさん2017/01/01(日) 00:19:34.34ID:tpetM3cd
宿題は自分でやれ
以上
0899 【蝶】 2017/01/01(日) 00:26:40.88ID:swtihv5O
明けましておめでとう
0900 【大凶】 2017/01/01(日) 00:54:43.69ID:IBkRXg2m
あけおめ ことよろ
0901デフォルトの名無しさん2017/01/01(日) 01:44:15.75ID:+58q/GTn
1) a = b
2) set a=b
3) if a=b then

困った事にこれら全てで=の意味合い異なるからな
0902デフォルトの名無しさん2017/01/01(日) 01:58:59.40ID:3P2/rHG+
1)と2)の違いはなんですか?
0903デフォルトの名無しさん2017/01/01(日) 02:09:52.45ID:V9m79CGb
>>902
値の代入かポインタの代入かの違い。
つまり

a = b
b = c

の場合はaにcの値は代入されないが、

Set a = b
b = c

の場合はaにもcの値が代入される。
0904デフォルトの名無しさん2017/01/01(日) 02:33:49.18ID:+58q/GTn
ちなVB.netだと2)の書き方なくなって1)の書き方に統一

値型と参照型で勝手に別れる
0905デフォルトの名無しさん2017/01/01(日) 02:59:58.37ID:5bQycJKK
>>903
Setと意味が違うとかいうなら、まず1)はLet a = bと書くべき
あと用語的にはポインタじゃなくて(オブジェクト)参照

aにもcの値が代入されるって言い方も誤解を招きそうだな
その書き方で代入されてるのはそのオブジェクトのデフォルトプロパティの値だぜ
書いてる本人はわかってると思うけど、aやbが参照しているインスタンスは変更されてない
0906デフォルトの名無しさん2017/01/01(日) 03:14:54.02ID:V9m79CGb
>>905
俺じゃなくて質問してるヤツに答えてやってくれよ先生。
0907デフォルトの名無しさん2017/01/01(日) 08:07:59.22ID:gq1qxslS
みんな明けましておめでとう。

なんかちょっと見ないうちに面白い話題になっているねー。

さて、ByRefやByValの効用が少し理解出来てきたところで
もう少しややこしいこと言ってもいいかな。

実は引数の参照渡しとか値渡しって
値型の値渡し、
参照型の値渡し、
値型の参照渡し、
参照型の参照渡しって4種類あって、
ByRef、ByVal以外に引数の型にも影響を受けるんだよ。

もっとも知ってる連中にとっては
「何を今更そんな基本的なことを」ってなるだろうけどね。
0908デフォルトの名無しさん2017/01/01(日) 08:35:13.71ID:+58q/GTn
>>905
letは書いてる人見たこと無いなあ

ES6で急に復活した感ある
0909デフォルトの名無しさん2017/01/01(日) 08:52:49.10ID:IBkRXg2m
>>907
俺の理解が正しいか 不安だから あえてレスしてみるけど

オブジェクト変数は 実体(インスタンス?)への参照を持ってるだけだから
参照型の・・・になるのかなと

↑この理解正しい?
0910デフォルトの名無しさん2017/01/01(日) 09:01:42.47ID:/jLTRoD+
すべての配列は参照型、とか言い出してみる
文字列はVB系では参照型じゃないんだっけ?
0911デフォルトの名無しさん2017/01/01(日) 09:36:42.89ID:Bm1fWS78
昨日参照渡しとか値渡しについて聞いた者です。
いつの間にか寝落ちしてました。
皆さん長時間にわたりレスをくれてありがとうございました。
皆さんのレスをもとにもう少し勉強してきます。
またよろしくお願いします。では。
0912デフォルトの名無しさん2017/01/01(日) 09:37:46.13ID:gq1qxslS
>>909
8割がた合っていると思う。
残り1割は既に>>910の人が言っている配列の話。
もう1割はインスタンスが設定されていない、
つまりNothingのときの挙動の違い。
0913デフォルトの名無しさん2017/01/01(日) 11:00:46.83ID:e0wFI4RY
>>906
お前の説明が誤解を招くってことなんだからお前にアンカーするのは当たり前
0914デフォルトの名無しさん2017/01/01(日) 11:42:41.40ID:3P2/rHG+
おめでとう。

紅白で有村かすみちゃんが気になったのですが、この映像にでている人はかすみちゃんですかね?
https://www.youtube.com/watch?v=yb_NTK0ixIg
0915デフォルトの名無しさん2017/01/01(日) 11:53:07.55ID:V9m79CGb
>>913
誤解を招かない解説を質問者にしろって事だよ。
0916デフォルトの名無しさん2017/01/01(日) 12:19:47.23ID:YlDkqvBj
>>910
固定長配列は宣言・定義したプロシージャ内では値型だと思う。
可変長配列は確かに参照型ともいえるけど他のプロシージャにByValで渡すとコピーが作られる。
0917デフォルトの名無しさん2017/01/01(日) 12:28:01.88ID:V9m79CGb
ここ読めばいいんじゃないか?
https://msdn.microsoft.com/ja-jp/library/dd314344.aspx
0918デフォルトの名無しさん2017/01/01(日) 12:45:42.22ID:pfVAI4Bk
>>910
vbaでは値型の配列じゃなかったっけ文字列は
byte型かなんかの
0919デフォルトの名無しさん2017/01/01(日) 13:42:34.82ID:sC1oVy1Z
何でByValしたかったんだろ。
セルに値書いて渡すとか、
行頭にPublic付けるとか、
理解できない人でも何とかなるのがVBAなのに。
0920デフォルトの名無しさん2017/01/01(日) 14:29:45.19ID:T039qKRQ
>>903の
>Set a = b
>b = c
>
>の場合はaにもcの値が代入される。
の
>b = c
この書き方はbにオブジェクトが紐付いている前提かつ
bに紐付いたオブジェクトにデフォルトプロパティがある場合に限られるから意味が違ってくる
Rangeオブジェクトとかで無意識に使う場合もあるから特殊とは言わんけど
初心者に値渡しや参照渡しを説明する際に出す例としては混乱の元
俺が混乱したし
0921デフォルトの名無しさん2017/01/01(日) 14:33:43.08ID:JAP1+tzF
>>915
> 誤解を招かない解説を質問者にしろって事だよ。
ダメ文章の典型やん...
1. (>>905 は)誤解を招かない解説を質問者に(たいして)しろって事だよ
2. 誤解を招かない解説を、質問者にしろって事(を俺は言ってるん)だよ
根本的に文章表現能力が低すぎる w
0922デフォルトの名無しさん2017/01/01(日) 14:40:57.88ID:V9m79CGb
>>920
だから他人の説明に横やり入れる前に、自分の言葉で一から十まで説明しろと言っているだろ。
0923デフォルトの名無しさん2017/01/01(日) 14:44:57.13ID:V9m79CGb
>>921
>(>>905 は)誤解を招かない解説を、質問者に(たいして)しろって事(を俺は言ってるん)だよ

一つにまとめられるんだが・・・。
09249092017/01/01(日) 14:50:05.64ID:IBkRXg2m
>>912
ありがと 80点か・・・・

残りの2割は 自分でも ちょっと消化しきれてないけども
まだまだ勉強足りんな俺
0925デフォルトの名無しさん2017/01/01(日) 14:58:22.01ID:T039qKRQ
>>922
俺は>>903に対して一言書きたかっただけだからね
それが本人に伝わったならどうでもいいよ
初心者にいきなりプロパティひっくるめて理解できるとは思えないし
0926デフォルトの名無しさん2017/01/01(日) 15:11:56.84ID:JAP1+tzF
>>923
それは 1. に冗長な言葉を追加してるだけ
ひょっとして 2. の意図を理解できてないのか?
マジでちょっと恥ずかしいレベルだぞ
0927デフォルトの名無しさん2017/01/01(日) 15:27:16.69ID:V9m79CGb
>>926
これは詳しく聞いてみたいわ。
>>921と>>923の三つの文例にどのような違いを見いだしているのか教えてくれ。
0928デフォルトの名無しさん2017/01/01(日) 15:53:55.51ID:X3hcI7Li
>>927
マジで文章理解力もないのか...
2. では解説するのは質問者な
0929デフォルトの名無しさん2017/01/01(日) 16:04:35.53ID:V9m79CGb
>>928
ああ、なるほどな。
全体から一部だけ切り出して日本語無視すれば、そう解釈出来るわな。

なんで1と2で同じ意味の文章を別の書き方してるのかと思ってたわ。
0930デフォルトの名無しさん2017/01/01(日) 16:14:29.40ID:pfVAI4Bk
元旦から細かいことで喧嘩すんなよ
0931デフォルトの名無しさん2017/01/01(日) 17:02:29.39ID:5bQycJKK
>>906
俺が元質問者に懇切丁寧に解説しろってか
初心者に誤解を招くような解説するならしない方がマシだと思ってるんだが

そもそも俺は>>901に同意してないんだがな
=に代入と比較の二つの意味がある事は確かだけど、SetもLetも代入として使われてる
だから1と2は意味的には同じだ
それでも比較と代入を区別する意味はあるが

お前の解説だと
Let a = b
Let b = c
と
Set a = b
Let b(.デフォルトプロパティ) = c
の比較なんだから、=の役割は全部代入演算子だぞ

で、これを大元の質問者に解説しても、初心者に理解できるとは思わんし
理解できるように説明するのもめんどくさい

ただ誤解を招く説明は嘘説明よりたち悪いと思ってるから説明したやつに指摘しただけ
0932デフォルトの名無しさん2017/01/01(日) 17:18:38.53ID:5bQycJKK
なんか他人ともりあがってるな
V9m79CGbの意図が、俺が元質問者に懇切丁寧に解説しろ じゃないなら知らんが
回答を批判されるのが嫌なら公開掲示板で回答するのやめとけ
公開されたものを批判するのと、質問に回答するのは別の話だ

自分で回答しないのに他人の回答を批判する権利がないなんて、すくなくともここでは間違ってるぞ
0933デフォルトの名無しさん2017/01/01(日) 17:25:59.04ID:YlDkqvBj
a = b
と
Set x = y
じゃ意味も違うと思うよ。
「どっちも代入」ではくくれない無視できない違い。
0934デフォルトの名無しさん2017/01/01(日) 17:37:59.02ID:V9m79CGb
Let a = b
Set a = b

が同じ物であるって方がよっぽど誤解を招く説明だよな。
少し前にByValとByRefの違いで大混乱していた初心者がいて、その流れをくんでの>>901なわけだから。

だいたい>>903で全部、代入として扱ってるのに「全部代入演算子だぞ」って突っ込みもおかしい。
俺の説明した範疇外で勝手に混乱して「誤解を招く!」って叫んでいる様にしか見えん。
0935デフォルトの名無しさん2017/01/01(日) 17:41:17.07ID:5bQycJKK
>>933
たしかにそれを区別する意味も必要な場合もあるんだけど
比較か代入かというより大きな区別があっての話だからな

代入での区別は、少なくともVBAではSetとLetで使い分けられてるわけで
その違いは=の違いというよりSetとLetの区別だとして考えるべきだと思ってる

これがVB.NETになるとどちらもLetになったから、参照型と値型の区別が重要になってくるんだがな
0936デフォルトの名無しさん2017/01/01(日) 17:52:33.88ID:5bQycJKK
>>934
お前の理論で行けば、値の代入と参照の代入はどこでどう区別されるの?
b=cはどっちの例でも値の代入(Let)なんだが、今説明すべきは値の代入か参照の代入かの違いのはずだが
0937デフォルトの名無しさん2017/01/01(日) 18:24:10.86ID:V9m79CGb
>>936
だんだん混乱してきたんだが、「どう区別される」ってのはどの範囲での話?

CPUの動きの時点でまず違うし、VBAの実装上でも扱い方が異なるし、
むしろどの範囲なら区別しないで済むのか分からない。

比較演算子と代入演算子の違いって事?
それなら「同じ演算子で異なる命令を扱える」だけだから誤解しているのは君だよ。
SetもLetも比較も、CPU上では別の命令に属している。
0938デフォルトの名無しさん2017/01/01(日) 18:36:58.36ID:5bQycJKK
>>937
お前にその区別ができてないとは言わないが
>値の代入かポインタの代入かの違い。
て言ってるのに
a = b
b = c
Set a = b
b = c
のどれが値の代入でどれが参照の代入でなぜそうなのかも言ってないし

>Set a = b
>b = c
>の場合はaにもcの値が代入される。
って言ってるし

どういう説明してるんだ、って話
0939デフォルトの名無しさん2017/01/01(日) 18:49:53.89ID:V9m79CGb
>>938
値の代入だの参照の代入だのポインタだのという専門用語を知らなくても、
Setがついているかどうかで動作が異なるという事が理解できればいいし、
内部的な動きについて説明しないのであればbに連動してaにも同じ値が代入されるという説明になるだろう。

そのままの解釈で飲み込んでも実用上の支障は無いし、そこに文句あるなら自分で解説してほしい。
君には「他人を批判する権利」はあるのかもしれないが、「面倒くさい事を他人に代行してもらう権利」はないんだぞ。
0940デフォルトの名無しさん2017/01/01(日) 19:55:56.36ID:5bQycJKK
>>bに連動してaにも同じ値が代入されるという
もしお前が本気でこう考えてるか、この表現で問題が無いと考えてるようならもういいや
こいつの言う事は信用するなって言うだけだ

面倒くさい事を他人に代行してもらおうという気は毛頭ないから
お前やだれかにそれを説明しろとか言わないから
0941デフォルトの名無しさん2017/01/01(日) 20:11:55.07ID:V9m79CGb
>>840
もちろん同じインスタンスを参照しているからaから取ろうがbから取ろうが同じ値になるって仕組みは十分に分かっているけども、
じゃあこれをインスタンスへの参照っていう「初心者が分からないであろう内部的な動作」を交えずに解説する場合、
どの様な言い回しにすれば君は満足なのか知りたいんだけど、君は面倒くさいから説明しないんだろ?

挙げ句の果てに何の論拠も示さずに相手を嘘つき呼ばわりしますって面白いなぁ君。
0942デフォルトの名無しさん2017/01/01(日) 20:13:11.54ID:V9m79CGb
あれ、アンカーミスった。
>>941は>>940へのレスね。
0943デフォルトの名無しさん2017/01/01(日) 20:32:27.31ID:5bQycJKK
>>941
根拠のない嘘つき呼ばわりなんてした覚えが無いがね
正確でない発言を問題ないと思ってる人間の意見は信用するなって言ってるんだが

自分が正確に説明できないのを指摘されたら、他人にそれを説明しろってか
お前にも面倒くさい事を他人に代行してもらう権利なんてないよ

ま、この件はもうこれ以上進展なさそうだし終わりにしとくわ
0944デフォルトの名無しさん2017/01/01(日) 20:46:14.71ID:V9m79CGb
>>943
君もLetとSetは同じだとか正確でない事を散々主張してたから、
君が君自身を信用してはならない事になるんだけども。

まぁ面倒くさいとか言って「初心者向けの正確な説明」を提出しない以上は進展しないから、終わりにするのは妥当だね。
0945デフォルトの名無しさん2017/01/01(日) 23:00:13.48ID:x0zVv2ho
ユーザーフォームのマルチページで、****の時は、マルチページのPAGE1と3表示して、2と4は非表示とか可能でしょうか?
非表示でなくても操作できなくするとかでもいいです。
0946デフォルトの名無しさん2017/01/01(日) 23:06:53.93ID:zRBSr+lh
やったこと無いからどうか知らんけど、propertyにvisible って項目があるんだから
それをいじって見たら?
0947デフォルトの名無しさん2017/01/01(日) 23:07:46.87ID:V9m79CGb
>>945
Me.MultiPage1.Page1.Visible = False

という形で表示をいじれるみたいだから、これでどうにかなんじゃね。
0948デフォルトの名無しさん2017/01/01(日) 23:27:01.74ID:x0zVv2ho
>>946 >>947 ありがとうございました。
Me.MultiPage1("Page1").Visible = False
でとりあえず消せました。 IFで条件式つけます。
0949デフォルト@名無しさん2017/01/02(月) 04:13:03.73ID:elgXG22T
はじめまして。どなたかskypeでもしながらvbaの相談に乗って下さる方はいらっしゃいますでしょうか…orz
学校の課題がどうしてもできないのです。レベルは初級です。IDに関しては、スカイプちゃんねるというサイトで行っておりますので、もしよろしければ一度見てみて下さい(>_<)
0950デフォルトの名無しさん2017/01/02(月) 07:13:33.09ID:fgOT9KPs
朝のソフト組み (・∀・) 始めるかぁ
0951デフォルトの名無しさん2017/01/02(月) 21:07:00.46ID:ltYDHoJ8
>>949
面倒臭い
ここで聞けばいいのに
0952デフォルトの名無しさん2017/01/02(月) 21:29:23.34ID:X/Pb2mwH
相談はこのスレで、レスがつくまでskypeでつなぐんだと思う
0953デフォルトの名無しさん2017/01/02(月) 22:33:33.37ID:Jdu9t/FU
こちらにどんな利点があるのかと言う話
かりに>>949が女でおまんこさせてくれるとしても微妙なラインぞ
0954デフォルトの名無しさん2017/01/02(月) 22:51:26.67ID:t/0ToDE8
つか、課題ならアップしてみては。
課題なので解答はしないけど、ヒントくらい出しますよ。分かれば、だけど。
0955デフォルト@名無しさん2017/01/02(月) 23:43:11.39ID:elgXG22T
949の者です。
ここで募集して、メールなり、スカイプのチャットなり(?)で自力で考えた解答をとりあえずお送り致しますので、
スカイプで添削兼、質問と相談に乗って頂きたいと思っております。
ここの版で直接書き込まないのは、質問が多岐に渡るのと、プログラムの、どの要所を載せれば治るのかがよくわからないからです…。
あとここでもし質問して、それが皆様にとって超簡単だとしたら、
「そんなこともわからねーのかよググレカス!」とか言われたらどうしようっていうのがあります(> <)


内容はifの条件分岐あたりになります。
確かにメリットが皆様になく、申し訳ないのですが、私に付き合って下さるというお優しい方いらっしゃいましたら、よろしくお願いします。

もしいらっしゃいましたら、すかいぷちゃんねるというサイトでvbaのタグを検索したら、
私が出てくるはずです!
http://skypech.com/post/finish?id=9894733
0956デフォルトの名無しさん2017/01/02(月) 23:55:25.73ID:ltYDHoJ8
面倒見いからオイラはパス
0957デフォルトの名無しさん2017/01/03(火) 00:00:05.94ID:KKVFl3k5
>>955
Skypeだろうとも罵倒するやつは罵倒する
どこで聞いても同じだよ
0958デフォルトの名無しさん2017/01/03(火) 00:43:43.22ID:3mqXOGxM
>956,957様

うう…そうなのですか…
わかりました、勇気を出してここで聞いてみます

Private Sub CommandButton1_Click()
If CheckBox1 Then
y = 500 + 300 + 200←�@ 
If CheckBox2 Then
y = 500 + 300
ElseIf CheckBox3 Then
y = 500 + 200
Else
y = 500←�@'
End If
End If

If CheckBox2 Then←�A
y = 300 + 200 + 500←�@
 If CheckBox1 Then
 y = 300 + 500
 ElseIf CheckBox3 Then
 y = 300 + 200
Else
 y = 300←�@’
End If
End If
0959デフォルトの名無しさん2017/01/03(火) 00:45:05.92ID:3mqXOGxM
続きです。

If CheckBox3 Then←�A’
y = 200 + 300 + 500←�@
 If CheckBox1 Then
  y = 200 + 500
 ElseIf CheckBox2 Then
  y = 200 + 300
 Else
 y = 200←�@’
End If
End If
y=200+300+400←�B

Label1.Caption = y
End Sub

これはユーザーフォームを作って計算機を作り、
チェックボックス1…500
チェックボックス2…300
チェックボックス3…200 をそれぞれ選択したり,そして加算できるようにしたいのです。

(質問�@)�@と�@’の値を入れ替えるとエラーがでた。上記だとうまく計算できた。
     最初の�@にはy=500、y=300,y=200が正しいはずなのになぜか?
(質問�A)If、IfElse,Elseではエラーがでた。なぜ三段全てIfでないと作動しなかったのか?
(質問�A続)If CheckBox1 Then と If CheckBox1.Value=True Thenの違いはあるか?
(質問�B)上記の文は不適切だが、現状ではチェックボックス3つのうち2つまでなら加算できるが、チェックボックス3つ全てを合計することはできない。どうすればいいのか?
0960デフォルトの名無しさん2017/01/03(火) 00:53:33.27ID:r2luLCsm
>チェックボックス1…500
>チェックボックス2…300
>チェックボックス3…200

自分でヒント書いてて気づかないのかよ。
0961デフォルトの名無しさん2017/01/03(火) 01:04:57.30ID:KKVFl3k5
>>959
(質問�@)
プログラムとしては正常となるはず
エラーとは計算ミスのことを言ってる?
異なるならどんなエラー?

(質問�A)
IfElseは存在しないためエラーとなる
elseifとすればよい

(質問�A続)
同等

(質問�B)
sub otameshi()
dim y as long
y=0
if chkbox1 then y=y+500
if chkbox2 then y=y+300
if chkbox3 then y=y+200
Label1.Caption = y
End Sub
0962デフォルトの名無しさん2017/01/03(火) 01:07:35.09ID:3mqXOGxM
>960様
えっ、なぜこれがヒントになるのですか…?
0963デフォルトの名無しさん2017/01/03(火) 01:14:58.48ID:la84XY8q
>>961
良い解答。
0964デフォルトの名無しさん2017/01/03(火) 01:26:38.41ID:/ZQ7wvWM
if文くらい検索すれば、いいだけだろ
0965デフォルトの名無しさん2017/01/03(火) 01:44:32.13ID:3mqXOGxM
>961様
御解答して下さり、ありがとうございます。
(質問�B)の解答だけで、そのまま全て計算できてしまうのですね…
これは、同列(?)のifの場合、if or if or ifという概念ではなくて、if and if and ifという事なのかなと思いました。
私は、check1を選択→残りは2か3→2を選択した場合、3を選択した場合、その他全てという風に考えてしまっていました。

すみません、961様の解答からの質問なのですが、
(質問�@)�@と�@‘の値を入れ替えると、それぞれ単体のボックスのみのチェックで1000と計算、
check1+check2=800,check1+check3=700、check2+check3=500とあられもない数で計算されてしまうのです…
(質問�A)�Aの箇所をそれぞれElseIf,Elseとすると、「対応するIfがありません」
となってしまうのです。
(質問�B)961様の解答が物凄くシンプルで、本来こちらでやるべきとは思うのですが、私の考え方で3つの合計数を出す方法はあるのでしょうか?もしくは、そもそも私の考えが間違っているので、表しようがないのでしょうか…?、

正直、私の質問は皆様にとって非常に面倒臭いと改めて思いましたので、次回より、地域の家庭教師などを探してみたいと思います。ですので、もう少しだけお付き合いください(><)
0966デフォルトの名無しさん2017/01/03(火) 02:22:21.02ID:MjeJ10xl
ここ人気スレだな。つかったことないけど。
>>958〜ではダメだろ?
分岐・分類がうまくできてないだろ。
どれか一つだけ入力されてたら1000にならないか?
0967デフォルトの名無しさん2017/01/03(火) 02:26:53.48ID:MQ1FjY+h
Private Sub CommandButton1_Click()
If CheckBox1 Then
y = 500⑴
If CheckBox2 Then
y = 500 + 300⑵
ElseIf CheckBox3 Then
y = 500 + 200⑶
Else
y = 500 + 300 + 200⑷
End If
End If

⑴はcheckbox1にチェックが入ったとき計算
⑵はcheckbox1と2にチェックが入ったとき計算
⑶はcheckbox1と3にチェックが入ったとき計算
⑷はcheckbox1にチェックが入ったとき計算
単体のcheckbox1の条件でチェックが入った時点で⑴と⑷が実行されてしまうから変な計算になる
f8キーで1行ずつテストする癖をつけたほうがいい

Elseは英語で〜のほかにって意味だから
if 〜 then(もし〜なら)
elseif 〜 (ほかにもし〜なら)
みたいに、前に単体のifがないとエラー出る

コードは単純にシンプルな方が見やすい

vbaの家庭教師はいないと思うから、おそらく世界一詳しいGoogle先生に聞いた方が早いし安い
0968デフォルトの名無しさん2017/01/03(火) 02:28:25.36ID:9Y8iTik6
もともとやりたいのはこんな感じかな?

Private Sub CommandButton1_Click()

Dim myBox1 As Long
Dim myBox2 As Long
Dim mybox3 As Long
Dim y As Long

If CheckBox1 Then
myBox1 = 200
End If

If CheckBox2 Then
myBox2 = 300
End If

If CheckBox3 Then
mybox3 = 400
End If

y = myBox1 + myBox2 + mybox3

Label1.Caption = y
End Sub
0969デフォルトの名無しさん2017/01/03(火) 02:33:04.36ID:MjeJ10xl
もともとやりたいのは、足し算は使ってはいるが、分岐のみで確定値をもとめたいということでは?
0970デフォルトの名無しさん2017/01/03(火) 02:39:10.88ID:MjeJ10xl
仮想コードだとこうか?


if(A) {
if(B) {
// AかつBのとき
if(C) y=1000; else y = 500 + 300;
}
else {
// AかつBでないのとき
if(C) y=500+200; else y = 500;
}
}
else {
// AでないかつBでないのとき
if(C) y=200; else y = 0;
}
0971デフォルトの名無しさん2017/01/03(火) 02:39:52.85ID:MjeJ10xl
すまん。なんかちがうか? 
0972デフォルトの名無しさん2017/01/03(火) 02:42:47.59ID:1zAQlgGH
>>965 �Bの答えだけど
めんどくさいだけで なんのメリットもないぞ
If CheckBox1 Then
  If CheckBox2 Then
    If CheckBox3 Then
      Y = 500 + 300 + 200
      Else
      Y = 500 + 300
    End If
    Else
    If CheckBox3 Then
      Y = 500 + 200
      Else
      Y = 500
    End If
  End If
Else
  If CheckBox2 Then
    If CheckBox3 Then
      Y = 300 + 200
      Else
      Y = 300
    End If
    Else
    If CheckBox3 Then
      Y = 200
      Else
      Y = 0
    End If
  End If
End If
0973デフォルトの名無しさん2017/01/03(火) 02:43:32.61ID:MjeJ10xl
これでいいかと・・・



if(A) {
if(B) {
// AかつBのとき
if(C) y=1000; else y = 500 + 300;
}
else {
// AかつBでないのとき
if(C) y=500+200; else y = 500;
}
}
else {
if(B) {
// AでないかつBのとき
if(C) y=300+200; else y = 300;
}
else {
// AでないかつBでないのとき
if(C) y=200; else y = 0;
}
}
09749682017/01/03(火) 02:46:27.46ID:9Y8iTik6
>>965
ごめん、よく分かってないのでコメント控えるけど、別にスレ的には良いんじゃないでしょうか。
そろそろ次スレ立ててくる。
0975デフォルトの名無しさん2017/01/03(火) 02:53:18.87ID:9Y8iTik6
次スレ
Excel VBA 質問スレ Part45 [無断涛]載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1483379476/
0976デフォルトの名無しさん2017/01/03(火) 02:53:39.98ID:r2luLCsm
>>962
こうやって改変すりゃ答えになるから。

>チェックボックス1…500
>チェックボックス2…300
>チェックボックス3…200
    ↓↓↓
If チェックボックス1 Then A…500 Else A…0
If チェックボックス2 Then B…300 Else B…0
If チェックボックス3 Then C…200 Else C…0
ラベル1キャプション…A+B+C

もう961が似たような答え書いちゃってるけどね。
0977デフォルトの名無しさん2017/01/03(火) 03:07:22.55ID:r2luLCsm
というか・・、

>学校の課題がどうしてもできないのです。
>私の考え方で3つの合計数を出す方法はあるのでしょうか?
>もしくは、そもそも私の考えが間違っているので、表しようがないのでしょうか

そもそも、学校の課題で、何を求められているかで変わると思うけど。
何でも良いから答えを出せってことなら、>>961で終了。
0978デフォルトの名無しさん2017/01/03(火) 03:14:21.95ID:1zAQlgGH
>>970 >>973
回答は せめてVB系の構文で 書いてもらえるかな 質問者が混乱するから
0979デフォルトの名無しさん2017/01/03(火) 03:20:02.02ID:3mqXOGxM
>966様、967様、968様
皆様ご丁寧に解答して下さってありがとうございました。

967様の解答を聞いて、
・1にチェック→2or3にチェック→その他とは、1単体or123全てをチェック
・入れ子にしてしまうと1かつ2,1かつ3、1単体、というように1が絶対入ってしまうが、それぞれ独立したifにすると
 1を選択orしなかった場合、2を選択orしなかった場合、3を選択orしなかった場合、というように抽象的な事象が同時に存在することがわかった。
・従って、それぞれの事象が同時に存在できることが新しく理解でき、また私の方法ではその他から1単体を切り離す作業が必要になりますので、適切ではなく、961様、965様のようなシンプルな解答になるのだということに行きつきました。

(ちゃんと理解できてますでしょうか…??)

もし合ってそうでしたら、皆さま非常に親切にご回答頂き、ありがとうございました。
またお世話になってしまう&ご迷惑をおかけしてしまう可能性が十分にあるのですが、その時はよろしくお願い致します。
0980デフォルトの名無しさん2017/01/03(火) 05:54:17.23ID:/ZQ7wvWM
checkBox1,2,3 があるとき、フラグ・真偽値をTrue, False で表すと、
すべての組み合わせは、2の3乗

1 2 3
F F F
F F T
F T F
F T T

T F F
T F T
T T F
T T T
0981デフォルトの名無しさん2017/01/03(火) 08:17:52.06ID:KKVFl3k5
>>979
質問スレなんだから質問が迷惑となることはない
気になることを聞けばいい

お前みたいにやりたい事と現状と自分の考えを述べてくれる質問なら回答側もやりやすい
0982デフォルトの名無しさん2017/01/03(火) 11:14:55.29ID:wnrnHeuT
うめ
0983デフォルトの名無しさん2017/01/03(火) 22:42:43.33ID:v/nbA2QD
あめ
0984デフォルトの名無しさん2017/01/04(水) 06:09:09.73ID:a8j3oUUf
かめ
0985デフォルトの名無しさん2017/01/04(水) 09:05:25.75ID:/4cm7e5r
おめ
0986デフォルトの名無しさん2017/01/04(水) 11:17:19.55ID:QaTHv5+Z
週間スケジュールを作りたいです。

シートが7つあって、全シートのB3にToDoを書き込むセルがあります。
どのシートのToDoを変更しても全てのシートのToDoが連動して変更されるようにしたいです。
コードを教えていただけないでしょうか。
0987デフォルトの名無しさん2017/01/04(水) 11:57:23.66ID:zmi2V8Wc
>>986
目的はよしとして
より具体的に動作を表現して。
0988デフォルトの名無しさん2017/01/04(水) 11:58:47.15ID:0ISnzSv/
全シートにWorksheet_Change置いて変更箇所がB3だったら全シートに反映でいいんじゃね
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sheet As Worksheet
Application.EnableEvents = False
If Target.Address = "$B$3" Then
For Each Sheet In ActiveWorkbook.Worksheets
If Not ActiveSheet Is Sheet Then
Sheet.Range(Target.Address).Value = Target.Value
End If
Next
End If
Application.EnableEvents = True
End Sub
0989デフォルトの名無しさん2017/01/04(水) 12:09:38.67ID:0ISnzSv/
ThisWorkbookにWorkbook_SheetChange置いた方がいいな
0990デフォルトの名無しさん2017/01/04(水) 12:11:00.06ID:QaTHv5+Z
>>987
>>988
全シート反映でうまくいきました。
大変助かりました。
ありがとうございます。
0991デフォルトの名無しさん2017/01/04(水) 17:37:41.78ID:HpCJaqNh
梅
0992デフォルトの名無しさん2017/01/04(水) 18:47:36.88ID:DnLPHx3K
松
0993デフォルトの名無しさん2017/01/04(水) 19:04:14.05ID:S3/LF5h5
竹
0994デフォルトの名無しさん2017/01/05(木) 11:48:17.32ID:gvhgNrtK
うめてんてー
0995デフォルトの名無しさん2017/01/05(木) 12:58:45.55ID:rordfoes
おちろ!
0996デフォルトの名無しさん2017/01/05(木) 13:54:27.06ID:p9OTJbgP
質問ですが
0997デフォルトの名無しさん2017/01/05(木) 13:54:43.65ID:p9OTJbgP
よろしいでしょうか?
0998デフォルトの名無しさん2017/01/05(木) 14:05:52.06ID:3kVSXnTB
うめ
0999デフォルトの名無しさん2017/01/05(木) 14:12:04.11ID:K3UYemjT
Next スレ
1000デフォルトの名無しさん2017/01/05(木) 14:12:22.11ID:K3UYemjT
End Sub
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 48日 6時間 47分 40秒
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。