トップページtech
1001コメント393KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2015/01/09(金) 16:59:02.80ID:GzFHQ3J4
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

前スレ:Excel VBA 質問スレ Part35
http://peace.2ch.net/test/read.cgi/tech/1414186311/

関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0002デフォルトの名無しさん2015/01/09(金) 17:00:05.94ID:GzFHQ3J4
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
17 http://hibari.2ch.net/test/read.cgi/tech/1289182437/
18 http://hibari.2ch.net/test/read.cgi/tech/1298240666/
19 http://hibari.2ch.net/test/read.cgi/tech/1305754555/
20 http://hibari.2ch.net/test/read.cgi/tech/1312435844/
0003デフォルトの名無しさん2015/01/09(金) 17:00:35.92ID:GzFHQ3J4
21 http://hibari.2ch.net/test/read.cgi/tech/1316931607/
22 http://toro.2ch.net/test/read.cgi/tech/1322400978/
23 http://toro.2ch.net/test/read.cgi/tech/1327763113/
24 http://toro.2ch.net/test/read.cgi/tech/1334305148/
25 http://toro.2ch.net/test/read.cgi/tech/1341722983/
26 http://toro.2ch.net/test/read.cgi/tech/1345363310/
27 http://toro.2ch.net/test/read.cgi/tech/1353842387/
28 http://toro.2ch.net/test/read.cgi/tech/1359607536/
29 http://toro.2ch.net/test/read.cgi/tech/1364689772/
30 http://toro.2ch.net/test/read.cgi/tech/1370088822/
31 http://toro.2ch.net/test/read.cgi/tech/1376371376/
32 http://toro.2ch.net/test/read.cgi/tech/1381151995/
33 http://peace.2ch.net/test/read.cgi/tech/1382015080/
34 http://peace.2ch.net/test/read.cgi/tech/1403911485/
35 http://peace.2ch.net/test/read.cgi/tech/1414186311/
0004デフォルトの名無しさん2015/01/09(金) 17:28:33.56ID:BcP6vX0h
テンプレを改悪した上での重複スレです
正しい次スレはこちらです
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0005デフォルトの名無しさん2015/01/10(土) 23:41:25.43ID:xy8zfnqH
vbaプロジェクトのパスワードを忘れてしまったのですが
メモ張から見てわかりますでしょうか
0006デフォルトの名無しさん2015/01/11(日) 02:32:30.02ID:RQUzAnWc
>>5
このスレはテンプレが絶対です。
あなたの質問は>>1★2に抵触します。
VBAの質問で無ければ例え雑談と言えどもスレ違いとなりますので、他でやって下さい。
0007デフォルトの名無しさん2015/01/11(日) 13:10:14.57ID:tSIQw0Ly
昔のブックならどこかにパスの文字列が表示されたけど
今はなにかしらのコーディングがされてるはず
0008デフォルトの名無しさん2015/01/11(日) 15:49:05.34ID:FbuCuKO8
VBAのユーザフォームを利用して、
フォルダ選択画面を出してファイル選択をしたいんだか、
そんなツールボックスってある?
0009デフォルトの名無しさん2015/01/11(日) 16:01:58.35ID:KxuOmHMJ
GetOpenFilename
0010デフォルトの名無しさん2015/01/12(月) 11:15:48.18ID:RtAs6kiO
>GetOpenFilename
Thanks!
これを使えばユーザーフォームのコントロール(ツールボタン?)から
CommandButtomでファイル名選択、取得出来ることはわかったんですが、
CommandButtom以外にエクスプローラのような形式で選択できる
コントロールフォームはあるのですか?
0011デフォルトの名無しさん2015/01/12(月) 13:03:43.73ID:b1cfo7LI
フォルダを選択するのに FileDialog
ファイルをセーブするのに GetSaveAsFilename
0012デフォルトの名無しさん2015/01/12(月) 14:23:59.22ID:RtAs6kiO
メルシーボク!
ラージャー
今休日作戦実施中だがなにせ二等兵の見習いなんで。。。

イメージとしては、ユーザホーム上でフォルダーやファイルを選択する
ボタンやリストを乗っけて、そこからフォルダー名、ファイル名をを取得して、
選択したファイルに対して、行数カウントやらセル値操作をするボタンを
乗っけるというイメージ
(いろいろファイルを選択して、最後はOKボタンで処理実行のイメージ)

前段の

> フォルダを選択するのに FileDialog
> ファイルをセーブするのに GetSaveAsFilename

はなんとかできそうなんですが、
これらから取得した変数を次のフォーム(CommandButtom等)に引き渡せないでござる。
どうしてもだめならば、一つのボタンで、全処理実行した方いいかな。。。
0013デフォルトの名無しさん2015/01/12(月) 14:41:53.61ID:fKsWZoh+
つ グローバル変数
0014デフォルトの名無しさん2015/01/12(月) 15:21:26.81ID:RtAs6kiO
らーじゃー

public finenam01 As String

ってな感じで

いくつかの

sub xxxxxxx ()
End Sub

内でまたいで使用するってな感じでよろしいでんがな?
0015デフォルトの名無しさん2015/01/12(月) 16:23:20.27ID:32vMhpLc
A〜Zまでのエクセルブックがあるとします。

Aのエクセルブックには更新の起点となるVBAマクロがあります。
A〜Zには他のエクセルのセルやシートを参照したり変更したりしている状態になっています。

こういった状態の相関関係が複雑になってしまっているものを、チャート化するようなVBAマクロってないですか?
0016デフォルトの名無しさん2015/01/12(月) 16:33:37.49ID:32vMhpLc
相関関係ができているごちゃごちゃなエクセルファイルの連携を自動で調べたいの
どこのエクセルマクロがどこをいじって、その結果どこが影響を受けて・・・というのを
0017デフォルトの名無しさん2015/01/12(月) 16:43:32.25ID:b1cfo7LI
何を書いているのか何を言いたいのかさっぱり判らない
0018デフォルトの名無しさん2015/01/13(火) 11:52:36.91ID:lD3kwP9C
>>15-16
言いたいことは分かったけど
そういう機能を備えたVBAマクロが存在してるかどうかは知らない
(世界中で色んな人が色んなマクロ作ってるんだから、
どこにどんなマクロが存在しているのかなんて誰にも分るわけがない)

自前で作る事は理論上は可能だと思うけど、俺にはできない

小規模なものならできるだろうけど、
例えばひとつのブックが他のブックから数万セルの参照を受けてる、
それが数十個ある、みたいな場合に
全体の状況をチャート化するとかとてもじゃないが無理
0019デフォルトの名無しさん2015/01/13(火) 15:44:10.28ID:HMyF52zP
JSのライブラリのように知らない人のマクロをネットから使うんだろうか
0020デフォルトの名無しさん2015/01/13(火) 19:03:56.97ID:JHzht5gP
VB対応のクロスリファレンス出すようなツールは見たことあるけど
それをEXCEL VBAで複数ブック対応でグラフィカル表示出来ればいいんだろ

まあ、探せば誰か作ってるかもしれん
0021デフォルトの名無しさん2015/01/13(火) 23:15:59.28ID:NDl0wVUr
>>20
Accessだとそんな感じのツールは見かけたことがある。
0022デフォルトの名無しさん2015/01/14(水) 20:42:54.30ID:uhw4RigZ
質問です。

A  B  C  D  E
1 あ い う え お
2 か き く け こ



こういうシートがあったとします。
この場合一番最後の行は2行目ですが、別シートからの文章を、
一番最後の行からさらに指定した行の下に持って期待と思っております
例えば【最後の行から1行下に「さしすせと」と入力】と行った場合、
図の4行目に「さしすせそ」が入力されるといった具合です。

こういった「指定したシートの一番最後の行から、さらに指定した行を空けて文章を
入力する、持ってくる」ことができるようなメソッドはありますでしょうか?
わかりづらかったら申し訳ありません。
指摘して頂ければお答えいたします。よろしくお願いいたします。
0023デフォルトの名無しさん2015/01/14(水) 21:43:19.63ID:zsXJlWOx
現在の最終行を知るのは
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
で出来る
後はそういうロジックを自分で作ればいい
0024デフォルトの名無しさん2015/01/15(木) 08:01:20.21ID:2+tcuFL8
コピー&挿入貼り付け に関して一行で実現できますか?
Range(Cells(3, 1), Cells(LastRow, 7)).Copy Range(Cells(3, 1), Cells(LastRow, 7)).Insert
と書いて実行してもエラーが出ます
Rows("3:LastRow").Copy Rows("3:LastRow").Insert
行コピーでもいいんですが、やはりエラーが出ます
0025デフォルトの名無しさん2015/01/15(木) 17:08:28.33ID:TM6j+YgZ
改行しないと無理でしょ
まあ「: 」(コロン)でつないでやればできるけど

ただ、コード見る限りセル範囲Aの真下に同じものを複製したいだけで、セル範囲Aの下にデータはないみたいだから
copyしてinsertなんてせずに、
Cellsの引数のLastRowをLastRow+1にするなり
コピー元のセル範囲を変数に入れといてそれをoffsetするなり
したセル範囲に代入するのがいいんじゃない
0026デフォルトの名無しさん2015/01/15(木) 20:08:01.85ID:0Z20SaSZ
質問スレではなく、Excel VBA 初心者相談スレが必要だなと、たまに思う
0027デフォルトの名無しさん2015/01/15(木) 21:27:14.27ID:oKiGnD+E
Option Explicit
Sub 請求書作成()
Dim i As Integer
Dim Cnt As Integer
Dim Kokyaku As String
Cnt = 12
Kokyaku = "A商事"
Worksheets("請求書雛形").Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = Kokyaku
Worksheets(Kokyaku).Range("A6").Value = Kokyaku
Worksheets(Kokyaku).Range("E2").Value = Date
For i = 4 To 32
If Worksheets("販売").Cells(i, 2).Value = Kokyaku Then
Worksheets(Kokyaku).Cells(Cnt, 1).Value = Worksheets("販売").Cells(i, 1).Value
Worksheets(Kokyaku).Cells(Cnt, 2).Value = Worksheets("販売").Cells(i, 3).Value
Worksheets(Kokyaku).Cells(Cnt, 3).Value = Worksheets("販売").Cells(i, 4).Value
Worksheets(Kokyaku).Cells(Cnt, 4).Value = Worksheets("販売").Cells(i, 5).Value
Worksheets(Kokyaku).Cells(Cnt, 5).Value = Worksheets("販売").Cells(i, 6).Value
End If
Next i
End Sub

これでオブジェクトエラーが生じるんですけど、何故だかわかりますか?
一応参考書どおりなはずなのですが・・・
0028デフォルトの名無しさん2015/01/15(木) 23:22:06.84ID:zINY+dXI
その名前のワークシートはあるの?
0029デフォルトの名無しさん2015/01/16(金) 09:09:55.19ID:xsGnLZU7
Excel2010で
ファイル  -> オプション
で開くウインドウをVBAで表示させることは出来ますか?
0030デフォルトの名無しさん2015/01/16(金) 09:20:15.90ID:vvO7Vwb+
Range("12:15").Select と
Rows("12:15").Select って
何が違うの?
0031デフォルトの名無しさん2015/01/16(金) 12:51:04.35ID:iLAQhcb3
>>30
その使い方だと結果は変わらない。が、
Range("12:15")(1).Select
Rows("12:15")(1).Select
って感じにやると結果が変わってくる。
また、Rowsで返されたものは行単位以外での絞り込みができなかったり。
ちなみにCellsプロパティを介せば一般的なRangeに戻すことができる。
0032デフォルトの名無しさん2015/01/17(土) 08:28:37.34ID:j2k9zBKy
excelでvbaを持ったbook1を開いているとします。
この状態で別の自作のアプリ(c++、c#,vbなどなんでもよい)からそのexcelに対してvbaの関数を
実行するように指示を送るような方法は有りますか?
0033デフォルトの名無しさん2015/01/17(土) 09:44:55.34ID:pPtCgDJH
自作アプリからEXCELを起動して操作するなら可能
既に起動されてるEXCELだとそのオブジェクトを認識出来れば操作可能と思われる
0034デフォルトの名無しさん2015/01/17(土) 10:34:27.93ID:j2k9zBKy
>>33
>既に起動されてるEXCELだとそのオブジェクトを認識出来れば操作可能と思われる
その具体的な方法が知りたいのですが、ヒント教えて下さい。
0035デフォルトの名無しさん2015/01/17(土) 11:55:05.34ID:gnkFi13Q
VB.NETならGetObject関数で取れる。WSHも同名関数で。
APIならCoGetClassObject辺りか?
0036デフォルトの名無しさん2015/01/17(土) 12:24:39.93ID:EcNq8Nj3
>>34
操作したい言語毎にやり方が違うんで、

excel C#

のように、excelと言語名でぐぐれば出てくる
0037デフォルトの名無しさん2015/01/17(土) 13:55:33.92ID:MaJzmOfh
例えば8行目から15行目までを選択するのをマクロの記録だと
Rows("8:15").Select
D列からF列までを選択するのをマクロの記録だと
Columns("D:F").Select
となるんですが、
これを変数を用いて範囲指定出来るようにしたい

どうすれば良いでしょうか
0038デフォルトの名無しさん2015/01/17(土) 14:04:37.65ID:pPtCgDJH
RowStart=8
RowEnd=15
Rows(RowStart & ":" & RowEod).select
こんな意味?
0039デフォルトの名無しさん2015/01/17(土) 14:16:54.43ID:MaJzmOfh
>>38
ありがとう
ついでに列の指定を教えてください
同じように
colStart = 2
colEnd = 5
Columns(colStart & ":" & colEnd).Select
としてみたら
アプリケーション定義またはオブジェクト定義のえらーです。
となりましたorz
0040デフォルトの名無しさん2015/01/17(土) 14:24:25.49ID:pPtCgDJH
 Range(Columns(1),Columns(3)).Select  列AからCまでを選択
0041デフォルトの名無しさん2015/01/17(土) 14:30:53.52ID:MaJzmOfh
>>40
感謝です!
0042デフォルトの名無しさん2015/01/17(土) 14:34:15.75ID:pPtCgDJH
RowをColumnと同じ形にして統一した方がいいかもね
0043デフォルトの名無しさん2015/01/17(土) 17:28:25.92ID:hqZjO6ML
やばい、うんこしたくなってきた
0044デフォルトの名無しさん2015/01/17(土) 18:48:46.62ID:bx3UtG1o
フォーム上のボタンを押したとき
ドラクエの魔法を唱えたときのように
画面全体がピカッと光るようにしたいんですが
どうしますか?
0045デフォルトの名無しさん2015/01/17(土) 19:16:52.52ID:ZQUumRCv
>>44
パルプンテ
0046デフォルトの名無しさん2015/01/17(土) 19:58:13.44ID:gEqaKlFU
見えてる範囲のセルを選択・選択しないを繰り返す
0047デフォルトの名無しさん2015/01/18(日) 02:21:02.84ID:wo+YRjYB
ボタンを押したと同時に死ねばいいよ
0048デフォルトの名無しさん2015/01/18(日) 03:30:36.60ID:gjAl9y8i
Likeパターンマッチングで、「*」は任意の数の文字だけど
任意の数の数字にするにはどうしたら良いですか?Likeで表現出来ますか?
0049デフォルトの名無しさん2015/01/18(日) 04:35:13.10ID:nKsy5XPl
isnumeric()
0050デフォルトの名無しさん2015/01/18(日) 06:26:22.69ID:1pf3AaGo
>>48
like句はググって出ないならないんじゃないかな。知らないけど。
regexpをグローバルで用意して、使いやすいように関数にしておけばいいよ
0051デフォルトの名無しさん2015/01/18(日) 14:47:21.05ID:8CHX/Z2W
http://www.tipsfound.com/VBA/07009.vbhtml
指定したシートのセルの罫線を取得する
Dim bs As Borders
Set bs = Range("A1").Borders

http://www.tipsfound.com/VBA/07010.vbhtml
指定したシートのセルに罫線を設定する
Dim bs As Borders
Set bs = Range("A1").Borders



とあるのですが、よくわかりません
何をしたいのかというと、罫線のみのコピー&ペーストです
あるセルの罫線を「取得」してこれを変数bsに格納
そしてこのbsを使って別のセルに罫線を「設定」しようと思っているのですが
取得も設定も同じ説明になっていてよくわかりません
こういった方法ではできないのでしょうか
0052デフォルトの名無しさん2015/01/18(日) 15:20:23.02ID:nKsy5XPl
>>51
3行目のbs.LineStyle = のとこで設定
0053デフォルトの名無しさん2015/01/18(日) 19:43:14.12ID:7UXmT3Sg
EXCEL2010と2013の両方がインストールされているWin7環境で、
例えばEXCEL2010を起動した時に、他にもEXCEL2010やEXCEL2013の
プロセスが実行中かどうか知る方法はありますか?
プロセスの取得自体なら出来そうですが、その中にEXCEL.EXEがあった
として、それが2010なのか2013なのか、どうやれば区別できるのか
分りません。良いアディアが有れば教えて下さい。
0054デフォルトの名無しさん2015/01/18(日) 19:58:55.01ID:ENvWPWHO
WMIのWin32_Process辺りでいけるんじゃない?
EXEのフルパスさえ取れれば何とかなるでしょ。
0055デフォルトの名無しさん2015/01/19(月) 02:34:29.99ID:aeY3ubQM
powershell_ise を使って、TeraPad について調べてみた
$p = get-process TeraPad

$p.Name
TeraPad

$p.Description
TeraPad

$p.FileVersion
1.0.9.0

$p.Path
C:\Users\Owner\Desktop\TeraPad109\TeraPad.exe
デスクトップに置いている

$p.Product
TeraPad

$p.ProductVersion
1.09
0056デフォルトの名無しさん2015/01/19(月) 10:35:13.92ID:wwRTBdF8
標準モジュール→module1 の中のあるプロシージャ Sub A()について
このA()である処理をさせて、途中でボタン付きのフォームを出して
押したボタンによってある座標に文字を記入させようとしたいんだけど
フォームのボタンを押した時の処理って、
フォーム→名前入力フォーム の中のプロシージャ Private Sub Button1_click()でやるんだよね
これってA()の途中で 名前入力フォーム.Show でフォームを出して Private Sub Button1_click() に飛ぶんだけど
ここではA()で求めた座標の情報が無いから入力できない
A()の座標情報を飛ばそうと思って、Public Sub Button1_click()にして
Call Form_名前入力フォーム.Button1_click()で呼び出してもエラーが出るし

どうしたらいいの?
0057562015/01/19(月) 10:37:07.07ID:wwRTBdF8
訂正
Call Form_名前入力フォーム.Button1_click(n)で呼び出してもエラーが出るし
0058デフォルトの名無しさん2015/01/19(月) 10:45:04.98ID:Kmrk/czY
シートにボタンなどいろいろベタベタ貼り付けようと思うのですが
・フォームコントロール
・ActiveXコントロール
と2つあってそれぞれほぼ似たようなものが入ってます。

どっち使うのが得策ですか?
こういうのは決まって最初はどちらかがオリジナルだけどあとで最新技術かなにかで古いほうは奨励されないけど互換性のためそのまま残している、
というストーリーが想像されます。
そういうのも含めて似たようなものが2つある理由を詳しく教えていただけませんか?
0059デフォルトの名無しさん2015/01/19(月) 11:18:59.82ID:Kmrk/czY
オブジェクト変数についての質問です。

オブジェクト変数に何かを代入するのは簡単です。
Set オブジェクト変数=(なんかのオブジェクト)
とすればいいだけです。

ではオブジェクト変数に入ってるものを取り出すにはどうやるのですか?
例えば1つのセルで超カッコいいフォントを使ってるので
Dim 超イイフォント as Object
Set 超イイフォント=Cells(1,1)
とお気に入りのフォントを用意しておき
それを他のセルにも適用したいときに使いたいんです。
0060デフォルトの名無しさん2015/01/19(月) 11:20:01.79ID:Kmrk/czY
[訂正]
Set 超イイフォント=Cells(1,1).Font
0061デフォルトの名無しさん2015/01/19(月) 11:25:30.86ID:Kmrk/czY
不思議なのは
FontのメンバのうちName、Size、Boldとかは引き継がれるけどColorは引き継がれない。
0062デフォルトの名無しさん2015/01/19(月) 12:32:28.37ID:Wmpd31BH
>>56
とりあえず簡単な方法は
module1にPublicな変数を定義してフォームモジュールからはmodule1.変数名でアクセス

>>59-61
取り出しは違うものに代入するだけだから代入と同じ
ただし、Range.Fontは読み取り専用だからFontそのものに代入はできない
個々のプロパティを代入してやれば同じ見た目になるだろ

Colorが引き継がれないっぽいのは、セルの色はRange.Fontじゃなくて
Range.Characters.Fontで文字ごとに設定されてるからじゃないかと
0063562015/01/19(月) 14:34:01.47ID:wwRTBdF8
フォームのボタン押したら〜するっていう処理って結構あると思うんだけど
モジュールレベルでの宣言じゃなくて
プロシージャレベルの宣言だけでもっとスマートにできるやり方ないですか?
0064デフォルトの名無しさん2015/01/19(月) 16:55:15.01ID:IywTVsIe
Dim i as Integer = 100
Dim s as String = "初期値"

みたいな初期化は出来ないのでしょうか?
0065デフォルトの名無しさん2015/01/19(月) 17:03:35.69ID:Wmpd31BH
>>63
プロシージャレベルの宣言ってことは、そのプロシージャ以外からは一切関知しませんって宣言だぞ
標準モジュールに変数定義するのがいやなら、フォーム(モジュール)にPublicで定義してもいいけど
その場合はフォームの寿命とかインスタンスとか意識しないとダメ
0066デフォルトの名無しさん2015/01/19(月) 17:06:38.16ID:Wmpd31BH
>>64
VBAでは出来ない
試せばすぐわかるだろう
0067デフォルトの名無しさん2015/01/19(月) 20:18:04.03ID:vqISfLuN
win7 32bitのExcel2010のグラフ関係のマクロで変なバグに悩まされている。

グラフのプロットエリアのサイズ指定処理である時別な条件で実行時エラーがでる。
エラーがでる部分の実際のコードはこんな感じ。グラフエリアは問題なく,プロットエリアのみ発生。
With .Chart.PlotArea
.Left = L <---この行で.Widthでもエラーになる。Leftメソッドが失敗しましたとか。
.Width = W
・・・
End With

特別な条件とは以下の通り。
1.Excelファイルをオープンした直後の1回目の処理のみ。(エラー後2回目は正常処理)
2.オープン直後の表示領域に特定の部分が表示されていない場合のみエラー発生。
  スクロールで特定場所を一度でも画面表示した場合はエラー発生しない。
3.グラフAとBがあり,先に処理するAでは発生せず後で処理するBのみ発生。
特定の領域とはグラフAのグラフエリア下端直線部。

それなら、マクロでスクロールとかすればと思うが,表示させないとエラーとなる。
Application.ScreenUpdating = False <---これがあるとだめ。

何がおこっているのかさっぱりわからない。誰かHELP。
0068デフォルトの名無しさん2015/01/19(月) 20:32:30.07ID:rJO98qYq
まず原因の切り分けとして別PCではどう?
0069デフォルトの名無しさん2015/01/19(月) 20:32:58.06ID:tiLe1QF5
グラフ名指定してないからじゃねーの(鼻ほじ

>With .Chart.PlotArea
これって更に上位に With あるの?
0070デフォルトの名無しさん2015/01/19(月) 20:46:42.77ID:soodl7cW
とりあえず、ソース全部貼って見たら?
0071デフォルトの名無しさん2015/01/19(月) 20:49:54.89ID:vqISfLuN
>>68
3台のPCですべてだめ。win7 64bitもある。

>>69
もちろんある。こんなの。
With Sheets(1).ChartObjects(Obj)
・・・


End with
0072デフォルトの名無しさん2015/01/19(月) 20:57:36.71ID:vqISfLuN
>>70
全部は無理。前段でこんな処理しているがまずいかな。

With Sheets(1).ChartObjects(Obj).Chart
With .Axes(xlValue)
.TickLabels.AutoScaleFont = False
.TickLabels.Font.Size = 10
End With
With .Axes(xlCategory)
.TickLabels.AutoScaleFont = False
.TickLabels.Font.Size = 10
End With
End With

グラフエリア下端は目盛の表示エリアでもあるが???
0073デフォルトの名無しさん2015/01/19(月) 21:03:35.88ID:rJO98qYq
>>71
じゃあ再現可能な最小コードを作ってアップロードの流れだね
家のPCエクセル入ってないからおれは見れないけど鼻ほじ
0074デフォルトの名無しさん2015/01/19(月) 21:05:10.90ID:soodl7cW
エラーになってるところじゃなくて前段の処理を貼られてしまって思わず困惑
0075デフォルトの名無しさん2015/01/19(月) 21:19:45.00ID:vqISfLuN
>>73
デフォルトのオブジェクトプロパティーはソースコードには書いてないし,
チャートオブジェクトは数千行のソースコードの中で随時操作している。

>>74
別に何でもない。代入している変数名は省略。
そもそも99%は正常に動作するのでこの部分ではわからない。
指定の順序に問題があるかもしれないが..

With Sheets(1).ChartObjects(Obj)
.Left =
.Top =
.Width =
.Height =
With .Chart.PlotArea
.Format.Line.Weight = 0.5
.Left =
.Width =
0076デフォルトの名無しさん2015/01/19(月) 21:46:02.74ID:vqISfLuN
自分で考えたこと。

問題の本質は画面スクロールするだけでなぜエラーが発生しなくなるのかということ。
ソースコードの初期化でもなく,エクセル自体の内部変数の問題と予想。

どこかの,何かのプロパティを初期設定する必要があるのかもしれない。
0077デフォルトの名無しさん2015/01/19(月) 22:10:47.46ID:Wmpd31BH
それホントに2回目は正常に「処理されてる」のか?
グラフオブジェクト、ある種のエラーとか2回目以降は握りつぶしてるぞ
0078デフォルトの名無しさん2015/01/19(月) 23:56:47.69ID:FlOINZHK
やばいまたうんこしたくなってきた
0079デフォルトの名無しさん2015/01/19(月) 23:58:25.47ID:FlOINZHK
最近糖尿のせいか夜尿でおきるんだよね
視力も落ちてきたし
0080デフォルトの名無しさん2015/01/20(火) 05:15:26.62ID:iuLmkOeX
>>75
自分で当たり前と思ってる事が…
0081デフォルトの名無しさん2015/01/20(火) 05:21:25.00ID:iuLmkOeX
>>67
1.発生してるイベント名
2.正確なエラーメッセージ
3.With .Chart.PlotAreaは参照出来るか
4..Left = Lは参照出来るか

自分で解決出来ないんだから自分で怪しいと思った事ではなくて、まず何が起きているか他人が客観的に判断出来る情報だけを提示しような
0082デフォルトの名無しさん2015/01/20(火) 06:19:40.78ID:6mGj69QS
>>81
正確なエラーメッセージは以下の通り。

実行時エラー ' -2147467259 (80004005)':
'Left' メソッドは失敗しました:'PlotArea'オブジェクト

Widthと行を入れ替えるとWidthのエラーとなる。
エラーストップしても,最初から再実行するとエラーは2度と出ない。

ユーザーがグラフを移動したりサイズ変更した場合を想定して,
元の位置とサイズに再設定するマクロになっている。
なので,マクロ実行時にはグラフは存在している。線と目盛を
書き変えるマクロ。
0083デフォルトの名無しさん2015/01/20(火) 07:00:04.66ID:iuLmkOeX
>>82
当面的に無理やり通すならresumeかgoto駆使する
あとは、workbook.loadイベントでワザとエラー発生させとくとか
0084デフォルトの名無しさん2015/01/20(火) 07:06:38.60ID:iuLmkOeX
つか、Openイベントの処理だっけか
まだオブジェクトが認識されてないんでね?
0085デフォルトの名無しさん2015/01/20(火) 08:41:20.38ID:dg0GDE71
VBAのバージョン管理の良いやり方を教えてください
書けるようになってきた反面、破綻寸前です
0086デフォルトの名無しさん2015/01/20(火) 09:05:42.56ID:tR2SZl1M
最初の1回だけエラーになるのは、
初期値が入っていないのかも?

b
a=b
宣言だけして、初期化しなかった変数を使ってエラー

b=0 などと宣言と同時に、初期値が入っていれば、
エラーは起きない
0087デフォルトの名無しさん2015/01/20(火) 09:23:54.97ID:GsFnMcAh
VBAのマクロに設定したパスワードって、ツール使えばだいたい解除できるじゃない。
だったら見られても分りにくくする難読化のツールありますか?
ググッてもVBA用のは無いようなのですが。
0088デフォルトの名無しさん2015/01/20(火) 09:36:37.55ID:iwY+YMua
無いよ、諦めて
0089デフォルトの名無しさん2015/01/20(火) 11:00:46.84ID:GsFnMcAh
Application.Interactive = False をやるとEXCEL2013の操作が
一切出来なくなりますが、EXCELのウインドウの移動なども出来なくなり
不便なので、Ribbonの操作とか、セルの操作とか、そういうのだけ
禁止する方法ありますか?
0090デフォルトの名無しさん2015/01/20(火) 11:16:17.35ID:h3ZK+Qpq
フォームに変数使うことってできますか?
例えばフォームで「会員No.XXXXを登録しますか?」と表示させて
その下のボタン、「登録」「保留」「キャンセル」を押して決めるとか

XXXXは指定のセルから数値を読み取るとか
0091デフォルトの名無しさん2015/01/20(火) 11:34:42.01ID:jGkVNXKd
>>85
俺と同じだw
今現在は一箇所のフォルダにファイル名_バージョン.xlsm xxxx_000080.xlsm etc
にしてるけど、
使いやすいバージョン管理システムを見てまわってるところw
0092デフォルトの名無しさん2015/01/20(火) 12:56:00.67ID:9WW5KIHI
パスワードクラックするようなやつに難読化とか意味ない
0093デフォルトの名無しさん2015/01/20(火) 14:49:13.72ID:hS3N5Hvv
>>90
ラベル使ってcaption変えればいいのては?
0094902015/01/20(火) 17:42:27.69ID:h3ZK+Qpq
プロパティのcaptionのとこですか?
それだとナンバーを毎回手動で変えることになるんですか?
0095デフォルトの名無しさん2015/01/20(火) 18:11:15.93ID:jGkVNXKd
label1.caption = "label1.Caption = "会員No" & Cells(x,y) & "を登録しますか?"
ってことなんじゃ
0096デフォルトの名無しさん2015/01/20(火) 19:30:26.59ID:6mGj69QS
>>86
レスありがとう。

原因不明のままだが,下記のデバッグ用の一行を挿入したら,
エラーそのものが発生しなくなった。

With Sheets(1).ChartObjects(Obj)
.Left =
.Top =
.Width =
.Height =
With .Chart.PlotArea
.Format.Line.Weight = 0.5
A = .Left <---この一行を入れるとエラーが出なくなった。.WidthでもOK。
.Left = L
.Width =

結局,EXCEL内部データが初期化不十分で,プロパティ読みだし操作で
初期化されるものと思われる。
0097デフォルトの名無しさん2015/01/20(火) 20:52:58.14ID:6mGj69QS
>>96
自己レス

グラフのサイズ指定処理だが,一番最初に以下の処理で
画面ズームサイズを保存して一定値にしてからでないと,
グラフサイズが正確に指定できない。これもEXCELの不具合。

Z = ActiveWindow.Zoom
ActiveWindow.Zoom = 一定値

グラフサイズ指定処理

ActiveWindow.Zoom = Z
0098デフォルトの名無しさん2015/01/20(火) 21:07:42.46ID:iwY+YMua
EXCELの不具合を共有したいにしても手順ってものがあるでしょうに。
現状では誰も信じないと思うよ。
0099デフォルトの名無しさん2015/01/20(火) 21:18:01.98ID:6mGj69QS
>>98
現象を報告しているのみ。ネットでも類似報告はある。
ただ,そういう経験がなけば無視すればよい。
0100デフォルトの名無しさん2015/01/20(火) 22:16:47.34ID:Q1gKznlw
まあ本当にExcelの不具合だと思うなら、ぜひマイクロソフトに報告してあげて下さい
ここで不十分な報告しても何の役にも立たん
0101デフォルトの名無しさん2015/01/21(水) 01:26:50.20ID:a4gaLSo8
>>97
だからどのイベントか書けよ
0102デフォルトの名無しさん2015/01/21(水) 02:50:37.26ID:Xic+hwyG
連続するメタ文字"()+"を正規表現でマッチさせたいとき
"\(\(\+"とやってますけど、範囲を指定してエスケープするにはどうすれば良いですか?
0103デフォルトの名無しさん2015/01/21(水) 02:51:32.80ID:Xic+hwyG
間違えました。
連続するメタ文字"+()+"を正規表現でマッチさせたいとき
"\+\(\)\+"とやってますけど、範囲を指定してエスケープするにはどうすれば良いですか?
0104デフォルトの名無しさん2015/01/21(水) 04:25:21.94ID:PQV/sDzo
[a-z]よろしく文字コードでやれるんじゃねえの 鼻ホジ

Regular Expression(正規表現) Part132ch.net
http://peace.2ch.net/test/read.cgi/tech/1415149975/
0105デフォルトの名無しさん2015/01/21(水) 06:12:54.10ID:z33vr0gG
>>101
フォームは使っていないからイベントは無関係。
0106デフォルトの名無しさん2015/01/21(水) 08:42:51.44ID:a+GjDkiJ
>>91
やはりそうなるよね
数パターン個別にカスタマイズして、
あとで統合しようとすると意味不明になる

VBAしか触らないから、
よくわからん本気のツール導入も敷居が高いし

VBAだけでバージョン管理できたら良いのにと思う
0107デフォルトの名無しさん2015/01/21(水) 09:08:28.10ID:G0jKgpER
前スレだかにバージョン管理してるって人居たよね
ソースエクスポートしてテキストで管理って言ってたけど面倒くさそう
0108デフォルトの名無しさん2015/01/21(水) 09:42:25.78ID:NByG1E6b
Sheet1をエクスポートして保存されたクラスモジュールをインポートすると、
Sheet1のオブジェクトモジュールではなく、クラスモジュールとして
インポートされるんですが、これをSheet1のオブジェクトモジュールと
してインポートする方法はありますか?
要するにエクスポートしてインポートしたら、完全に元通りにしたいのです。
0109デフォルトの名無しさん2015/01/21(水) 10:20:51.10ID:nNlZ8uj4
  ●●●ケネディ大統領は何故、死なねばならなかったのか?●●●
  http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1226114724/53

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
  この掲示板に優秀な書き込みをして、総額148万円の賞金をゲットしよう!(*^^)v
0110デフォルトの名無しさん2015/01/21(水) 12:49:32.86ID:CTKuHmCR
>>99
> ネットでも類似報告はある。

url 書かない奴は、脳内と見なされてもしょうがない
0111デフォルトの名無しさん2015/01/21(水) 13:03:28.22ID:vxIgxT3t
>>108
たしか
エクスポート/インポート を自前で作らないと駄目じゃなかったかな

それか
インポート時に
1) 一旦クラスモジュールとして インポートして
2) Sheet1のモジュールへ コピペ
3) 1)のクラスモジュール削除

とかね
0112デフォルトの名無しさん2015/01/21(水) 14:10:56.42ID:NByG1E6b
>>111
レスありがとうございます。
教えていただいた二通りの方法は、VBAでプログラムを組めば自動的に
実行できますか?
それとも手作業でやるしかないでしょうか?
0113デフォルトの名無しさん2015/01/21(水) 14:37:19.71ID:eny8H5q0
ソース一式を出力するなら

http://d.hatena.ne.jp/jamzz/20131002/1380696685
EXCELファイル内のVBAプロジェクトのソース一式をエクスポートする

を見れば
0114デフォルトの名無しさん2015/01/21(水) 15:03:39.62ID:vxIgxT3t
>>112
多分VBAで可能なはず
職場は EXCEL2010だけど自宅は未だに EXCEL97なんで
現状 超古いEXCELでしか試せないのよ

これがまともに動けばこれの応用でできるとおもうけど

With ThisWorkbook.VBProject.VBComponents("sheet1").CodeModule
.InsertLines .CountOfLines, "'コメント"
Debug.Print .Lines(1, .CountOfLines)
End With

上を実行すると
sheet1のモジュールの最後に
'コメント
が追加されかつイミディエイト へソースが表示されるハズです
0115デフォルトの名無しさん2015/01/21(水) 19:45:06.53ID:SYTiPYt8
つーか、シートのコピーじゃいかんの?
0116デフォルトの名無しさん2015/01/21(水) 22:05:43.84ID:ilOt01Hf
Excel2013でユーザーフォーム内のテキストボックスにログを出力するようにしたいんだけど、
テキストボックスが一番最後の行にスクロールしてくれない。

Textbox1.SetFocus
Textbox1.CurLine = Textbox1.LineCount-1
ではダメなんですかね?
0117デフォルトの名無しさん2015/01/21(水) 22:06:32.26ID:NByG1E6b
>>113 >>114
情報有難うございます。
ちょっと試してみます。
0118デフォルトの名無しさん2015/01/22(木) 09:30:51.95ID:4WNaJbbR
Set A = Worksheets("Sheet1").Cells.Find(B)
If A Is Nothing Then Exit Sub
Else A.Select
Cells(ActiveCell.Row, ActiveCell.Column + 1).Value = Date

この処理で、検索して見つかったらそのセルを選択して、
その後アクティブセルからいくつか移動したセルに日付を入れてるんだけど
選択→その位置から移動 の2回の処理をオブジェクト変数Aを使って1回で処理したいんだけど
どうしたらいい?
0119デフォルトの名無しさん2015/01/22(木) 09:36:06.38ID:vsxHNAsj
Cells(A.Row, A.Column + 1).Value = Date
とか
A.offset(略 = 略
とか
0120デフォルトの名無しさん2015/01/22(木) 09:38:23.54ID:vsxHNAsj
あとexit subするならelseでなくend ifでいいよ
いやend ifも要らないか
0121デフォルトの名無しさん2015/01/22(木) 11:44:29.12ID:4WNaJbbR
なるほど(・ω・)
0122デフォルトの名無しさん2015/01/22(木) 14:09:02.53ID:4WNaJbbR
ある列に↓のようにリストがあって

生産課 山田太郎 様
技術開発課 田中次郎 様
総務課 鈴木 様
...

フォームのテキストボックスに苗字を入力して、ボタンを押したら
別のテキストボックスに一致するセルの中身を出すようにしたいんだけど
同じ苗字が二人以上いる時に、まとめて抽出するにはどうしたらいい?
findで範囲内で一致するもの全てを同時に返すとかできますか?
0123デフォルトの名無しさん2015/01/22(木) 18:52:36.11ID:dmH5GNro
正規表現
0124デフォルトの名無しさん2015/01/22(木) 20:19:58.26ID:vNSjR/4e
>>122
findはダメだろ
普通にfor nextとかで繰返し一致する名前を全て書き出せばいい
0125デフォルトの名無しさん2015/01/22(木) 22:23:31.11ID:+1w7MZS/
オートフィルタ
0126デフォルトの名無しさん2015/01/22(木) 23:04:07.41ID:DV1cEPLZ
>>123
なにそれ?
ろくでなし子さん?
0127デフォルトの名無しさん2015/01/22(木) 23:22:43.93ID:dmH5GNro
画像検索しちまったじゃねーか
0128デフォルトの名無しさん2015/01/23(金) 06:06:36.11ID:lAQTOxJ2
>>105
そもそも知識無いの丸わかり(笑)
0129デフォルトの名無しさん2015/01/23(金) 08:10:55.33ID:db6c84vZ
>>97
句読点にカンマ使うような低脳には誰も答えないよ
0130デフォルトの名無しさん2015/01/23(金) 21:06:11.71ID:2WOFIePM
プロシージャを呼ぶとき
Callをつけるのとつけないのではどちらが好ましいの?
0131デフォルトの名無しさん2015/01/23(金) 21:42:06.36ID:QWMFiZg9
Call を付けてないと変数と見間違う

これを懸念するなら Call 付けた方が好ましい
0132デフォルトの名無しさん2015/01/23(金) 23:11:44.56ID:2WOFIePM
>>131
そりゃ間違えそうになるけど変数ならどっかに=があるから区別つくでしょ。
0133デフォルトの名無しさん2015/01/23(金) 23:54:43.14ID:9aT4HWHH
>そりゃ間違えそうになるけど

間違える事がなくなるわけでしょ w
0134デフォルトの名無しさん2015/01/24(土) 00:33:33.63ID:qV60IszQ
キッチリ作る時は戻り値付けるから、callとかまず無い
0135デフォルトの名無しさん2015/01/24(土) 03:13:55.66ID:4KWVQwlI
きっちり作る時って、全部Functionで作るのが流行ってるの?
0136デフォルトの名無しさん2015/01/24(土) 04:10:03.61ID:3QTKI0dL
関数定義をすべてFunctionにしたとしても
明示的に戻り値無視したいときにCallで呼んだりせんのかね
0137デフォルトの名無しさん2015/01/24(土) 06:25:07.60ID:bCSfcL8K
callとcall無しの大きな違いは()が無いこと。ぐらいに思ってる。
んで、()は付けたい派だからcall無しはナイなあ

call無し呼び出しの利点って何?
0138デフォルトの名無しさん2015/01/24(土) 06:27:04.33ID:bCSfcL8K
戻り値はUNIXライクに「return」とか「result」とかをpublicで作っちゃう場合もあるかな
あんま深く考えてないや
0139デフォルトの名無しさん2015/01/24(土) 08:02:47.97ID:qV60IszQ
>>135
>>130がどんなシチュエーションか分からんから商用向けで書いたんだが、
要求仕様にアプリが落ちない事ってのが多いから、余程でない限り各functionにエラー処理と戻り値チェックは必須化してるよ
簡易ツールは超適当だが
0140デフォルトの名無しさん2015/01/24(土) 08:27:29.74ID:vmC8k43Y
エラーを無視するの?
0141デフォルトの名無しさん2015/01/24(土) 09:35:40.00ID:4KWVQwlI
>>139
なるほどねぇ。昔は俺もそんな作りにしていたことがあったなぁ。

今は役割によって細分化してるから、そもそも落ちないメソッドが結構あるし、
落ちたときに必要な後処理によってOn Error Gotoをメソッドに書くか決めてる。

どのモジュールのどのメソッドで落ちたかはエラー情報モジュールを作っておいて、
全てのメソッドを実行する際に設定したり、実行時にログを出力したりしてる。

どっちがいいとかじゃないけど、全てのメソッドにOn Error Gotoとか付けるとテストケース作ったり、
テストするときに大変じゃない?
0142デフォルトの名無しさん2015/01/24(土) 10:09:25.62ID:qV60IszQ
>>141
処理によってエラー処理の有無を分けると必ず漏れるから規約で決める方が全体的に楽かな
エラーモジュールは後々便利だから俺もやるね

テストケースは整合性のある試験データを用意してもらって、かつ設計書で起こしてるから不要な試験はやらない感じ
あと、強制終了しない作りにしとけば納品後も言い訳立つから
0143デフォルトの名無しさん2015/01/24(土) 10:55:09.87ID:nnj+BbUn
エクセルVBAを外部に依頼するのって一般的じゃないけど
小規模法人や個人事業者とかだと便利そうだな
0144デフォルトの名無しさん2015/01/24(土) 11:30:02.39ID:6PENQCIF
一度作って終わりじゃないことは頭に入れておくこと

決算処理で発覚した障害や法改正時の対応とかで
「急いでくれ、○○までに!」
というのがあると足元見られるかもよ
0145デフォルトの名無しさん2015/01/24(土) 11:51:30.03ID:XTk+0QY6
普通職場にVBAできる人は一人はいるもの?
おれんところ正規社員50人以上いるけど一人もいないんだけど。

俺多少できるけどバイトだし
0146デフォルトの名無しさん2015/01/24(土) 11:55:13.16ID:ZhE/54TS
>>145
アホばっかりの会社だな(ワラ
0147デフォルトの名無しさん2015/01/24(土) 11:58:24.09ID:XTk+0QY6
>>146
おれが何か作ってやるとワークシート関数とか数式とか使ってやってると思われるわ
説明面倒だから流してるけど
0148デフォルトの名無しさん2015/01/24(土) 12:29:15.21ID:6PENQCIF
>>145
いない
下手をするとPC使える人すら一人もいない

それに一人しかいないと辞められると困る状況に陥るから任せたくないな〜w
0149デフォルトの名無しさん2015/01/24(土) 12:48:55.10ID:miZ0p/s9
いない
どうしても必要なら外注
内部は安上がりな事務処理要員
0150デフォルトの名無しさん2015/01/24(土) 13:23:49.43ID:nnj+BbUn
>>145
事務系だと経理にはいるかも知れないが
「VBA出来る」ってレベルだと1〜2パーセントじゃない?

オレは職場ではエクセルは殆ど出来ないことになってるw
0151デフォルトの名無しさん2015/01/24(土) 14:24:00.95ID:aPP2OAcd
範囲を定数で持ちたい時ってどうすればいい?
具体的にはデザインが変わることを想定して
初期化位置や入力の位置を定数で持ちたいのだけど
代替案とかでもいいです
0152デフォルトの名無しさん2015/01/24(土) 15:18:57.52ID:W3y8Uzfq
>>151
デザインが変わるってのは、処理対象のシートのフォーマットが変わるって意味だとして…

自分は、その可能性がある場合、VBAの修正はいらないように、別シートに設定用シート作ってる。
「フォーマット変えたら、このシートのこの数字(開始列No.とか)修正してね〜」
で済むから。

コードではその設定シートに入ってるセルアドレスや、列No.、行No.を参照するようにしてる。
0153デフォルトの名無しさん2015/01/24(土) 15:45:42.96ID:qV60IszQ
>>151
range("名前")じゃダメ?
0154デフォルトの名無しさん2015/01/24(土) 15:58:33.26ID:O9IWPZcG
Excel2003ですが
標準モジュールフォルダに一連の操作を行うモジュールが30個たまっているのですが
操作を倍増させるために丸々複製して5倍に増幅させようと考えていますが
1つ1つ複製するしか方法は無いのでしょうか?

30モジュールをフォルダにまとめてフォルダごと複製のような事はできないのでしょうか?
01551542015/01/24(土) 16:02:12.70ID:O9IWPZcG
>>154
>操作を倍増させる → 一連の流れは同じでも異なるバリエイションの操作を5通り作ろうとしています。 コードが複雑化しているため変数をしこむより複製する方が速い感じです
0156デフォルトの名無しさん2015/01/24(土) 16:16:04.54ID:0YrHFNJH
>>132
間違えそうというか、パっと見で分かりにくいからって
関数名は全角日本語にしちゃってるのって自分だけ?
さらに変数も基本日本語にしてる
例えば、gyou とか row より 行 の方が分かりやすいんで・・・

ネットのサンプルプログラムでも
日本語使ってるのは見たことないですが、
日本語だと何かデメリットあるんでしょうか
何かあるなら変えようと思う
0157デフォルトの名無しさん2015/01/24(土) 16:33:46.61ID:qV60IszQ
>>155
バリエーションを増やした時に内容が変わる変数をpublic化して、
バリエーション毎の呼び出し時に変数の値を再設定すれば
処理自体はほぼそのままに出来るかと
0158デフォルトの名無しさん2015/01/24(土) 16:38:06.33ID:qV60IszQ
>>156
日本語環境下(ms office 日本語版)のVBA以外の何かに移植する時に非常に困る
俺は最近変数は日本語使う様になったな
簡易ツール限定で
0159デフォルトの名無しさん2015/01/24(土) 16:48:23.60ID:NK64dzTd
>>158
それは思ったが確か文字列リテラルも同様に制約受けるよな
だから好みの問題でいいんじゃね?

>>154
テストケース書くとパターン展開して150パターン(出来ねえよ!)なんて事は良くあるけど、まさかその150パターンをフラットに実装しようとしてるなら保守で死ぬぞw
0160デフォルトの名無しさん2015/01/24(土) 16:54:42.28ID:LdIBiv/J
>>158
> 日本語環境下(ms office 日本語版)のVBA以外の何かに移植する時に非常に困る

そんな機会あるの?
0161デフォルトの名無しさん2015/01/24(土) 16:56:53.66ID:aPP2OAcd
>>152-153
ありがとうございます
名前の定義はあまり使いたくなかったので
設定シート案採用させていただきます
お二人とも親切にありがとう
0162デフォルトの名無しさん2015/01/24(土) 17:12:53.59ID:qV60IszQ
>>159>>160
>>156の環境と未来は本人しかわからないから本人に判断してもらう
俺は今後も日本語変数使うと思う
めっちゃ楽や〜
01631542015/01/24(土) 18:08:32.20ID:JtJ7UWun
>>157
そのようにも考えましたがプロシージャの数が多すぎて入り組んでいるため挫折しました。。
0164デフォルトの名無しさん2015/01/24(土) 18:17:27.25ID:qV60IszQ
>>163
バリエーション作るって事は変数値を変える場所は調べるんでしょ
作業量は対して変わらんと思うけど
0165デフォルトの名無しさん2015/01/24(土) 18:38:05.32ID:ZpIGFQ1h
変数は滅多に使わないけど
関数名だけは所々日本語使ってしまうなぁ
帳票作成処理()とか
英語力がそんなないから…orz
0166デフォルトの名無しさん2015/01/24(土) 18:42:01.30ID:W3y8Uzfq
>>161
お役に立ててよかったです。

自分の場合は、わけわからん人が勝手に設定シートをいじくらないように、下記のようにしてます。
・設定シートは非表示(VBAからしか表示できない方で)
・管理者用ボタン配置
・ボタン押下でパスワード入力させる
→設定シート表示
・ブック閉じる時には設定シートを非表示
これで、VBAわからないけど管理はできる人に設定シート管理は任せる。

あと、行列番号、セルアドレスだけでなく、他に期や年で変更が発生しうる要素は設定シート管理にしとく。
0167デフォルトの名無しさん2015/01/24(土) 23:02:50.95ID:4KWVQwlI
>>154
ご愁傷さま。普通クラスモジュールが多いのは分かるけど、標準モジュールで30もあるなんて
元々の作りが悪い可能性が相当高いよ。そうじゃなかったらごめん。
多分、リファクタリングするとコード量が1/3以下になる気がする。あくまでカンだけどね。
今後のことを考えると、ごっそり時間を貰ってある程度クラスやインターフェースの知識をもってる人に
全改修して貰った方がいい。長い目で見たら絶対その方が後々の改修が減るよ。
とにかく短い時間でやっつけで片付けるしかないと言うのであれば、せいぜい共通化出来るところを探して共通化し、
変数で設定したり、分岐したりするしかない。
0168デフォルトの名無しさん2015/01/24(土) 23:08:50.79ID:KEoUQ8Iu
>>167に同意
大規模な改修または今後一切の仕様変更をしないという決断を迫られてるかと
0169デフォルトの名無しさん2015/01/24(土) 23:10:26.86ID:aakO0k5F
じゃあ俺は>>167に反対
0170デフォルトの名無しさん2015/01/24(土) 23:25:53.10ID:LJy0wi3+
>>167
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
0171デフォルトの名無しさん2015/01/24(土) 23:26:30.22ID:LJy0wi3+
>>168
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
0172デフォルトの名無しさん2015/01/24(土) 23:27:10.57ID:LJy0wi3+
>>169
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
0173デフォルトの名無しさん2015/01/24(土) 23:27:59.22ID:LJy0wi3+
>>154
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
0174デフォルトの名無しさん2015/01/24(土) 23:30:29.96ID:LJy0wi3+
>>126
★2 ExcelのVBA以外の部分に関する質問はNGです。
0175デフォルトの名無しさん2015/01/24(土) 23:31:08.28ID:4KWVQwlI
はい、ごめんなさい。
向こうのスレに戻ります。
0176デフォルトの名無しさん2015/01/24(土) 23:47:03.79ID:LIgrDPe3
前もこんな流れで荒れたり白けたりしてたよな・・・
テンプレ守れってのは分かるけど、ちょっとな・・・
0177デフォルトの名無しさん2015/01/24(土) 23:51:10.58ID:LJy0wi3+
>>64
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
0178デフォルトの名無しさん2015/01/24(土) 23:52:38.15ID:KEoUQ8Iu
自分も>>4のスレ行きます
0179デフォルトの名無しさん2015/01/24(土) 23:56:43.86ID:4KWVQwlI
>>176
仕方ないよ。忘れてたけどこのスレはテンプレが絶対なんでしょ?
俺はあまり気にしてなかったけど、そう言うことなら仕方ない。
それ用のスレあるし。
0180デフォルトの名無しさん2015/01/25(日) 18:06:28.80ID:tAhczX8T
むこうの1がテンプレが悪いってことにするためにわざと荒らすからねぇ
0181デフォルトの名無しさん2015/01/25(日) 22:30:57.90ID:4QrMsa9l
VBAの構造化プログラミング初心者ですが
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/images/04_Structure02.gif
この図の全体制御に対して呼び出すプロシージャー(主制御)の下に

条件に応じて実行させる処理が300通りほどありプロシージャーを300個つくりどれか一つを呼び出して処理するように書くと
途中で処理能力の限界に達してErrorが発生します。

300の処理を1つのプロシージャーに書きセレクトケースで実行させようと書きましたがやはり容量オーバーで実行できません。

現状妥協策としてしょりを100に絞って1つのプロシージャーにセレクトケースで条件に応じた処理を選択し実行するように書いていますが、
選択肢が沢山有る処理をプロ大量のシージャーにわけて管理することはできないのでしょうか? 単純にこれをやるとループ処理させたときに
数秒たつとすぐに処理の限界というようなErrorが出ます。
01821812015/01/25(日) 22:56:23.58ID:4QrMsa9l
>>181
書き方がわかりにくくて済みません
要は

全体制御
  |
子制御1、子制御2

に対して 孫制御が300個あり
子制御が実行するのは300のうちの1つだけで

複数の子制御で併用して使えるよう300個のプロシージャーにわけて書いて
条件に応じてそのプロシージャーを呼び出すようにしますと構造化プログラミングのルールに違反するようでErrorとなりますという話ですが
こういう場合は一体どう組めばいいのでしょうか?
0183デフォルトの名無しさん2015/01/25(日) 23:05:41.21ID:khShqkpM
>>181
★2 ExcelのVBA以外の部分に関する質問はNGです。
0184デフォルトの名無しさん2015/01/25(日) 23:15:36.65ID:PLw+K7Cf
>>180
それでもテンプレのコピペでスレ違いになるんなら、テンプレに問題があるか、
レスに問題があるんじゃないの?

>>181
どうやらここではスレ違いらしいので、下記のスレで
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0185デフォルトの名無しさん2015/01/25(日) 23:33:00.57ID:iT4+Hxbi
vbaでエクセル上で散布図グラフを作成するのですが、皆様のご知見をご教授頂きたいです。

1、グラフで散布図を書く
2、近似曲線を直線、指数、対数、多項式と4種類重ねて表示させる
3、一番R2が高い曲線だけ残して、他の曲線を消す

というマクロを組んでいるのですが、
例えば、
.SeriesCollection(1).Trendlines(1)が直線
.SeriesCollection(1).Trendlines(2)が指数曲線
.SeriesCollection(1).Trendlines(3)が対数曲線

としたときに、
.trendlines(2).deleteにしても、.trendlines(3).deleteにしても、
なぜか.trendlines(1)が消去されてしまいます。
あげく、
.trendlines(2).select
selection.delete
と書いても、やはりtrendlines(1)が消去されてしまいます。

.trendlines(1)以外が削除できないのはどのような原因が考えられますでしょうか。
0186デフォルトの名無しさん2015/01/26(月) 00:15:50.90ID:T/6/Lmwg
>>183
ExcelのVBAで起きている問題ですので宜しくお願い致します。
0187デフォルトの名無しさん2015/01/26(月) 00:28:38.48ID:gVLbs092
>>186
どうしてこのスレにこだわるw
もう一方のスレなら制限が緩いんだから、素直にそっち行った方が良くないか?

たぶん、>>1
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
に引っかかってるんだと思うぞ
0188デフォルトの名無しさん2015/01/26(月) 00:36:48.78ID:pD45ZdVE
>>182
>複数の子制御で併用して使えるよう300個のプロシージャーにわけて書いて

300でエラー出るそうだが100位に減らすと出ないのか?
300で実行中にタスクマネージャーでexcelのメモリー消費量がどんどん増えて行くのか?
0189デフォルトの名無しさん2015/01/26(月) 00:45:46.23ID:Vf+uB+Jv
>>182
エラー番号とエラーメッセージを正確に教えて
0190デフォルトの名無しさん2015/01/26(月) 00:58:46.96ID:ajD/biY/
>>186
処理の限界というようなErrorってなんだよ
0191デフォルトの名無しさん2015/01/26(月) 10:04:58.09ID:WvtN1ik0
エラーメッセージがあった場合、その正確な文言を報告する。またはそれでググルというのが
普通の能力を持った人間ができること。
つまり>>185 は無能力故に作ったモノが動かないのであって決してExcel VBAのせいではない。
0192デフォルトの名無しさん2015/01/26(月) 10:39:14.60ID:7PO1Rygt
>>191
アンカーもまともにつけられない無能乙
0193デフォルトの名無しさん2015/01/26(月) 11:15:08.23ID:o5EuO8YW
アンカにまともとかあんの?
頭につけてさらに改行しなきゃいけないとか?
パースの弱いまとめサイトか何かか?
こんなスレを二次利用するとかあんのか?
>>192

>>191
エラーなんて書いてないけど「場合」としているから問題ないとか卑怯だからな
憶測で人を蔑めるお前は能力云々以前にどうしようもない奴だよ
isis行けよゴミ

>>185
原因知らね
set target = .SeriesCollection(1).Trendlines(2)
target.delete
も同じ結果?VBAの常識的には異常だね、なんだろうね
ヘルプとかにヒントないの?(興味本意)
0194デフォルトの名無しさん2015/01/26(月) 11:30:41.12ID:eJA+Ejea
>>193
> アンカにまともとかあんの?

レス番間違えてるってことだろ
0195デフォルトの名無しさん2015/01/26(月) 20:21:12.52ID:ajD/biY/
>>185
そんなわけないだろうと思いつつ2007で試したら再現したわ
原因や解決方法が欲しいなら、マイクロソフトに問い合わせをお勧めする

上の方にもなんかあったけど、グラフって結構あやしいんだよなぁ
0196デフォルトの名無しさん2015/01/26(月) 23:04:30.68ID:h7ndqy83
MSから金をとれるときいて
0197デフォルトの名無しさん2015/01/27(火) 01:33:16.01ID:upRrWRGK
>>186
テンプレを守れない奴に回答するつもりはない
0198デフォルトの名無しさん2015/01/27(火) 07:41:58.62ID:juhI5XvQ
>>197
べつにアンタだけが回答者じゃないんだから
答えられないなら黙ってスルーしときなさいよ
0199デフォルトの名無しさん2015/01/27(火) 14:48:06.31ID:YTyfrIUd
vbaのsheetモジュールに書くと、C++などで言うクラス内メソッドになるんでしょうか
0200デフォルトの名無しさん2015/01/27(火) 14:49:06.88ID:YTyfrIUd
続けてすいません、Thisworkbookモジュールと標準モジュールはどう違うんでしょうか?
0201デフォルトの名無しさん2015/01/27(火) 15:11:07.01ID:jF6LtWis
>>199-200
「C++などで言うクラス内メソッド」の意味するところが良くわかりませんが、ワークシートモジュールは
各ワークシート専用のメソッドを記述する場所です。
Sheet1のワークシートモジュールでRange等を参照する場合、Worksheetを明示しなければ、それは
Sheet1内のRangeだということになります。
ワークブックモジュールも同様ですね。

標準モジュールでは、Workbookを省略した場合はActiveWorkBookを(*1)、Worksheetを省略した場合は
ActiveWorkSheetが対象となります。
(*1)ひょっとしたら、ThisWorkbookなのかもしない。

また、IDEのコード編集領域の上部に(General)と書かれたコンボボックスがありますが、ここで
WorkbookやWorksheetを選択すると、右のコンボボックスでイベントを選択できるようになり、
各Worksheet/Workbook用のイベントハンドラを記述できます。
0202デフォルトの名無しさん2015/01/27(火) 15:20:02.68ID:jF6LtWis
「各ワークシート専用のメソッド」というわかるようなわからないような表現をしたのには理由があります。

VBAでは(VBも同様なんですが)、暗黙のインスタンス化というものがあり、新たにBookを開いたとき、
ワークシート数が1なら、
* Sheet1クラス
* Sheet1クラスのインスタンス
* ThisWorkbookクラス
* ThisWorkbookクラスのインスタンス
が自動的に生成されます。

Sheet1クラスが作られるため、Dim sht as Sheet1という型指定ができ、Sheet1クラスのインスタンスが
作られるため、標準モジュールで何の宣言もせずにSheet1.SomeMethodと呼び出すことができます。
ただし、Dim sht as Sheet1と宣言しても、Set sht = new Sheet1とはできません。

他のオブジェクト指向用語で言うなら、各WorksheetとWorkbookのシングルトンオブジェクトが自動生成される
というイメージでしょうか。
0203デフォルトの名無しさん2015/01/27(火) 15:29:06.53ID:jF6LtWis
以上をまとめて「C++などで言うクラス内メソッド」と表現するなら、その理解は正しいです。
0204デフォルトの名無しさん2015/01/27(火) 15:35:17.31ID:YTyfrIUd
丁寧にありがとうございました。よく理解出来あmした。
0205デフォルトの名無しさん2015/01/27(火) 18:41:59.26ID:upRrWRGK
>>202
シートって考えれば考えるほど分からなくなるよね。
暗黙のインスタンスがシングルトンで作られるのは分かるけど、
ブックを閉じても内容がクリアされないってところはファイルそのものだし。
0206デフォルトの名無しさん2015/01/27(火) 18:51:14.65ID:9/pKg/Bv
>>205
内容がクリアされない
どういうこと?
0207デフォルトの名無しさん2015/01/27(火) 18:53:08.10ID:nXIQJnkv
>>206
セルとかに書かれている内容とか、クリアされないじゃない。
0208デフォルトの名無しさん2015/01/27(火) 19:51:46.04ID:upLB79bt
状態を持ったオブジェクトはファイルに保存する方法が無いとでも思ってるんだろうか
0209デフォルトの名無しさん2015/01/27(火) 19:56:47.93ID:9/pKg/Bv
そんなの当たり前じゃない。
VBAはEXCELのオマケなんだから。
0210デフォルトの名無しさん2015/01/27(火) 20:54:51.84ID:nXIQJnkv
なるほど、自分自身がファイルのアプリケーションだから違和感を感じるのか。
0211デフォルトの名無しさん2015/01/27(火) 21:13:32.64ID:ZHjx6d1m
そんなに変なのか?俺は何も感じないけどなw
0212デフォルトの名無しさん2015/01/28(水) 08:13:22.17ID:a3QtgkTi
>>211
俺も感じない。

んなこといったら、Accessなんてもっと違和感だからけで使えないわな。
インターフェースとDBも、さらには言語まで全部内包してるんだから。
しかし、そんなことに違和感覚える人は脳みそが硬直化してると言える。

昔からあるんだからこんなもの。
0213デフォルトの名無しさん2015/01/28(水) 17:35:08.43ID:kJf5e2Zn
俺も違和感は感じないが

昔はバイト列にデータとプログラムの区別は無かった
今はプログラムとデータは区別する時代

違和感を感じないのは鈍感なだけかもしれん
0214デフォルトの名無しさん2015/01/28(水) 18:39:15.99ID:cH2DWeor
あー、言いたいことは何となく分かる。
多分VBA系じゃなくて.Netや旧VBとかを主体にやってるんじゃないか?
そうしたら普段は外部からただのファイルとして扱っているだろうからな。
俺もやっぱりVB.Netのフォームで不思議に感じたわ。
あいつは生成しようがしまいが使えるからな。
意味合い的にはちょっと違うけどな。
0215デフォルトの名無しさん2015/01/28(水) 20:03:06.31ID:FEW+DfFq
ユーザ定義型の配列をoptionalで渡したい場合って、どうすればよい?
variantに突っ込むのは無理だった
0216デフォルトの名無しさん2015/01/28(水) 21:56:35.26ID:Xnh8EDKt
>>215
配列をプロシージャの引数に渡すってこと?

ならば、
Sub kinoko(simejiArray() As String)
といった形で渡す。

simejiArray()の元になる配列を生成してるルーチンでは
最後に

Call kinoko(matsutake)

といった形で呼び出す。
0217デフォルトの名無しさん2015/01/29(木) 00:49:28.98ID:tR9/a+yn
>>216
ユーザ定義型の配列をoptionalで渡すとエラーになるのです。
調べたところ、vbaでは配列をoptionalで渡せない仕様らしく、
その場合は配列をvariant型変数に代入して回避する方法があるということでしたが、
ユーザ定義型の場合は、variant型変数に代入するところでエラーになりました。
やりたいことはこんな感じです。
type kinoko
name as string
season as string
end type

sub main
dim k(1) as kinoko
dim ret as string
k(0).name = "shimeji"
k(1).name = "maitake"
ret = myfunc(k)
end sub

function myfunc(optional k() as kinoko) as string
なにか処理
myfunc = "miso soup"
end function
0218デフォルトの名無しさん2015/01/29(木) 00:51:13.82ID:HI8rUnX+
>>215
byrefしかできんのじゃ
0219デフォルトの名無しさん2015/01/29(木) 01:41:49.80ID:N336K0Nj
>>217
普通にVBAプロジェクト内で定義してるユーザ定義型では無理
諦めるかクラスで代用するか
0220デフォルトの名無しさん2015/01/29(木) 07:39:06.00ID:3hW0BXTS
>>217
今手元にExcelがないから試せないけど、
その配列の変わりにCollectionを使うか、
配列ごとCollectionに突っ込んでみてもダメ?
0221デフォルトの名無しさん2015/01/29(木) 11:37:49.91ID:wMkjI3CS
 
お世話になります。
私、責任者の加茂と申します。以後、宜しくお願い致します。
http://www.apamanshop.com/membersite/27009206/images/kamo.jpg
浪速建設様の見解と致しましては、メールによる対応に関しましては
受付しないということで、当初より返信を行っていないようで、今後につい
てもメールや書面での対応は致しかねるというお答えでした。
 
このように現在まで6通のメールを送られたとのことですが、結果一度も
返信がないとう状況になっています。
 
私どものほうでも現在までのメール履歴は随時削除を致しております
ので実際に11通のメールを頂戴しているか不明なところであります。
 
 
 ・T   http://s-at-e.net/scurl/ia-T.html
 ・Zle  http://s-at-e.net/scurl/ia-Zle.html
0222デフォルトの名無しさん2015/01/29(木) 14:10:35.50ID:qpPWWKCR
>>219
諦めてoptionalやめました。
不要な場合は空配列渡して、function側で if (not arr) <> -1 で判定するように修正
0223デフォルトの名無しさん2015/01/29(木) 17:49:35.18ID:pY+BfFdL
variant配列を用いて一括貼り付けが高速だということを知り
試しにrangeをvariant配列にいれて
配列を同じ場所に貼り付けたら
書式がクリアされたのですが
同じ配列で同じrangeに貼り付けるとこうなるものですか?
文字サイズを9にしてたのが11になってしまったのですが
何か対策手段があれば教えてください
0224デフォルトの名無しさん2015/01/29(木) 18:53:48.34ID:OdkcJOPr
>>223
> 書式がクリアされたのですが
試したけど、書式はそのままだったよ。

> 配列を同じ場所に貼り付けたら
そもそも「貼り付ける」というのが誤りな気がするが・・・。
variant配列を使う場合は、普通代入するもんだけど。
0225デフォルトの名無しさん2015/01/29(木) 19:12:12.05ID:qpPWWKCR
dim val as variant
set val = range(ほげ)
とかやってたら笑う
0226デフォルトの名無しさん2015/01/30(金) 08:06:03.60ID:W+N1TSjq
>>222
なんか汚いな。
If arr = True Then
じゃ駄目なのか?
0227デフォルトの名無しさん2015/01/30(金) 08:49:04.36ID:kOBKTeQq
>>226
dim arr() as string
で、arrがredimされてるかの判別方法を探してて見つけたのをそのまま使ってました。
-1がtrueだから、直すとしたら
(not arr) = false
ですかね。あとで試してみます
0228デフォルトの名無しさん2015/01/30(金) 10:51:17.37ID:nfdpmMl0
結果を反転してそれがFalseかどうか調べるなら
反転せずにそれがTrueかどうか調べたほうが素直だと思うんですけど
0229デフォルトの名無しさん2015/01/30(金) 10:53:28.10ID:nfdpmMl0
って -1が True なのか。ややこしいなw
0230デフォルトの名無しさん2015/01/30(金) 11:01:05.83ID:1A+w7QQq
Not [可変長配列]
ってのが、可変長配列が初期状態かどうかの唯一の判定方法っぽいなあ。
初めて知ったよ。
0231デフォルトの名無しさん2015/01/30(金) 13:26:09.86ID:kOBKTeQq
(not array) の値調べた
redim前→-1
redim後→大きい負の値(190億くらい)
なので、-1と比較するしかないみたい

>>230
on error gotoな状態でuboundして分岐させたり(これが本来のやりかた?)
sgn関数使ったりする方法もあるようですよ
0232デフォルトの名無しさん2015/01/30(金) 16:44:17.55ID:Um9YeW/1
=(B11*B51)+(C11*C51)+(D11*D51)+(E11*E51)+(F11*F51)+(G11*G51)+(H11*H51)+(I11*I51)+(J11*J51)+(K11*K51)+(L11*L51)+(M11*M51)+(N11*N51)+(O11*O51)+(P11*P51)+(Q11*Q51)+(R11*R51)+(S11*S51)+(T11*T51)+(U11*U51)+(V11*V51)+(W11*W51)

上記数式の加算記号の後に改行を入れたとこ下記のようになりました。

(B11*B51)+
(C11*C51)+
(D11*D51)+
(E11*E51)+
(F11*F51)+
(G11*G51)+
(H11*H51)+
(I11*I51)+
(J11*J51)+
(K11*K51)+
(L11*L51)+
(M11*M51)+
(N11*N51)+
(O11*O51)+
(P11*P51)+
(Q11*Q51)+
(R11*R51)+
(S11*S51)+
(T11*T51)+
(U11*U51)+
(V11*V51)+
(W11*W51)

何やら法則があるのは分かるのですが、これを一括で解決する書き方(短い式)がありましたら教えてください!
0233デフォルトの名無しさん2015/01/30(金) 16:50:13.43ID:0YV6xwSy
>>232
sumproduct
0234デフォルトの名無しさん2015/01/30(金) 17:04:21.86ID:Um9YeW/1
>>233
できました!ありがとうございます!
0235デフォルトの名無しさん2015/02/01(日) 01:20:19.75ID:1M64orpF
VBA初心者ですが
VBA自体をVBAで書き換える事はできないのでしょうか?
0236デフォルトの名無しさん2015/02/01(日) 01:38:20.77ID:R7pq7q7A
>>235
出来ない事はないが
初心者にはハードル高い
0237デフォルトの名無しさん2015/02/01(日) 01:57:54.04ID:rAGWgKIP
>>235
何十年前のコンピュータで、メモリが足らないから自己書き換えなんてやってた時代ならともかく、
そういうことは考える必要は無い。
最初から書き換え後のコードを用意しておいて、必要に応じて条件分岐すればいい
0238デフォルトの名無しさん2015/02/01(日) 02:00:25.02ID:4ng7/cbq
自己書き換えって実行時まで条件が分からないからするものだろ?
VBAでやろうとは思わないけど。
0239デフォルトの名無しさん2015/02/01(日) 05:10:58.76ID:hbd+H1bA
モジュールが100以上ありプロシージャが千以上あるコードの大仕様変更の時に手入力と置換だけではいつまでたっても終わらない
どうしても自家書きしなければ逝けない数値の書き換えや
VBAの記述でも配列などが使えたらさっさとで終わるだろうなあと
0240デフォルトの名無しさん2015/02/01(日) 05:42:43.70ID:Zdr4/0x6
>>239
モジュールが100あるの?凄いねw
エクスポートして、それぞれモジュールをテキストファイルにしてから書き変えればいいんじゃないかな。
それで各モジュールを消してインポートすれば、まぁ100個くらいなら何とかなるよ。
0241デフォルトの名無しさん2015/02/01(日) 09:05:49.17ID:oCjnTYIk
モジュールが100以上あってプロシージャが1000以上あるプログラムって例えばどんなの何だろう
excelにそんな多く機能持たせた経験ないからよくイメージ出来ないんだけど
そんなにモジュール多いと、ファイルサイズとかに影響出ないのかな
0242デフォルトの名無しさん2015/02/01(日) 09:24:12.16ID:4ng7/cbq
>>239の状況は、シートに簡易DSLでロジックを記述しておいて
VBAではそれを実行する簡易インタープリタを実装すれば
問題解決出来そうな気がする
0243デフォルトの名無しさん2015/02/01(日) 09:31:32.57ID:Zdr4/0x6
>>241
本気にするなよw
このスレから人離れを起こさせないように苦労しているいつもの>>1の自演だろw
モジュールが本当に100も必要なアプリなら、
まともなチームリーダーだったら外部システムからExcelを出力することを考えるわw

いつも健気に頑張っているから騙されてるふりしてるけどさ、流石にこれはちょっと酷いw
0244デフォルトの名無しさん2015/02/01(日) 10:25:49.02ID:P6Wv1Uek
>>239
>>154か?大変なことになってるねw
0245デフォルトの名無しさん2015/02/01(日) 10:42:56.79ID:rgNJ3Qt7
>>244
頭の悪いコードを書いてるとこうなるっていういい事例だわな。
0246デフォルトの名無しさん2015/02/01(日) 13:05:10.56ID:gxx6hjcz
まあ大抵はそのサイズになる前にギブアップするだろうけど
ホントにそのボリュームのVBA作り上げてるなら根性だけは大したものかと
0247デフォルトの名無しさん2015/02/01(日) 15:03:51.30ID:sjXjc1T+
>>235
ウイルス作りたいの?
0248デフォルトの名無しさん2015/02/01(日) 16:09:14.35ID:s/JSe9N/
住めば都ということわざがあるように頭の悪いコードでも動けば都だよ
0249デフォルトの名無しさん2015/02/01(日) 19:07:26.98ID:Zdr4/0x6
いや〜、モジュール100個の都なら、俺田舎でいいや
0250デフォルトの名無しさん2015/02/01(日) 19:26:05.58ID:4ng7/cbq
>>248は頭の悪いコード(田舎)でも動けば都だと言ってるのに対し
「田舎でいいや」というレスは
頭の悪いコード(田舎)が頭の悪いコード(田舎=動かない)のままでいい
という事だから、結果「動かなくてもいいや」という意味になる。

>>249は本当に
モジュール100個のVBAだったら動かなくてもいいや
という意味の事を伝えたかったのだろうか?
ちょっと気になる。
0251デフォルトの名無しさん2015/02/01(日) 19:33:32.30ID:Zdr4/0x6
何かめんどくさそうな人だなぁ
0252デフォルトの名無しさん2015/02/01(日) 19:36:29.46ID:Oy9MlKBG
>>250
どう見ても >>248 の言う
・頭の悪いコード
・動けば都
は、同一のコードを指してると思うが
0253デフォルトの名無しさん2015/02/01(日) 19:41:02.43ID:4ng7/cbq
>>252
うん、俺も同一のコードを指してると思うよ。
お前の解釈だとどういう意味になるんだ?
ちょっと気になる。
0254デフォルトの名無しさん2015/02/01(日) 19:43:23.05ID:Zdr4/0x6
そうだね。そんなんだったら最初の時点でお断りだよ。
受けるなら時間もらって詳細設計から、場合によっては基本設計からやり直す。
0255デフォルトの名無しさん2015/02/01(日) 19:43:32.01ID:Oy9MlKBG
> お前の解釈だとどういう意味になるんだ?

>>250 はうまいこと言おうとして失敗するタイプと言う意味かと w
0256デフォルトの名無しさん2015/02/01(日) 19:45:51.14ID:Zdr4/0x6
>>255
何を言っているのか分からないなぁ
0257デフォルトの名無しさん2015/02/01(日) 19:48:10.46ID:4ng7/cbq
>>255
うまい事言ってるのは>>248だろ?
俺なんかがうまい事言うなんて、畏れ多くて出来んわ。
0258デフォルトの名無しさん2015/02/01(日) 20:05:13.84ID:jkfzVUo5
>>248 とか >>255 とかにいちいち突っ込む男の人って‥
0259デフォルトの名無しさん2015/02/01(日) 20:28:17.66ID:a7daD80f
Book1.xlamでVBAで何らかのツールを作ってその中で
Application.OnKey "{ESC}", "func1"
でESCをfunc1に設定したとしても、このxlamとは別のマクロ付きBook2が同時に読み込まれたとして、
その中でOnKeyが実行されて別の関数func2に割り当てられた場合、当初のfunc1がESC押下で実行出来なくなると
思うのですが、こういう場合、func1はどんな事が有ってもESC押下で実行出来るようにする設定みたいなのは
ありますか?ただし、私が変更出来るのはBook1.xlamのみという前提で。
0260デフォルトの名無しさん2015/02/01(日) 20:42:58.80ID:Zdr4/0x6
ねー、ここで聞く前にググったりしてみた?

http://officetanaka.net/excel/vba/tips/tips60.htm

田中さんが何か言ってるよ。参考にならない?

これさー、今度から何でエラーが出るか聞きたいときはエラーメッセージ書けとか、
質問する前にググれとか、テンプレに追記しといた方がいいんじゃない?
0261デフォルトの名無しさん2015/02/01(日) 20:47:48.76ID:a7daD80f
>>260
レス有難うございます。
読んでみましたが私のやりたい事とちょっと
違うようなんですが?
0262デフォルトの名無しさん2015/02/01(日) 21:05:15.93ID:Zdr4/0x6
>>261
あ、そう。じゃ何をどうしたいのか分からないし、めんどくさいからいいや。
じゃーねー
0263デフォルトの名無しさん2015/02/01(日) 21:12:43.16ID:4ng7/cbq
他のマクロからキー割りあてを変更出来ないようにするということは
一部のマクロに絶大な特権を与える事にも似たようなものであり
また、これを許可するのも、そのマクロ自身であるという事は
その実行環境であるところのエクセル自身の重大なセキュリティホールと言っても
過言ではないくらいの恐るべき脅威に近いものがあるから
多分出来ないんじゃないかと考察するに至ったわけです。

なんも知らんけどな
0264デフォルトの名無しさん2015/02/01(日) 22:04:35.58ID:Oy9MlKBG
まあ、いつものことだけど「なんのために」そんなことしたいのか書いた方がいいわな
特に
> ただし、私が変更出来るのはBook1.xlamのみという前提で。
なんて条件は非常に胡散臭いので、知ってても迂闊に答えない人がほとんどだし
0265デフォルトの名無しさん2015/02/01(日) 22:21:01.30ID:Zdr4/0x6
>>264
じゃ、それも次回テンプレ追加で
0266デフォルトの名無しさん2015/02/01(日) 23:07:46.68ID:XG47cZe8
SurfaceでExcel使ってるんだけど、ここで質問していいのかな?

ExcelでSurfaceのペンを使ってるんだけど、ペンを有効にしてるときって手が画面に少し触れただけでペンが触れたと反応するんだけど、なんとかならないかな?
onenoteとかだどペン以外は反応しないようになってるから、Excelでも同じようにしたいんだ

詳しい人教えて下さい
0267デフォルトの名無しさん2015/02/01(日) 23:37:29.07ID:P6Wv1Uek
スレ違いにも程があるぞ
0268デフォルトの名無しさん2015/02/02(月) 00:20:52.28ID:FBHevKSn
すまん
総合スレで聞くわ
0269デフォルトの名無しさん2015/02/02(月) 00:21:29.92ID:XTmeW3Aa
>>266
ここは「ExcelのVBA」の質問スレです。
「Excel」の質問スレではありません。
0270デフォルトの名無しさん2015/02/02(月) 00:37:04.92ID:0iu4BYNO
If (Cells(x, 3) <= Range("f3")) And (Range("f3") <= Cells(y, 14)) Then

↑これはコードの一部ですが
RANGEとセルズが混在していても一応動いているようですが
やはり統一した方が良いのでしょうか?
混在していても全く問題は無いのでしょうか?
何か問題はありますでしょうか?
0271デフォルトの名無しさん2015/02/02(月) 00:51:04.53ID:/NzKCxLk
問題はありません
が、統一した方が読みやすいと思います。

私は使い分けとして
行だけループする場合はRange
列もループする場合はCellsを使います。
大体 Range("A" & row) みたいな書き方をします。
後、Rangeの方がインテリセンスを使うことができます。
0272デフォルトの名無しさん2015/02/02(月) 00:59:08.60ID:0iu4BYNO
>>271
ありがとうございます。
VBAを覚えたての頃に書いたコードはすべてRangeのみで書かれていまして
列のループ処理をやるためにセルズにする必要が出てきた感じですが
全部書き換えるのは手間なので問題がないようでしたらそのままでも良いかと考えています。
02732722015/02/02(月) 01:27:00.98ID:jDU54aaN
Cellsの記述の場合列行の表記がRangeと逆になっていますが
これを差し替えていくのはめんどくさい&間違えの元じゃないかと思うのですが
大量にあるRangeの記述を簡単にセルズに変換する方法はあるのでしょうか?
0274デフォルトの名無しさん2015/02/02(月) 04:05:08.60ID:SJWlqNpA
おれできる限りCell使ってるわ
Range使うのは範囲指定するとき必要な場合だけ
0275デフォルトの名無しさん2015/02/02(月) 04:24:51.86ID:plHHO9Jd
>>274
おれも

A1とか記述したのは、初心者の頃マクロ記録をチョコット直してた時くらい
0276デフォルトの名無しさん2015/02/02(月) 07:37:46.48ID:NU5Zauz1
>>273
無いかな

>>274
俺も
ルール付けしとくと何かと楽
0277デフォルトの名無しさん2015/02/02(月) 12:04:30.92ID:bNVSAdRU
>>274
元のシートがA1表示だから
range使ってるよん
誰が見てもわかる
ループのときはcell使うけども
0278デフォルトの名無しさん2015/02/02(月) 12:10:33.73ID:nXgBCJxL
>>273
まともなテキストエディタ使って置換すればいいんじゃねーの
0279デフォルトの名無しさん2015/02/02(月) 15:35:52.53ID:kL0w7RLL
俺はなんとなく使い分けてるが、どっちかっていうとRangeメインだな
Rangeが返すのはRange型で素直なんだが、Cellsが返してるのも実はRange型なんだぜ
0280デフォルトの名無しさん2015/02/02(月) 16:22:17.96ID:G/z3lBBz
AddressOf ってイミディエイトウィンドウからは使えないんでしょうか?
Excel2007なんだけど、モジュール内で普通に使えてるものがイミディエイトからだと
「AddressOf オペレーターの使い方が適切ではありません。」というメッセージが出ます。
foo(arg, AddressOf fun)
foo(arg, VBA.CLng(AddressOf fun) )
モジュール内で上が正しく動く状態で、イミディエイトではどちらもダメ。
02812802015/02/02(月) 23:01:08.75ID:Ky9zZXbI
スレ違いっぽいことに気付きました。質問は取り下げ別スレに移動します。
0282280(本物)2015/02/02(月) 23:39:54.80ID:cCrGjBjB
>>281
こらニセモノは消えろ
0283デフォルトの名無しさん2015/02/03(火) 01:54:12.81ID:RfSVj4lv
頑張れニセモノ!
スレ違いを追放するんだ!
02842802015/02/03(火) 07:07:00.43ID:mC3dFwzO
贋物じゃないよ
>>280はスマホから、>>281は帰宅してPCから書き込んだまで。
とりあえずVBAなんでもスレに移動した。
0285デフォルトの名無しさん2015/02/03(火) 11:55:55.94ID:hDHAxkPN
セルに「Hello」と入れ
例えば、Activecell.Speak、を実行するとExcel会社の英語のお姉さんが「Hello」としゃべってくれます。

しかしセルに入れずにしゃべらす方法はありませんか?
無駄にセルを使いたくないだけでなく、条件や計算式によってしゃべらせる文章が違ってくるからです。
0286デフォルトの名無しさん2015/02/03(火) 12:45:09.53ID:vk5X3Hbw
>>285
Application.Speech.Speak "Hello"
0287デフォルトの名無しさん2015/02/03(火) 17:42:41.61ID:pUr5YgOi
みなさんワークシート関数どれぐらい使います?
今まで配列に入れて比較してたけど
思ったより関数が高速だから最近使うようになったものの
プログラムが見にくく感じるので
0288デフォルトの名無しさん2015/02/03(火) 17:59:03.79ID:uDbnXfrQ
四捨五入しか使わないな
0289デフォルトの名無しさん2015/02/03(火) 21:18:47.31ID:a2fTfTzN
stdevやcorrelなどの統計関数などを使った覚えが。まぁそんな頻繁に使うもんではないけど
0290デフォルトの名無しさん2015/02/03(火) 21:25:14.07ID:Ppm0iTyR
vlookupとかcountif便利だと思うけど
このスレ民にとっては異端?
0291デフォルトの名無しさん2015/02/03(火) 22:33:43.68ID:UxuA38XS
>>287
基本使わん
0292デフォルトの名無しさん2015/02/03(火) 23:53:34.56ID:hDHAxkPN
Worksheetfunction.(各関数)
でよく使う。
0293デフォルトの名無しさん2015/02/03(火) 23:54:40.08ID:hDHAxkPN
>>286
Application.Speech.Speak "Oh, thank you very much!"
0294デフォルトの名無しさん2015/02/03(火) 23:59:02.67ID:RfSVj4lv
余り使う機会はないな。

だけどコードの長さや可読性、レスポンスを考慮して、有効だと判断したらガンガン使う。
0295デフォルトの名無しさん2015/02/04(水) 01:09:42.43ID:BFzhN8Yg
VBAで直接ワークシート関数使うぐらいなら、セルに数式で関数入れて
そのセル参照するように出来ないかまず考える
0296デフォルトの名無しさん2015/02/04(水) 02:48:03.92ID:n5cykeUg
>>288
WorksheetFunction.RoundとVBAのRound関数は仕様が違うからな
後者じゃ四捨五入出来ないもんな
0297デフォルトの名無しさん2015/02/04(水) 03:35:07.30ID:Nfe1oQPY
VBAで自動集計する技を得てシート数が増え続け
ついに200に達しましたが皆さん最大で何シート使ってますか?
200シートでもそれなりに動いていますが
限界実用範囲は何シートぐらいまでなのでしょうか?
0298デフォルトの名無しさん2015/02/04(水) 05:39:46.43ID:OYpgUZd5
functionのvlookup使ったほうがループ回すより早くない?
0299デフォルトの名無しさん2015/02/04(水) 06:38:17.48ID:vNQZnkOK
速いよ
0300デフォルトの名無しさん2015/02/04(水) 06:48:55.80ID:vNQZnkOK
>>297
メモリが許す範囲まで。

以前、セルを縮めて着色して、シートに絵を描いたものを切り換えて、何かのアニメのオープニングを再現していたものを
見たことがある。
多分何万枚って持てると思う。ただし、この話はスレ違いなのでここまで。
0301デフォルトの名無しさん2015/02/04(水) 09:17:15.52ID:5w98FKMD
じゃ配列のソートってどうしてる?
0302デフォルトの名無しさん2015/02/04(水) 10:33:51.72ID:gdgyJzbS
>>301
どうぞ
http://officetanaka.net/excel/vba/tips/tips40.htm
0303デフォルトの名無しさん2015/02/04(水) 10:45:27.12ID:5w98FKMD
>>302
2つ書いてあるけど、どっちを使ってるのさ?
2次元配列に対応して、複数のキー列も選択できて、文字と数値が混在しててもOKなクイックソートを作るとしたら面倒だ
と思うけど、みんなどうしているんだろ?
0304デフォルトの名無しさん2015/02/04(水) 11:00:38.14ID:8rr12R5m
>>303
高校生(中学生じゃない)に連立方程式教えてて、加減法と代入法教えたら
「先生はどっち使いますか?」て聞かれたことを思い出した。
んなもん、問題見て判断しろバカ
0305デフォルトの名無しさん2015/02/04(水) 11:31:20.20ID:QfhTV/If
>>304
先生の資格なし。

そんなもん「加減法が一般的です。でも初心者には直感的には代入法が分かりやすいでしょう。とくにx=○○かそれに近い形で1つの変数が明示されてるような場合は。」
と言ってあげればいい。

わかりやすく説明する能力こそ先生に必要なもの。
バカとすぐ切れる瞬間湯沸かし器はアホに必要なもの。
0306デフォルトの名無しさん2015/02/04(水) 11:44:39.03ID:5w98FKMD
>>304
複数の方法を知った上での一長一短という問題とは違うと思うけど?
汎用性のあるソート関数があれば、ワークシートに貼り付けて処理するなんて悪手は使う気なくなる。
ただそういうものを作るには気合いがいるから、「みんなどうしてるんだろう」という疑問が出てくるわけで。
0307デフォルトの名無しさん2015/02/04(水) 12:27:59.82ID:8rr12R5m
>>305
>>304のレスで生徒に切れたと思われたのか?
その時は代入法でやらせたよ。1つめの
式をx=の形に直して2つめ式に入れろって方がやり方としては単純だし。
そのあと分数の計算まで教えたけどな

>>306
汎用性のあるソート関数ってどんなの?
なかったら作るか、ググればいいんじゃないの?
0308デフォルトの名無しさん2015/02/04(水) 12:32:04.05ID:/D++sjNY
>>305
それ答になってないたろw
0309デフォルトの名無しさん2015/02/04(水) 12:46:36.02ID:5w98FKMD
>>307
汎用とはそうだな、
・入力は1次元または2次元配列
・2次元の場合、キー列を複数指定可能
・昇順降順の指定が可能
・入力配列のLBoundに縛りなし
・数値文字混在もあり
が基本的なところだろう。
インタフェースは
sort(配列, キー, 昇降, その他オプション)
といった普通の感じで。
0310デフォルトの名無しさん2015/02/04(水) 13:00:25.19ID:8rr12R5m
>>309
普通だな笑
面倒なのはわかるが、一回作ったら使い回せるんだし、それくらい作れば?
0311デフォルトの名無しさん2015/02/04(水) 13:08:46.60ID:5nwIFoIt
両方使ってみて使いやすい方使えばいい
0312デフォルトの名無しさん2015/02/04(水) 13:19:55.18ID:5w98FKMD
>>310
俺は作ってるよ。dllだけど。
「みんなどうしてる?」という質問に対して「それくらい作れば」って答えはどこかおかしいな。
0313デフォルトの名無しさん2015/02/04(水) 14:07:25.56ID:snuPlTJK
EXCEL貼り付けてソートってよろしくないの?
DBのデータベタベタ貼り付けてvlookupやらで加工して
最後にソートをよく使ってるんだが
0314デフォルトの名無しさん2015/02/04(水) 14:24:45.47ID:d/XOjNRx
汎用と言いつつ2次元配列までしか意図してなかったり
比較条件も指定できなかったり全然汎用性なくて笑える
0315デフォルトの名無しさん2015/02/04(水) 18:36:09.87ID:vNQZnkOK
>>314
3次元以上は一般的にそんなに使われないからいいんじゃない?
3次元は混んだ作りすると死ねるよ?

そんなことより早く.Net化して、IComparableインターフェース実装出来るようにしてくれればいいのに。
そうすれば配列に入ったエンティティとして作ったクラスでさえ
そのプロパティからソートしたりすることも出来るのに。
0316デフォルトの名無しさん2015/02/04(水) 19:48:41.31ID:OYpgUZd5
VBAをサポートし続けるのは必要だと思うけど
RoslynオープンソースにするんだしC#スクリプト言語化してくり
0317デフォルトの名無しさん2015/02/04(水) 20:00:25.95ID:QfhTV/If
ネットワークフォルダにあるExcelファイルを開くのが重い(たぶん外国にあるサーバ使ってると思う)ので
ふだんはローカルのCドライブのどこかに置いておき
その2つのファイルの更新日時を調べて(ネットワークフォルダの更新日時を調べるのは軽いと仮定)
違ったときだけネットワークフォルダのファイルをローカルにコピペ、
同じときはローカルのファイルを開くようにしたいです。

このことは実現できますか?
0318デフォルトの名無しさん2015/02/04(水) 20:22:44.88ID:zR1kWEWr
>>317
できると思います
VBAではFileDateTime関数を使えば最終修正日時を取得できます
後はネットワーク上にあるファイルとローカルファイルを比較するだけです
0319デフォルトの名無しさん2015/02/04(水) 20:25:04.74ID:Sl7HR56P
ソートの話に、サーバー上のファイルの話か。
おまいら今日もいい感じにスレ違いだな。
0320デフォルトの名無しさん2015/02/04(水) 20:28:49.66ID:FmLt4Q/z
>>317
自分で作ってもいいし、面倒なら xcopy とかを内部で起動するのもありかと
ただ、Excel ってなぜか開いてるだけで更新日時を変えちゃうから、運用上問題ないかはよく検討した方がいいと思う
0321デフォルトの名無しさん2015/02/04(水) 20:44:18.57ID:QfhTV/If
>>318
>>320
ありがとうございます。
ではどういうコードを書けばいいでしょうか?
0322デフォルトの名無しさん2015/02/04(水) 20:46:00.36ID:QfhTV/If
VBAのクラスモジュールを使ってみようか検討してるけど
継承とかコンストラクタとかが使えないならそんなに便利ではないという結論でいいんでしょうか?
いろんなデザインパターンを駆使して大規模システムをスマートにコーディングしようと考えているんだけど。
0323デフォルトの名無しさん2015/02/04(水) 20:57:12.79ID:Sl7HR56P
>>322
そうだね。
VBAはコンストラクタが使えないとか、
継承が使えないから便利ではないと言っているくらいのレベルなら、
正直オブジェクト指向自体が便利じゃないから止めといた方がいいと思うよ。
0324デフォルトの名無しさん2015/02/04(水) 21:12:55.81ID:5zzM5KFe
>>322
VBAのクラスでもカプセル化出来るし使える場面はあるはずだよ
大規模システムってどの位の規模?
0325デフォルトの名無しさん2015/02/04(水) 21:33:46.95ID:3HKYaoYX
VBA 大規模  ← 検索
0326デフォルトの名無しさん2015/02/04(水) 21:39:08.97ID:FmLt4Q/z
>>322
> 継承とかコンストラクタとかが使えないならそんなに便利ではないという結論でいいんでしょうか?

その結論でいいけど、>>321 みたいなこと聞いてるレベルならデザパタ云々の前にやることあるだろ...
0327デフォルトの名無しさん2015/02/04(水) 23:30:17.87ID:BFzhN8Yg
>>317
それはVBAでやるような話じゃない
オフライン ファイルでググれ

>>322
オブジェクト指向言語を想定したデザインパターンの話っていうならその通り
0328デフォルトの名無しさん2015/02/05(木) 00:00:11.44ID:BZaynF65
ま、それでも例えばテンプレートパターンが使えないなら
どんなパターンを使えばいいかとか、デザインパターン知ってればすぐ思い浮かびそうなもんだけどな。
0329デフォルトの名無しさん2015/02/05(木) 05:35:22.83ID:Z+/EIniY
Excelで大規模アプリ作るなら他の言語の方がいいんしゃね。
ACCESSでよかったじゃんってなる
0330デフォルトの名無しさん2015/02/05(木) 07:13:53.16ID:13xOFOi9
データはDB
ロジックは他の言語
Excelはビューおよびコントロールとして使う
こういうやり方が吉だ
0331デフォルトの名無しさん2015/02/05(木) 07:56:16.04ID:oPJAOj4g
VBAってエクセル97から仕様変更されてないの?
少しだけ機能が増えた程度?
0332デフォルトの名無しさん2015/02/05(木) 08:12:03.34ID:zH6zCuP4
エディタ古臭いよな
他のエディタと連携ってできる?
0333デフォルトの名無しさん2015/02/05(木) 08:24:30.87ID:9SfLMUWM
>>331
そういう下らない話は他でやれよ。
0334デフォルトの名無しさん2015/02/05(木) 12:01:16.49ID:psDjLvHN
VBAの仕様はポケットリファレンスって本に詳しく書いてあるからぜひ買って読んで欲しい
0335デフォルトの名無しさん2015/02/05(木) 12:21:05.11ID:5V2ZyrCG
>>332
ctrl+y の挙動だけは今だに許す気になれん
0336デフォルトの名無しさん2015/02/05(木) 16:31:44.91ID:8iV8xemp
Collectionオブジェクトを消去(解放)するときの質問です。

このページの「コレクション:解放方法」では、まず全部の中身をRemoveで削除してからNothingを代入しています。
http://mitene.or.jp/~rnk/TIPS_VB_GEN.htm

単にNothingを代入するだけではダメなのですか?
0337デフォルトの名無しさん2015/02/05(木) 16:37:39.43ID:Sga35B6x
別にそうしたければそうすればいいじゃない?
使わなくなった変数の中身がどうなっていようとかんけいないじゃん!
0338デフォルトの名無しさん2015/02/05(木) 16:57:01.69ID:8iV8xemp
いや重くなるのを心配してるんだ。
中身も使わなくなったら全部1つ1つRemoveしたほうがいい?
0339デフォルトの名無しさん2015/02/05(木) 17:25:30.07ID:TvPdQkb9
しなくていい
0340デフォルトの名無しさん2015/02/05(木) 18:07:11.99ID:gRFCSFT3
vb.net並みに便利してほしい
どうせVSも無料化してるんだし頼むよMS様
0341デフォルトの名無しさん2015/02/05(木) 18:10:53.32ID:LBbAtoIq
しなくていい
0342デフォルトの名無しさん2015/02/05(木) 18:13:56.63ID:osIltw0C
VBAでプログラム作る時
Option Base 0
Option Base 1
のどっちでやりますか?
0343デフォルトの名無しさん2015/02/05(木) 18:22:41.26ID:TvPdQkb9
>>342
配列使うことが滅多にないから、毎回dim ary(1 to 10)とかやる
0344デフォルトの名無しさん2015/02/05(木) 19:16:16.45ID:MCsqUTWq
>>336,338
そのコレクションの要素が、そのコレクションへの参照持ってたりしたら
単にコレクションの変数をクリアするだけじゃダメなはず
0345デフォルトの名無しさん2015/02/05(木) 19:18:09.07ID:i4Mluon0
既定は0 なんで0
0346デフォルトの名無しさん2015/02/05(木) 19:23:23.83ID:MCsqUTWq
>>342
宣言時に下限指定できるので、Optionで下限変える必要性が薄い
Option Baseにかかわらず0からの配列が生成される場合がある
なので
俺は特殊な事情がない限り、1からしか使わなくても、Option Base 0
0347デフォルトの名無しさん2015/02/05(木) 19:47:02.12ID:NPMhX/hm
>>346
> Option Baseにかかわらず0からの配列が生成される場合がある

LBound( ) 使うから、Option Base は設定したことない
つまりディフォルトのまま
0348デフォルトの名無しさん2015/02/06(金) 00:03:00.47ID:WyNOk6KO
配列をネストさせることってある?
Array(Array(0, 1), Array(2, 3), Array(4, 5))
なんか次元を増やすよりこっちの方が自然な気がしてきた。
0349デフォルトの名無しさん2015/02/06(金) 00:56:28.55ID:MCNka57c
>>348
そんなことできたっけ?
0350デフォルトの名無しさん2015/02/06(金) 01:52:43.14ID:d0YfM+I8
>>348
3次元も分かり辛そうだけどそっちも分かり辛そうだなw

複雑な構造を持つ場合はエンティティクラス作ってコレクションやディクショナリに格納するだろjk

入れ子にする場合はそのエンティティのプロパティを更にコレクションやディクショナリに詰め込んだ
エンティティクラスにしておけば、引っ張り出すとき何て言う項目か一目瞭然だ。

出来る出来ない以前の問題だわな。
0351デフォルトの名無しさん2015/02/06(金) 04:05:29.06ID:ph6zPD+r
配列の配列は別に珍しい方法でも特殊な概念でもないが
0352デフォルトの名無しさん2015/02/06(金) 07:09:22.82ID:WyNOk6KO
>>350
VBAでクラスやコレクションやディクショナリを使ったことはないな。
配列をすべて1次元に統一しておいた方が再帰処理とかしやすいような気がしてきてる。
0353デフォルトの名無しさん2015/02/06(金) 08:35:01.78ID:Uk3UX5SK
一覧表から名前を見つけてフォームのテキストボックスに入れて
そのボックスの右のボタン(Button2)を押したら、別ブックのセルA2にそれを入れる仕様

Private Sub Button2_click()
If TextBox2.Text = "" Then Exit Sub
Workbooks("書類作成").Worksheets("送り状").Range("A2") = TextBox2
Unload Me
Workbooks("一覧表").Close
End Sub

これでA2に入力はされるんだけど、それをF2キーを押して編集しようとすると
必ず固まって強制終了するんだけど、何がまずいの?
0354デフォルトの名無しさん2015/02/06(金) 08:57:43.16ID:kGu0ocwH
デフォルトプロパティって害悪でしかないよな
0355デフォルトの名無しさん2015/02/06(金) 12:32:58.10ID:My4Umhjn
>>352
別に統一性が取れていれば再帰は関係ないかな。
つまり役割ごとに違うクラスやメソッドを作って、その中で使い回せるところは別に切り出して使い回せってこと。
別に何でもかんでも1次元配列でやろうって訳じゃないだろ
0356デフォルトの名無しさん2015/02/06(金) 13:12:24.10ID:0+nTrOfH
テキストボックス内でEnterキーを押すと
となりにあるコマンドボタンを押したことにさせるにはどうしますか?
0357デフォルトの名無しさん2015/02/06(金) 13:25:49.45ID:NoLWhCAx
>>356
テキストボックス内でEnterキーを押されたら、コマンドボタンを押したときに実行される内容を呼び出す。
0358デフォルトの名無しさん2015/02/06(金) 14:05:20.82ID:0+nTrOfH
テキストボックス内でEnterキーを押されたことを検出するには?
0359デフォルトの名無しさん2015/02/06(金) 14:10:59.63ID:0+nTrOfH
VBAでクラスモジュールを使うんですが
クラスの中に他のクラスをプロパティとしてつかういわゆる集約という使い方はできないのですか?
エラーが出ちゃいます。
0360デフォルトの名無しさん2015/02/06(金) 14:18:33.05ID:NoLWhCAx
>>358
ggrks

>>359
できる
やり方はggrks
0361デフォルトの名無しさん2015/02/06(金) 14:35:30.56ID:0+nTrOfH
>>360
dmrks
0362デフォルトの名無しさん2015/02/06(金) 14:55:27.75ID:NoLWhCAx
なんだ、荒しか
0363デフォルトの名無しさん2015/02/06(金) 18:13:25.00ID:My4Umhjn
>>359
型やスコープはあってるの?
どんなエラーメッセージが出てる?
0364デフォルトの名無しさん2015/02/06(金) 18:19:16.08ID:0+nTrOfH
>>363
ふつうのはできてるけど
Collectionをクラスのプロパティにするとエラーがでちゃうんですよ。
0365デフォルトの名無しさん2015/02/06(金) 18:35:37.12ID:NoLWhCAx
エラーメッセージ書けと言われてるのも理解できないのか
0366デフォルトの名無しさん2015/02/06(金) 21:47:23.64ID:WyNOk6KO
>>355
メインの言語は別にあって、Excel/VBAは手元のデータの取り回しに特化してる。
だからVBAでクラスやメソッドをつくるのはちょっと遠慮しておきたいな。
なんでもかんでも配列でやっているんだけど、多次元のうっとうしさが嫌になってきてる。
とは言え「表」計算ソフトなんで、2次元の表という形式からは離れがたい。
0367デフォルトの名無しさん2015/02/06(金) 23:11:57.30ID:WyNOk6KO
多次元配列と1次元配列が事前に区別できないのがつらい。
作った関数に配列を渡したとき、次元に関わらず同じ意味のことをやれるなら問題ないけど、そうじゃないことも多い。
2次元の時は、処理を縦に適用するのか横に適用するのかという(1次元の場合にはない)問題が発生して、
それを指定するための引数が余分に必要になったりする。
0368デフォルトの名無しさん2015/02/06(金) 23:47:26.16ID:d0YfM+I8
>>367
例えばAというシートとBというシートにそれぞれ一覧を出力したいとする。Aには1行、Bには複数行出力するとして、
出力位置も違えば計算方法も違う。でもシートに出力するという意味では同じ。
そうしたとき、同じ関数でまかなう?違う関数を呼びだす?違うクラス作る?
0369デフォルトの名無しさん2015/02/07(土) 00:17:28.66ID:2PYtlFBn
>>368
事前の計算から出力まで一体化するわけじゃないんだろ?

出力だけならどちらも
Range( X ).Value = data
という同一の式で書けるんだから、同じ関数だろう。
dataの中身が何行あるかで分けるなんてナンセンス。
0370デフォルトの名無しさん2015/02/07(土) 02:16:49.45ID:0QjeMX7S
>>368
何を言わせたいのか分かるけど、敢えて何も言わない
俺もどんなレスがつくか生暖かい目で見守ってたい
0371デフォルトの名無しさん2015/02/07(土) 07:29:05.15ID:2PYtlFBn
>>368
>>370

計算方法が違うなら3段階に分けるだろ。
処理Iと処理Oは共通。そういうことが聞きたいのか?

            
シートから入力 |       処理I(引数:入力レンジ)
--------------------------------------------------
計算        |   処理C1   処理C2
--------------------------------------------------
シートへ出力   |      処理O(引数:出力レンジ)

どっちにしろワークシートとのI/Oは2次元なんだから、こういう部部分で次元について悩む要素はない。
そういうのと関係ない部分では多次元は扱いづらい。
0372デフォルトの名無しさん2015/02/07(土) 07:37:32.14ID:2PYtlFBn
引数が足りなかったな

処理O(引数:出力レンジ、引数:出力データ)
0373デフォルトの名無しさん2015/02/07(土) 08:07:29.99ID:0QjeMX7S
言ってることは間違っていないんだからもっと肩の力抜いて行こうぜ
0374デフォルトの名無しさん2015/02/07(土) 08:18:10.07ID:2PYtlFBn
>>373
睡眠時間足りなくないか?
0375デフォルトの名無しさん2015/02/07(土) 08:23:41.74ID:0QjeMX7S
そうか?働いていれば6時間くらいなら普通の範疇だと思うが
0376デフォルトの名無しさん2015/02/07(土) 08:38:47.99ID:2PYtlFBn
そろそろ>>368が何を言わせたかったのか教えてもらいたい
0377デフォルトの名無しさん2015/02/07(土) 08:53:35.23ID:0QjeMX7S
>>371の方法で行うとして、それをどう組むかってことだろうな。
だからクラスやら関数やらって持って回った言い方してるんだろう。
0378デフォルトの名無しさん2015/02/07(土) 11:39:31.01ID:4S24w56C
構造体のような機能のTypeを使って
Type Person
Index As Integer
Name As String
Age As Integer


End Type
で定義。

そしてこれを
Dim Person(100) as Person
で使うとします。

PersonをAge順でソートしてその順番にIndexを1から順番に1,2,3,4,5・・・と代入するには
どうすればいいですか?
既存の機能みたいなのがあればいいのですが、なければ自作するしかないのかなと思ってますが。
0379デフォルトの名無しさん2015/02/07(土) 11:42:33.00ID:pGoj+FY2
>>338
規模による
ノンストップサーバーで常時動作するアプリなら丁寧に開放すべき
でもExcel VBAをそんな場面で使っちゃダメかと
0380デフォルトの名無しさん2015/02/07(土) 11:48:39.28ID:pGoj+FY2
>>378
そのパーソンのデータは元々何処に存在する?
DBならSQLでソートして取得、Excelシートならマクロでソートして取得する
VBAだけでやるなら通常のソート使う
0381デフォルトの名無しさん2015/02/07(土) 16:04:26.64ID:HrLZN6WD
グラフの元のデータの選択範囲を変更するときに
ActiveChart.SetSourceData Source:=Range("G1:G10") ならできたのですが
ActiveChart.SetSourceData Source:=Range(Cells(3, 3), Cells(N + 2, 3)) のように書くと

'cells' メソッドは失敗しました とエラーが出ます。後者の書き方はできないのでしょうか。
03823782015/02/07(土) 16:08:29.07ID:4S24w56C
>>380
説明を超簡単にするため仮にPersonの例を出しただけで実際は全く違うしかなり複雑なんです。
なので一般的に構造体のある1つの要素でソートしてその並んだ順に番号を振るという動作を実現したい。
(そりゃ上のPersonの例だと元のシートがありそうだからそこでソートしたら簡単だよね)

もし例えるなら
ある長文文書のカタカナだけを構造体KanaWordで取り出し
重複して取り出したカタカナ語をどうにかしたいからその出現回数でソートし
それについて連番をつけることによってName+Indexの組み合わせをユニークにしたいんです。
0383デフォルトの名無しさん2015/02/07(土) 16:28:12.16ID:L56gFTsW
>>381
N の値がおかしいんじゃないのか?
まずは、定数で試してみなよ
0384デフォルトの名無しさん2015/02/07(土) 17:01:06.53ID:HrLZN6WD
>>383
定数にしてもエラーになってしまいます(´・ω・`)
0385デフォルトの名無しさん2015/02/07(土) 17:42:17.05ID:HrLZN6WD
ぐぐっていたらこちらのサイトで解決策を見つけました。
http://www.excel.studio-kazu.jp/kw/20040602163036.html

シートを指定すればいいそうです。
(略):=Range(Sheets("2").Cells(3, 3), Sheets("2").Cells(N + 2, 3))

これだとエラー
(略):=Sheets("2").Range(Cells(3, 3), Cells(N + 2, 3))

バージョンはエクセル2003なのですが、新しいバージョンならシート指定しなくてもいいんですかね?
新規作成するときは :=Range(Cells(3, 3), Cells(N + 2, 3)) でいけたんですが
範囲を変更するにはシート指定しないといけないってちょっと面倒(´・ω・`)
0386デフォルトの名無しさん2015/02/07(土) 18:03:57.62ID:0QjeMX7S
>>382
自分でつくるか.Net化することを祈るしかないな
0387デフォルトの名無しさん2015/02/07(土) 18:12:47.55ID:0QjeMX7S
>>385
Withで前のRangeにも後ろのCellにも掛かるように書いておいた方がいいんじゃない?シートじゃなくブックごと。
0388デフォルトの名無しさん2015/02/07(土) 19:35:24.45ID:MiKLeMlV
>>382
VBAそのものにソート機能は無い

>>385
そのコードが書かれていたモジュールによってどのシート見るか変わる
指定しなければ動かないというわけではないが
解らないなら全部シート指定しといたほうが無難だぞ
0389デフォルトの名無しさん2015/02/07(土) 19:44:32.51ID:HrLZN6WD
>>387>>388
ありがとうございます。
指定してやります。
0390デフォルトの名無しさん2015/02/08(日) 11:27:49.95ID:7++NHH4w
>>382
それだと最初に取り出す時に正規化で抜けそうやね
で、構造体の要素に比較格納すれば同時にカウントもできる
0391デフォルトの名無しさん2015/02/09(月) 08:30:34.40ID:+ZaMOdKK
>>382
あなたの言ってることは構造体の列にランキングを付けたいということだけど、実際に並べかえたいのか、ランキング付けだけでいいのか。
0392デフォルトの名無しさん2015/02/10(火) 21:06:45.70ID:v+Odw02j
最近VBAで何かを楽しようっていうネタがなくなってきた
作りきってしまった感がある
VBAで組んで初めて人に褒められた時は超楽しかったはずなのに…
0393デフォルトの名無しさん2015/02/10(火) 23:01:15.47ID:REXxw1bP
>>392
ゲームでも作ったらみんな驚くぞ
まずはテトリスあたりが簡単そうだな
ゲームプログラミングがキッカケで新しいネタ思いつくかも
このゲームのこの処理はあの業務の改善にも応用できるぞ、とか
0394デフォルトの名無しさん2015/02/10(火) 23:32:09.67ID:QamkDOo/
>>392
今までどんなの作った?
0395デフォルトの名無しさん2015/02/11(水) 02:18:59.86ID:WrS2F/u8
>>392
多分もう次のステップに進む時期が来てるんだよ。

一度Object指向言語やってからまたVBAやってみると、今までの組み方とまた全然違う
組み方で組めるようになるし、より効率のいい方法をチョイス出来るようになる。

>>393
そう思ってテトリスやアクションゲーム作った時期があったけど、あまり業務には繋がらなかったかな。
座標計算がおもだし、APIも業務で使うAPIとは毛色が違うし。
03963922015/02/11(水) 04:25:38.05ID:OQ+aNcDd
>>394
今までは以下のことをしてました。
・DB(Access)やcsvから必要なデータを抽出・集計して目的の資料(工程表、請求書、クレーム管理表、csv)をワンボタンで作る機能
(DBはDAOやADOで接続)
・入力フォームがあるExcelやcsvからDBにデータを格納する機能
・AccessVBAで、更新クエリを連続で行い、基幹システムのデータベースサーバーのデータを抽出
・社内にあるNASの容量監視
・OutlookVBAで誤送信防止や重すぎるファイルを送ってないかのチェック機能
・メールアドレス一覧表を送って、選択したメールアドレスをOutlookの連絡先に追加、削除する機能
・VBScript、VB.NETを使った営業所間のファイルコピーバッチ処理

こう見ると、随分officeとvbに毒されてるなぁ、スレ違いの内容も多々ありますね…
IE・HTML操作はしたことないですけど、活用されてる方っていますか?
0397デフォルトの名無しさん2015/02/11(水) 07:11:39.99ID:WrS2F/u8
>>396
あー、VBAじゃ確かにWebのサイトやページ見に行くことはあってもそれらを構成して扱うようなことはしないからなぁ。

そっちに興味があるならVB.Netの経験あるみたいだし、ASP.Netやってみれば?

HTMLやJavaScript、IISとかの知識が必要になるけど、あの辺はまぁSQLとかみたいに
最初でもその場凌ぎでそこそこ何とかなるもんだし。
0398デフォルトの名無しさん2015/02/11(水) 13:36:28.94ID:qmuMcExT
ゲームのレベルがカンストしてやることなくなったみたいw
リアルでカンストってすごいじゃんw
0399デフォルトの名無しさん2015/02/11(水) 23:58:32.19ID:GkIWFUyF
転職すればまたやりたい事沢山出てくるんじゃね?
0400デフォルトの名無しさん2015/02/12(木) 15:34:43.50ID:Qj2+qwXZ
100名程度の利用者を想定して入力システムを作っているのですが、
画面サイズ(フォームのウィンドウサイズ)をどうするか悩んでいます

それぞれ違うPCであるので、機種により解像度はバラバラで最適なフォームのサイズを決めるのは
無理だとは思うのですが、基本的なサイズ(割と出回ってるPCを想定して)はどの程度でしょうか?
Windowサイズを取得してそれにあわせて調整する手法もあるようですが、
無難なサイズで決め打ちするとしたらどれくらいのウィンドウサイズが限界でしょうか

いまのところ幅800高さ600程度で作っており、あとはFormプロパティのZoomを使って
利用者が好きなサイズに調整してもらう(システム設定などを設けて)のが良いかなとおもってるのですが
0401デフォルトの名無しさん2015/02/12(木) 17:08:34.82ID:HJuTvgcS
時代はHD(`・ω・´) シャキーン
0402デフォルトの名無しさん2015/02/12(木) 20:34:11.54ID:UIrtzQjf
価格コムあたりでディスプレイサイズを検索したら?
大体の規格は決まっているんだから。
0403デフォルトの名無しさん2015/02/12(木) 21:55:05.40ID:JYibxDvk
>幅800高さ600程度

それくらいなら大丈夫だろ。
んで、コントロールを詰め込みたいならマルチページで(使い勝手がどうなるかは知らんけど)
0404デフォルトの名無しさん2015/02/12(木) 22:42:46.58ID:0MvvafYQ
俺が知らん間に高DPIディスプレイって結構普及してるのか?
0405デフォルトの名無しさん2015/02/12(木) 23:21:06.49ID:yvPuD0M1
この前電気屋でノートPC見たら4K15インチとか割と普通にあった
対応アプリ少ないし情弱ホイホイだよね
0406デフォルトの名無しさん2015/02/13(金) 00:18:41.02ID:WPkK2771
質問お願いします。
正規表現にて下記パターンのテーブルデータを抜き出したいのですが、
どのように修正すればよいでしょうか?


//抜き出したいパターン
<td class="tal">2007年12月14日</td>
<td>0.48倍</td>
<td>86.47倍</td>
<td>2.20倍</td>
<td>2.41%</td>
<td>380.0円</td>
<td>316.6円</td>
//抜き出したいパターンここまで

正規表現は以下の通りです。

.Pattern = _
">(\d{4})年(\d?\d)月(\d?\d)日<[\s\S]+?" & _
">([0-9,.\-]+)倍<[\s\S]+?" & _
">([0-9,.\-]+)倍<[\s\S]+?" & _
">([0-9,.\-]+)倍<[\s\S]+?" & _
">([0-9,.]+)%<[\s\S]+?" & _
">([0-9,.]+)円<[\s\S]+?" & _
">([0-9,.]+)円<[\s\S]{7,30}?"
0407デフォルトの名無しさん2015/02/13(金) 00:19:56.57ID:WPkK2771
下記のようなパターンが抽出されて困ってしまいます。(途中省略しています)

//不本意に抜き出されるパターン

 <td class="tal">2015年01月13日</td>
<td>207.0円</td>
<td>207.0円</td>
<td>206.0円</td>
<td>206.0円</td>
<td>206.0円</td>
<td>7,800株</td>

//途中省略

<td class="tal">2007年12月14日</td>
<td>0.48倍</td>
<td>86.47倍</td>
<td>2.20倍</td>
<td>2.41%</td>
<td>380.0円</td>
<td>316.6円</td>

//不本意に抜き出されるパターンここまで
04084002015/02/13(金) 00:56:40.40ID:88+vWfY0
皆様レスどうもです
HDが結構多いようですね
高さ1024、幅を768の解像度を最低ラインにおいて表示しきれるサイズに設定
あとは拡大で対応することにしました
環境依存かはわからないのですが、どうもZoom使うと縮小で文字がつぶれやすく
拡大ならあまり違和感がないように思えるので・・・
0409デフォルトの名無しさん2015/02/13(金) 01:33:27.21ID:h7QHBloi
>>407
タグを、<[^>]+>に変えりゃいいだけじゃね?
0410デフォルトの名無しさん2015/02/13(金) 01:53:27.97ID:HSv1A/XD
★2 ExcelのVBA以外の部分に関する質問はNGです。
0411デフォルトの名無しさん2015/02/13(金) 17:25:45.77ID:oMBvQyXe
>>410
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0412デフォルトの名無しさん2015/02/13(金) 22:42:05.64ID:WPkK2771
>>409
ありがとうございました。自己解決いたしました。
0413デフォルトの名無しさん2015/02/13(金) 22:55:29.57ID:9Fk2rE3h
教えてもらって解決したのは自己解決とは言わんて w
0414デフォルトの名無しさん2015/02/14(土) 00:18:12.33ID:QDZ5YXBX
今日はバレンタインデーなので
彼女が出来てチョコが貰えるような
プログラムを教えてください
0415デフォルトの名無しさん2015/02/14(土) 07:40:45.98ID:KHQ6ogQm
>>414
ネタにマジレスしちゃうが
以前Excel教えたのがきっかけで告られた

自分が教えられるレベルになるのが早道
0416デフォルトの名無しさん2015/02/14(土) 18:06:45.77ID:ftV3bqT6
xlsmでフォームを利用した入力システムを作成しており、xlsでもエラーが出ないように修正したところ、
xlsだと明らかに動作が遅く、容量もでかくなってしまいました

組織内のある程度の人数に配布して使うこと予定していますが、office2003にも対応させるためxlsで配布すべきでしょうか?
XPもOffice2003もサポート終了しているので、2007以降の使用推奨でxlsmでいってもよいものでしょうか

1.xlsmで配布し、office2003(XPでは使用しないよう指導しているため)はおそらく少ないので、起動しなかったものにのみ
互換のパッチをインストール入れるよう指導 (互換パックで果たして問題がでないか)
2.xlsで当分配布し続ける (大勢の2007以降のユーザが重くなる・・・)
3.xlsmとxlsの両バージョンを作成して配布する (修正漏れや手間の増大)

素人考えでは1でいいかと思っているのですが、皆様のご意見をお聞かせ下さいませ
0417デフォルトの名無しさん2015/02/14(土) 18:30:19.00ID:7Vd0Rb/A
組織の問題をここで解決しちゃて良いのか?
貴方の所属している部署で話し合って解決すべき問題じゃないのか?
0418デフォルトの名無しさん2015/02/14(土) 19:00:02.61ID:V3WmF4i9
つか、まずxlsmをxlsにすると遅くなるってのが本当なのか?
動くかどうか知らんが、互換パックで2003でxlsm動かしたら遅くないのか?
そのへんまずちゃんと調べるべきじゃないかね

ファイルサイズは圧縮の問題もあるからxlsの方が大きいのは解るが
そのファイルサイズ差で読込の時間差が体感できるほどでかいのか
0419デフォルトの名無しさん2015/02/14(土) 19:01:32.41ID:ftV3bqT6
>>417
使う状況はそれぞれ個人のPCで、あくまでもお助けツールに配るものです
使う対象者も、officeのバージョンと言われて??となるものがほとんどです

そもそもPCに触ることが少ない業種で、私が日曜大工的につくってるので協議自体きびしいので
企業のプロの皆様がどのように協議されて仕様を決めていらっしゃるのかをお聞きしたいところなのです
0420デフォルトの名無しさん2015/02/14(土) 19:05:06.75ID:ftV3bqT6
>>418
一番重く感じるのは保存のときです
xlsmではほぼ一瞬で保存できるのですが、xlsでは5秒ほどかかります
保存のコードもWorkbookをSaveさせてるだけでごくごく単純なモノです
0421デフォルトの名無しさん2015/02/14(土) 19:21:07.27ID:7Vd0Rb/A
自分で決めてしまっていいんだったら1でしょ。それで2007以前の使用者には
2007以降が動作しているPCで入力させるようにする
開発するのは2007以降のExcelのみ

「PCに触ることが少ない業種」というのなら、それでも大丈夫なんじゃ?

とにかく3の両方のバージョンで開発…ってのはやるべきじゃないよ。
0422デフォルトの名無しさん2015/02/14(土) 20:57:56.01ID:GhXkSxmT
4. vbで作り直す
0423デフォルトの名無しさん2015/02/14(土) 21:26:57.97ID:KHQ6ogQm
>>416
2003でも使う可能性がゼロでなければ2003でxlsを作るべき
0424デフォルトの名無しさん2015/02/14(土) 22:45:21.66ID:QDZ5YXBX
もうサイコロ振って出た目の偶数奇数で決めればいいじゃん
0425デフォルトの名無しさん2015/02/14(土) 23:40:58.12ID:1Y81Pu5O
Office365で、全部Excel2013にしろよ。いや、office onlineって無料だよな。
0426デフォルトの名無しさん2015/02/15(日) 00:26:48.50ID:sUCb2gvv
VBAでデーターを自動集計するときに少量ずつのデータをひたすら複数のシートにわけていくのと
なるべくシートを増やさずに1枚のシートにとにかくまとめるように書き上げていくのでは
どちらがお勧めでしょうか?どちらもデーター量は同じですが
配列でシートを無制限にわけて記載しているとすぐに100とか200になり動きがのろのろになりErrorを出し始めます
かといって1枚のシートにびっしり書いても見るのが大変なような気がしますが
こういう場合プロの型はどう考えますか?アドバイスをお願いします。
0427デフォルトの名無しさん2015/02/15(日) 00:30:21.52ID:OSP9f7zT
シート100個とか何の嫌がらせだよって思うよ
0428デフォルトの名無しさん2015/02/15(日) 00:44:56.37ID:sUCb2gvv
>>427
VBAで大きなデータを集計しているとシート100以上はだんだん当たり前になってきました。
0429デフォルトの名無しさん2015/02/15(日) 00:52:00.98ID:sUCb2gvv
>>427
ちなみに集計が終わるまで数時間〜数日かかりますw
0430デフォルトの名無しさん2015/02/15(日) 03:34:07.74ID:2k7M9Vvu
最終的に欲しいシートの形にするのが正しいとしか言えん

速度もとめるならなるべくセルのアクセスはするな
それでもダメならDB使えと言う事だな
0431デフォルトの名無しさん2015/02/15(日) 05:02:11.90ID:5a321sUW
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0432デフォルトの名無しさん2015/02/15(日) 12:25:24.24ID:iNvc7Ap0
>>426
>どう考えますか?アドバイスをお願いします。


データベースを使え

以上
0433デフォルトの名無しさん2015/02/15(日) 12:46:17.07ID:hX4FLjKV
>>432
禿同
0434デフォルトの名無しさん2015/02/15(日) 12:46:20.59ID:GXmLhnKq
>>432
禿同
0435デフォルトの名無しさん2015/02/15(日) 12:59:47.80ID:GXmLhnKq
あと2010ぐらいから組み込み関数はマルチスレッドだよな
VBA部分を最低限に留めて関数使うとか
あるいはEXCEL自体4つ起動してマルチプロセスなんて手も
04364262015/02/15(日) 13:44:19.13ID:ewrQ2M2I
自分なりに発見した答えらしき物は
Excelはシートを大量に増やすとデーターを記入してなくてもそれだけ保存に時間がかかり始める
1シート可能な限りびっしり書いてタブを少なくする方が多少保存時間が短くなり有利と見た。
あくまでも仮設ですが
異論はありますか?
0437デフォルトの名無しさん2015/02/15(日) 14:15:12.89ID:+57Y18Mn
それで事足りているならいいんじゃない?
0438デフォルトの名無しさん2015/02/15(日) 14:30:25.82ID:sEjoCWJq
>>436
あと書式は保存する必要ないから
必要な時に書式設定し閉じる前に書式クリアするとか
04394262015/02/15(日) 14:35:28.30ID:Mbr78bgH
>>438
なるほど突き詰めるとそうですね。ありがとうございます。
0440デフォルトの名無しさん2015/02/15(日) 18:01:15.58ID:MngQp/hY
このスレは質問が少ないね 
0441デフォルトの名無しさん2015/02/15(日) 20:15:18.71ID:5a321sUW
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0442デフォルトの名無しさん2015/02/15(日) 21:02:46.85ID:8LRSDeDa
>>441
Application.ScreenUpdating=False
荒しはスルーで
0443デフォルトの名無しさん2015/02/15(日) 21:19:10.09ID:5a321sUW
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0444デフォルトの名無しさん2015/02/15(日) 21:30:42.70ID:uqlijj6V
>>443
Application.ScreenUpdating=False
0445デフォルトの名無しさん2015/02/15(日) 21:41:52.18ID:+PYg4EOn
データー
ってちょっと気持ち悪い
0446デフォルトの名無しさん2015/02/15(日) 22:05:42.98ID:kxXNdknJ
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0447デフォルトの名無しさん2015/02/16(月) 16:58:53.02ID:H/rtMJFz
excel2010の環境で帳票システムを組んでいたんですが、
ほぼ組み上がったところでセルの文字列表示が1024字までというのを知り途方に暮れています
加えて256文字以上1024文字以下で######になるという記事も見つけ
入力させる項目の一つには500字程度や1024字を超えるものもあり、どうしたものかと・・・

作成したシステムは、入力フォームに配置したテキストボックスに文章を入力
入力した文字列は該当セルに記録し(他項目もあわせてデータ用のシートに保存)
印刷はテンプレートを作っておいて、データシートのセルの値をテンプレートシートに入れていき
文字数に応じてフォントサイズを調整して、プレビュー確認という感じでプログラムしてます
Office2007や2003のパソコンでも使う予定なのですが、何か対策はないでしょうか
0448デフォルトの名無しさん2015/02/16(月) 17:59:00.55ID:yfdXomUc
>項目の一つには500字程度や1024字を超えるものもあり
EXCELはワープロソフトじゃない訳で文字数制限がきついのはどうしょうもないかと

1セルに全部いれるんじゃなくて制限超えないように 数セルに分けるのはどうなのよ?

あと
そもそも WORDでやる案件のような気もするんだけどWORDじゃだめなん?
0449デフォルトの名無しさん2015/02/16(月) 18:49:26.10ID:H/rtMJFz
>>448
> 数セルに分ける
しかないですかね・・・
問題は文章中に改行もあるので、固定値で区切って次のセルに流すと、文の途中で
改行されてしまうので、ある程度の文字数で改行のある区切りを検査して切り分けて
それをセルに順次分けて流し込む ような感じでしょうか・・・
あとは#になる仕様(バグ?)対策に、書式設定を文字列ではなく標準にしないとでしょうか

ただ、流し込む枠(印刷レポートの書式)が既に運用されていて変更できないので、
文字数にあわせて文字サイズとさらに分けているセルの高さも考慮してはめ込まなければならない上に
文字サイズを調整した文章に、さらに枠全体に配置するために垂直の均等割り当てをしていたのですが、
複数のセルにまたがるとなるとそれもできないですね・・・ 困りました・・・orz
0450デフォルトの名無しさん2015/02/16(月) 19:51:35.23ID:GvyW2zIK
shapeでもだめなんだっけ?
0451デフォルトの名無しさん2015/02/16(月) 20:58:57.53ID:xdM8JK5o
>>449
でっかいラベルをシートに置いて、そこに表示させれば?
ページが分かれる可能性があるなら幾つも作っておくとか
セルほどの柔軟性はなくなるけど、まぁなんとかなるんじゃないか
コードはこんな感じ
ActiveSheet.DrawingObjects("ラベル 1").Text = "テキスト内容"
0452デフォルトの名無しさん2015/02/16(月) 21:38:57.85ID:dgZM3/Bj
チェンジイベントでヴァリデーション使って黄色い小窓をだせば?
0453デフォルトの名無しさん2015/02/16(月) 21:39:47.72ID:x+zyA1Lt
既に運用している印刷レポートって、Access?
0454デフォルトの名無しさん2015/02/17(火) 00:12:30.43ID:146t/jKa
>>449
複数セルを結合して使っちゃダメなの?
0455デフォルトの名無しさん2015/02/17(火) 01:35:26.10ID:lrt7cu1f
プロシージャは役割ごとに細かく分けたほうがいいと言うので
おおもとのプロシージャAからプロシージャBを抜き出しそれをAから呼び出すことにしました。

しかしここで問題が。

BにはAで使ってた変数がたくさんあります。
でもAとは分裂してしまったのでAへのたくさんの変数の参照ができなくなりました。
こういうのって、どうやって解決するのが定番なのですか?
まさかAの変数をすべてグローバルにするの?
グローバル変数というのも使わないほうがいいと言うので困っています。
0456デフォルトの名無しさん2015/02/17(火) 04:05:11.02ID:X2MoRgQW
>>455
ggrks
VBA 変数 スコープ
0457デフォルトの名無しさん2015/02/17(火) 05:33:38.22ID:or7h50KG
>>455
グローバルはpublic、モジュール内全体はprivate、プロシージャ内はautoと三種の参照範囲があるから、それで頑張るくらいかな

VBAで小規模なら細かく分ける必要も無いと思うけど
0458デフォルトの名無しさん2015/02/17(火) 07:19:27.06ID:9NYC6Wy0
>>449
出力エリアがきまってるなら、それに収まる程度に入力を制限するのが普通だろ

>>455
役割ごとにちゃんと分割できてれば、Bの役割に必要な情報をBへの引数で渡すのが一般的
もしBが大量の(A内の)変数を見ないとダメなら、そもそもの機能分割がちゃんとできてない
0459デフォルトの名無しさん2015/02/17(火) 08:52:30.90ID:4e4VuLTt
>>454
結合すれば1024を超えて表示が可能でしょうか?
今のところ2セルを結合しています

>>458
エリアが決まっているので文字数で文字サイズに応じて調整+均等割り付けで
体裁を整えるというように組んでいますが、
業務上、何文字以内という制限を設けるわけにはいかないので・・・
もともとワードでやっていたのですが、文字数のばらつきが多く、
あまりPCに詳しくない利用者が文字サイズや行間の調整ができないので
自動で全てまかなう為にフォームで入れさせて印刷するために設計してます
0460デフォルトの名無しさん2015/02/17(火) 09:51:43.90ID:CCisoKxZ
Excelは諦めた方が早い気がします。
0461デフォルトの名無しさん2015/02/17(火) 11:31:05.37ID:X2MoRgQW
まだ始めてないのが幸い
0462デフォルトの名無しさん2015/02/17(火) 11:56:41.84ID:LFQwlpnt
>>455
イメージと実態が異なってるかもしれないので聞きたいんだけど、
・元のプロシージャは大体何行くらいか?
・たくさんの変数って大体何個くらいか、配列は使っているか?
04634592015/02/17(火) 12:11:55.22ID:GkDdPpGy
>>460
そんな殺生なorz

古いPC引っ張り出してExcel2007で試してみたんですが、
確かに書式設定を「文字列」にすれば2000字くらい入れたセルは
########と表示されるんですが、「標準」にしてあげれば
表示されるんですが、どういうことでしょう

文字サイズを小さくして1セル内に入りきる調整はいりますが、
入ってしまえば1024も軽く超えて表示できてますし、プレビューでも表示できてる
0464デフォルトの名無しさん2015/02/17(火) 12:14:07.07ID:GkDdPpGy
ちなみに「折り返して表示」のチェックを入れてあります
0465デフォルトの名無しさん2015/02/17(火) 15:49:10.19ID:875KssuY
すでに決まってる印刷範囲がどんなもんかわからんけど
1行の文字数上限決めて、上限超えた文字は下の行に強制改行していけばいいんじゃねーの?(鼻ほじ

あとは WordVBA で範囲内の書式をクリアするってのがあるから
逆に範囲内の書式を設定することできるんじゃね?
Word持ってない・使ったことないから詳しくは知らんけど
0466デフォルトの名無しさん2015/02/17(火) 17:08:53.70ID:ScAGgWPE
初かきこみです。
excelのuserformで作成してみたのですが、よくわからなくて。
オプションボタンをクリックするとコンボボックスの選択していたrowsourceが出てくるのですが。

そこで出てきたコンボボックスの値を確定ボタン(コマンドボタン)をクリックしたときにB2に打ち込まれるようにしたくて打ち込まれたら次のB3、b4という感じに繰り返して、閉じるボタンを押すまで打ち込める状態にしたいのですが。

どういう関数なら打ち込めるのかわかりません。長文&説明下手なのでよくわからないかもですが、教えてください
0467デフォルトの名無しさん2015/02/17(火) 18:05:57.87ID:jRndRgSB
DTMの人?
0468デフォルトの名無しさん2015/02/17(火) 20:50:40.68ID:MwEIMFRH
>>457
> プロシージャ内はauto

いつの間にそんなもんが
0469デフォルトの名無しさん2015/02/17(火) 23:48:47.02ID:6KvLI8HS
>>468
古い知識(auto変数)で書いたんだけど、プロシージャ内のdimは正式には何て言うの?
0470デフォルトの名無しさん2015/02/17(火) 23:50:19.47ID:wuWlXvwR
VBA初心者ですが
セルへのアクセスを減らすとスピードが速くなるという書き込みを過去コメントで見ましたが
Dim で変数を定義していくとして実用範囲で最大何個ぐらいまで定義できるのでしょうか?
今構想中の計画では2500必要であることがわかったのですが2500個定義することは可能なのでしょうか?
詳しい方いらっしゃいましたら宜しくお願い致します。
0471デフォルトの名無しさん2015/02/17(火) 23:55:06.61ID:6KvLI8HS
>>470
その変数のサイズ×配列数が2GB内
0472デフォルトの名無しさん2015/02/18(水) 00:00:43.15ID:0d8GWwAd
>>471
2000MBの2GBですか?でしたら膨大ですね。 
定義するのは桁数の少ない自然数なので2500個は全く問題無さそうですね。
ありがとうございます。
0473デフォルトの名無しさん2015/02/18(水) 00:29:38.42ID:FooM0Je6
>>469
古いも新しいもVBAやVBにauto変数なんてないわ
VBAでの変数のスコープは一般的にはプロシジャ(プライベート)、モジュール、パブリックだ
正確にはヘルプの「適用範囲と参照可能範囲の概要」みると
>プロシージャ レベル、プライベート モジュール レベル、およびパブリック モジュール レベルがあります
って書いてあるがな
0474デフォルトの名無しさん2015/02/18(水) 00:30:26.31ID:LcW7LB/I
初歩的な質問なのかもしれませんが、お願いします。
いくつかの数値を纏めて格納する 方法として、リスト()形式と、コレクション形式というのがあると聞きました。
格納が終わったあとで、入っている数値を、昇順に並べ替えて取り出したい場合は、どうすれば上手くやれるでしょう?
たとえば、1を格納、5を格納、3を格納、とやった後に、「135」と並べ替えて出力したい場合などです。

よろしくお願いします。
0475デフォルトの名無しさん2015/02/18(水) 00:43:05.77ID:FooM0Je6
>>474
リスト()形式って何か知らんが
VBAにそのような機能はありません
自作するか、エクセルシートで代用するか、外部ライブラリ使うかして下さい
0476デフォルトの名無しさん2015/02/18(水) 01:24:18.41ID:hnIb3krl
Dim i As Integer
For i = 1 To 100
Dim j As Integer

Next i

のようにForブロック内で宣言した変数jは
Forブロックの外でも使えますか?
0477デフォルトの名無しさん2015/02/18(水) 01:47:08.51ID:FooM0Je6
>>476
宣言より後なら使える
0478デフォルトの名無しさん2015/02/18(水) 04:20:36.63ID:qJod6Zoi
>>474
配列にソートという関数は無いの?

Rubyで言うと、Arrayクラス.sort
0479デフォルトの名無しさん2015/02/18(水) 08:22:38.53ID:yLcFaQ17
>>478
ない

VBAって参照を返せないのがなんとも不便だよなあ。ByRefで受け取った大きな配列をByRefで出力する方法はないものか。
これがあればパイプ処理できるのに。
0480デフォルトの名無しさん2015/02/18(水) 08:44:07.09ID:Lm/UpLLW
>>469
ローカル変数でいいでしょ
特定の言語 (C/C++) の用語使うより全然マシ
0481デフォルトの名無しさん2015/02/18(水) 08:57:16.29ID:mZTAkLE5
>>479
自作するしかないね
0482デフォルトの名無しさん2015/02/18(水) 09:00:07.27ID:Lm/UpLLW
>>479
> ByRefで受け取った大きな配列をByRefで出力する方法はないものか。

同じ配列なら返さなくてもいいように思うが...

Variant 型は実質参照みたいなもんだから、これじゃダメ?

Sub T()
Debug.Print F()(55)
End Sub

Function F() As Variant
Dim A(100) As Intger
A(55) = "松井"
F = A
End Function
0483デフォルトの名無しさん2015/02/18(水) 10:19:46.66ID:yLcFaQ17
>>482
配列に対する操作を繋げたいんですよ。
func2(func2(func1(matrix)))
とやるとmatrixの3ヵ所が変更されるみたいに。
そのたびに新しく配列を作って返すんじゃ効率が悪いから、副作用ありで繋げる処理を書きたい。
0484デフォルトの名無しさん2015/02/18(水) 11:41:15.32ID:yLcFaQ17
間違えた
func2(func2(func1(matrix)))じゃなくて
func3(func2(func1(matrix)))
0485デフォルトの名無しさん2015/02/18(水) 11:41:27.73ID:Yek5NpLy
逆じゃね?
他の言語は知らんけど
VBAでは配列変数はByRefでしか受け渡し出来ないんじゃなかったっけ?
0486デフォルトの名無しさん2015/02/18(水) 11:48:28.31ID:QJoLg/2B
なんで
func1(matrix)
func2(matrix)
func3(matrix)
って書きたくないのかがわからん。
こっちのがどういう順番で何やってるか一目瞭然なのに。
0487デフォルトの名無しさん2015/02/18(水) 11:51:14.19ID:yLcFaQ17
それともうひとつ言うと、for each で取る要素が参照じゃないのが不満。
x = x * 2 という式で各要素を2倍するなんてことができない。
そこをあきらめて y = x * 2 として別な配列に入れようと思っても、実際にやろうとすると y(i, j) って
書かなきゃならないが i と j を動かすスマートな方法がない。
0488デフォルトの名無しさん2015/02/18(水) 11:57:49.28ID:yLcFaQ17
>>485
受け取るときはByRefにすればいいんだけど、関数からreturnするときはコピーが作られちゃうんですよ。
出した例でいうと、func1した結果は引数matrixに反映されるけど、後続処理はコピーに対する処理となるので反映されないです。
0489デフォルトの名無しさん2015/02/18(水) 12:12:57.43ID:a8UdE6sd
もうVBAは捨ててrubyとかpythonとかで外からole操作した方がいいよ
俺はそうしてる
とても捗ってる
0490デフォルトの名無しさん2015/02/18(水) 12:15:29.32ID:yrCv40dm
じゃあ何でこの板にいるんだ
0491デフォルトの名無しさん2015/02/18(水) 12:16:44.52ID:a8UdE6sd
こいつらわざわざVBAで馬鹿なことやってんなーって眺めるため
0492デフォルトの名無しさん2015/02/18(水) 12:18:55.27ID:yLcFaQ17
>>491
たいていの処理を使い捨ての一行プログラムでこなせたりする?
0493デフォルトの名無しさん2015/02/18(水) 12:26:58.19ID:BIe8ociq
なんとなく想像するとクラスモジュールで実現できそうだが、今Linuxなんで試せないわw
あれは自己参照かけるかな?

それはわからんが、できそうなのは配列の全要素を格納が期待できるバッファを用意して足らない部分を動的に確保する。

もうひとつはモジュール単位のproperty let get、と一時オブジェクトは避けられないかもしれんが、
setでargs + objectオブジェクトに参照をもたせるくらいか?

いずれにせよfortranのような参照がモダンな言語で無いのはほとんどの場合において資産。
0494デフォルトの名無しさん2015/02/18(水) 12:27:29.75ID:zPrNzJwI
不満だったら使うな
それで終わりだろ?
0495デフォルトの名無しさん2015/02/18(水) 12:28:28.19ID:a8UdE6sd
>>492
rubyだと

app.Selection.each{|cell| cell.Value = "hoge" if cell.Value =~ /hu*ga*/}
で選択範囲の"huuuuugaaaaa"を"hoge"にしたりとか色々
OLEで提供されてるオブジェクトはメソッド、プロパティ含めてほぼ制限なく使える

あと [1,3,6,2].sort とかも当然できるぞ!!
0496デフォルトの名無しさん2015/02/18(水) 12:35:51.08ID:yLcFaQ17
>>495
それをどこから(どういう環境から)実行するの?
対話的に実行できる?
0497デフォルトの名無しさん2015/02/18(水) 12:36:13.41ID:YbJdAwW+
はいはいruby最強
0498デフォルトの名無しさん2015/02/18(水) 12:48:44.92ID:a8UdE6sd
>>496
irbっていう対話環境が標準で用意されてるからそこから操作できる
もちろんスクリプトファイルを作って実行もできる

具体的にコード書いちゃうと
require 'win32ole' #OLE操作のためのライブラリ読み込み
app = WIN32OLE.connect('Excel.Application') #今開いているExcelのApplicationオブジェクトを取得

あとは煮るなり焼くなり>>495だったり

この辺参考になるはず
http://magazine.rubyist.net/?0027-ExcellentRuby
http://www.boddie.org.uk/python/COM.html
0499デフォルトの名無しさん2015/02/18(水) 12:51:26.25ID:a8UdE6sd
まあフォーム作ったりは難しいし
Excelで完結しないから他人に配布するとかの用途には不向きだね
書き捨てのちょっとしたマクロには最適
0500デフォルトの名無しさん2015/02/18(水) 13:39:13.16ID:QJoLg/2B
書き捨てのちょっとしたマクロなら、VBEで書いた方が圧倒的に楽なんじゃないの?
0501デフォルトの名無しさん2015/02/18(水) 13:41:20.01ID:QJoLg/2B
あと、遅いんじゃないの?
今、C#でCOM経由でExcelを操作するアプリ作ってるけど、COMとの通信回数が増えると目に見えて遅くなる。
0502デフォルトの名無しさん2015/02/18(水) 14:45:17.24ID:Lm/UpLLW
>>500
VBA にはソートとかがないでしょ? って話だったかと。
まあ、俺はわざわざ Ruby とやらの環境を入れる気にはならんけどな。
0503デフォルトの名無しさん2015/02/18(水) 14:51:33.82ID:QJoLg/2B
>>502
> VBA にはソートとかがないでしょ? って話だったかと。
あ、そういう話だったか。

だったら、こういうのを使えるようになった方がいいと思う。
『.NET Frameworkを使う』
http://officetanaka.net/excel/vba/tips/tips98.htm

ArrayListを使った、Sort, Clone, Reverseの例が載ってる。
0504デフォルトの名無しさん2015/02/18(水) 14:52:10.22ID:yLcFaQ17
>>500
Rubyとか興味なくはないけど、一からやるとなると面倒だね。
VBAもツールが揃ってくると書き捨ての処理は一行プログラムで書けるようになってきて、そうなると参照返しが欲しくなる。
行を分けろと言うのは正論だけどさ。
0505デフォルトの名無しさん2015/02/18(水) 15:25:22.43ID:a8UdE6sd
ソートもそうなんだけど、根本的な表現力の話もそうで、
例えば>>503のSample1なんてのは
datalist = Array.new(5){(rand*10000).to_i}
print [datalist.sort, "----", datalist.reverse].join("\n")
とたった2行で同じ出力が得られて捗る
0506デフォルトの名無しさん2015/02/18(水) 15:48:01.19ID:QJoLg/2B
>>505
> とたった2行で同じ出力が得られて捗る
いや、COMが扱えるRubyを使える環境にあって、Rubyのことも良く知ってるなら捗るだろうけど、
Ruby知らない人にはハードル高すぎ。

https://www.ruby-lang.org/ja/downloads/
ActiveScriptRuby
RubyInstaller
RailsInstaller
のどれでもCOMが使えるのかどうかとか、
そもそもCOMって何って人とか、
コマンドライン何それって人もいるかもだし。
0507デフォルトの名無しさん2015/02/18(水) 15:59:54.78ID:SUifHOIO
まあわざわざExcelのためだけに他の言語修得するのはナンセンスだね
既に他の言語知ってたり、479みたいにVBAに不便さを覚えた人にはおすすめ程度

そういえばExcel関係ないVBAの話はこのスレではNGだけど、
Excel関係あるVBA以外の話はこのスレでいいの?
流石にrubyの話はスレ違いだと思うんだけど、Excelの操作、
マクロだと考えるとこのスレのような気もするし
0508デフォルトの名無しさん2015/02/18(水) 17:43:29.73ID:TBGWIM9o
セル内文字列の、色の付いてる文字だけを分離させるにはどうすればよいでしょうか?
入力するときに別のセルに入れてくれれば…と思うことしきりです…
0509デフォルトの名無しさん2015/02/18(水) 17:44:02.68ID:PO1vEDuy
俺はデキるプログラマーアピールしたいから他言語の話もするけど他の奴らはするなって思う
0510デフォルトの名無しさん2015/02/18(水) 17:50:58.57ID:QMIzQpCs
VBAはIDEを無料のVS並みにしてくれるだけでも
かなり開発効率あがるんだが
MSさんおなしゃす
0511デフォルトの名無しさん2015/02/18(水) 18:42:17.76ID:Z5m5h1Uj
多言語のことになると妙に否定的だなw
まぁ会社PCにrubyインスコできないから自分も使う機会ねーんだけどさ

TANAKAのこれhttp://officetanaka.net/excel/vba/tips/tips40.htm
組みなおして call で呼び出せば1行じゃないかやったね
0512デフォルトの名無しさん2015/02/18(水) 18:42:36.36ID:99hPsA+1
>>510
わかる

あとunicode対応してほしい
海外からマクロ動かないクレームが頻繁に来る
0513デフォルトの名無しさん2015/02/18(水) 18:48:16.97ID:2rhvVJ3Z
ruby?
糞だろC#にしとけ
0514デフォルトの名無しさん2015/02/18(水) 18:51:38.23ID:xzrnQB2I
>>512
日本語使わなきゃいいじゃん
0515デフォルトの名無しさん2015/02/18(水) 19:29:22.65ID:yLcFaQ17
他言語使うの、プロクラムは書けても連繋がなあ。
自分もdllいくつか使ってるけど結局は俺様ローカルな世界になっちまう。
0516デフォルトの名無しさん2015/02/18(水) 20:24:24.68ID:+TVqHmXQ
VSTOってどうなの?詳しくは調べてないけど
見た感じvisual studioでvb.net/c#での開発が出来るみたいだし、アドインだって作れそうだけど、活用してる人いない?
0517デフォルトの名無しさん2015/02/18(水) 20:39:48.65ID:FooM0Je6
>>508
Range.Characters で1文字ずつFont.Colorを調べれば出来ると思うけど
簡単にやる方法は無いんじゃないかな
0518デフォルトの名無しさん2015/02/18(水) 21:47:43.19ID:ZsVgoINq
他言語の連携とかはここがいいんじゃない?

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/
0519デフォルトの名無しさん2015/02/19(木) 01:32:15.47ID:vu9Qsx5a
>>473
悪い悪い、C言語やってたから(笑)
0520デフォルトの名無しさん2015/02/19(木) 03:02:07.75ID:lDFiAK4+
>>488
returnを使わないで、引数で、IN/OUTすれば?
f(ByRef in, ByRef out)

>>511
Macには最初から、Ruby, Pythonなども入っている
0521デフォルトの名無しさん2015/02/19(木) 08:22:32.12ID:4dFHTBvU
>>510
MSはVBAは廃止する方向性で取り組んでますよ。
オンライン版でスクリプトが無いのはその現れ。

プログラム組みたいなら、VS2013使ってろって話。
0522デフォルトの名無しさん2015/02/19(木) 08:30:27.00ID:QTl9VVmV
最近、excelを2007から2013に切り替えました。
2007では機能していたモードレスの設定が、
2013では機能しなくなりました。

UserForm.show 0
コードはこれだけです。
別ファイルをアクティブにすると
フォームが裏に隠れてしまいます。

ウィンドウを上手く配置し、
ボタンが見えるようにしてクリックすると
別ファイルのアクティブシートを取得できます。

2007から2013で何か仕様変更があったのでしょうか?
0523デフォルトの名無しさん2015/02/19(木) 08:46:33.76ID:4dFHTBvU
>>522
http://www.asahi-net.or.jp/~ef2o-inue/kankyo/sub02_05_02.html
0524デフォルトの名無しさん2015/02/19(木) 10:32:27.29ID:55lVElNx
>523
ありがとうございます。
仕様変更があったのですね。
よく分かりました。
何か良い回避策はありませんでしょうか?
0525デフォルトの名無しさん2015/02/19(木) 11:14:55.86ID:8gErZFsQ
>>513
> 糞だろC#にしとけ

C#だと、いまだにReleaseComObject()地獄なんだよね。
そんなの無しにGCで解放してくれって思うんだが。
0526デフォルトの名無しさん2015/02/19(木) 12:27:31.66ID:IuurH7h+
>>524
たしかうまい回避策はなくて、他のアクティブシートでの処理が終わったら
ユーザーフォームと紐付いているブックを毎回アクティブに切り替える必要があったと思う。
0527デフォルトの名無しさん2015/02/19(木) 16:24:48.21ID:NAyB84ut
>>524
当方素人で、コードが違うからどうなのかわからんのだけど、
同じようにモードレスのフォームを開いた後、別シートを開いてから
元のフォームを操作するとインデックス範囲のエラーが発生するので
ThisWorkbook.Worksheets(〜〜と全部明示してみたら一応動作したように思えるけど
対応として大丈夫あってるのだろうか・・・
0528デフォルトの名無しさん2015/02/19(木) 21:16:29.95ID:o2jUxII1
2013手元にないから試せないけど
MDI表示にするオプションとかないの?
フォームをシステムモーダルにする方法とかでもいいけど
それはそれで別の問題も出るだろうし

複数ブックいじるVBAとか結構影響でそうだな
0529デフォルトの名無しさん2015/02/20(金) 00:08:26.48ID:Xi0Ydcd+
>>481
亀レスだが、いま実装中。
なんとかVariantを参照で返せるようになった。あとちょっとだ。

m = 1
x = 参照(m)
?x
1
m = 2
?x
2

となる
0530デフォルトの名無しさん2015/02/20(金) 07:44:51.60ID:LhrcWQ82
>522です。
レス下さった皆さん、ありがとうございます。

やりたいことは、アクティブシートに対して
モードレスなフォームのボタンをクリックすると
そのシートが処理されるというものです。
2013用にブック名、シート名のコンボボックスを
表示させようかと考えています。

次バージョンではどうなるのでしょうね。
0531デフォルトの名無しさん2015/02/24(火) 12:32:13.53ID:nq42fo+u
OS Windows7 プロフェッショナル 64bit
Excel2010

┏━━━━┓  ┏━━━━┓
┃A愛媛県┃  ┃B香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個

ワークシート
    A      B      C      D
1 松山市   高松市   高知市   徳島市
2 今治市   丸亀市   室戸市   鳴門市
3 宇和島市  坂出市   安芸市   小松島市
4 八幡浜市  善通寺市  南国市   阿南市
5 新居浜市  観音寺市  土佐市   吉野川市
6 西条市   さぬき市  須崎市   阿波市
7 大洲市   東かがわ市 宿毛市   美馬市
8 伊予市   三豊市   土佐清水市 三好市

VBAを使って上の図のようなものを作りたいと思っています。
A列が愛媛県の市町村でB列が香川県の市町村というぐあいです。
そしてA1〜D8の市町村をランダムにE1に表示させます。
表示された市町村がどれであるか考えて上の4個のボタンのどれかを押します。
正解か不正解かはF1に表示させます。
この市町村当てクイズのようなものを作りたいのですが詳しい方いらっしゃいますか。
まずはE1にランダム表示させるところから学んでいきたいと思っています。
0532デフォルトの名無しさん2015/02/24(火) 14:57:55.19ID:jA7JvUel
>>531
【誤】
┏━━━━┓  ┏━━━━┓
┃A愛媛県┃  ┃B香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個

【正】
┏━━━━┓  ┏━━━━┓
┃B愛媛県┃  ┃A香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個
0533デフォルトの名無しさん2015/02/24(火) 15:36:15.77ID:cA1xu2y/
>>531
詳しくはないけど
>まずはE1にランダム表示させるところから学んでいきたいと思っています。
RND関数 てのがあるよ
0534デフォルトの名無しさん2015/02/24(火) 15:52:09.13ID:8JogkC7z
>>531
>そしてA1〜D8の市町村をランダムにE1に表示させます。
どのようなタイミングで表示するの?
例えば、一定間隔で表示し時間切れは不正解にするとか
0535デフォルトの名無しさん2015/02/24(火) 16:41:06.64ID:FzvWfJKU
次の問題ボタンとかでいいんじゃね
初心者っぽいし作りやすい仕様を想定してあげよう
05365312015/02/24(火) 19:17:54.40ID:nq42fo+u
問題の出るタイミングはいきなり表示されているのでいいと思ってましたが、
次の問題ボタンを置こうと思います。
>一定間隔で表示し時間切れは不正解にする
そんなこともできるんですか。今回は時間制限はつけないでいいかと思っています。
0537デフォルトの名無しさん2015/02/24(火) 20:49:49.67ID:PIm2u7Y8
とりあえず、どのボタンが押されたかが分かるサンプルと、引数に与えた最小値と最大値の間の整数を返す関数を置いておきますね

Sub Sample1()

Dim Button_Name As String
Button_Name = Application.Caller
MsgBox Button_Name

End Sub


Function makeRndInt(minInt As Integer, maxInt As Integer) As Integer

Randomize
makeRndInt = Int((maxInt - minInt + 1) * Rnd + minInt)

End Function


次の問題ボタンはA1〜D8のセルをランダムに抽出し、E1に表示する機能
回答ボタンは、どのボタンが押されたかを見て、対応する列名を取得し、A1〜D8範囲を探す機能を追加すればいいかと
0538デフォルトの名無しさん2015/02/24(火) 21:05:22.03ID:8JogkC7z
>>536
ヒントです

Sub セル選択()
Cells(Int((8 * Rnd) + 1), Int((4 * Rnd) + 1)).Select
End Sub
05395312015/02/24(火) 22:27:48.47ID:nq42fo+u
ヒントをどうも有難うございます。
プログラムの文章をすぐに理解するのは難しいようです。
頂いたヒントをもとに勉強してきます。
0540デフォルトの名無しさん2015/02/25(水) 14:00:38.12ID:aPhmfYhG
ボタンを押したらセルに入力、だけマクロでやって正否判定と表示はExcel関数でやったほうがはやそう
0541デフォルトの名無しさん2015/02/25(水) 14:25:46.10ID:lUiDnnd2
勉強のためじゃないの?
元々VBA無くてもできそうじゃん
0542デフォルトの名無しさん2015/02/25(水) 16:20:44.02ID:rpMKp3K5
VBAをVBAらしくない使い方をしたものは三年以下の実刑に処す
0543デフォルトの名無しさん2015/02/25(水) 16:38:07.73ID:oiOKwPPk
>>542
恐喝ですか?
0544デフォルトの名無しさん2015/02/25(水) 19:23:19.97ID:oz2nX22y
3年以下の実刑って新しいな
0545デフォルトの名無しさん2015/02/25(水) 21:19:48.54ID:eqSO3lN+
VBAで会社のパソコンから使える出会い系アプリ作ってください。
0546デフォルトの名無しさん2015/02/25(水) 21:21:30.78ID:hgjjK+Cd
殺人予告を投稿するアプリで新しい出会いが
05475312015/02/26(木) 02:04:11.48ID:uI5cgKXN
VBAで作るにはあまり適してないんでしょうかね。
もっとやりやすい方法があるでしょうか。
0548デフォルトの名無しさん2015/02/26(木) 04:05:32.06ID:ldMRR6U8
>>547
勉強用には良いと思うよ
0549デフォルトの名無しさん2015/02/26(木) 10:29:31.50ID:a3HLvh43
>>547
JavaScriptでシコシコ作ってろ
0550デフォルトの名無しさん2015/02/26(木) 10:59:24.21ID:TYC1vclc
VBAでいいよ

VBAをしばらくやった後に、
VisualBasicも覚えればよい
0551デフォルトの名無しさん2015/02/26(木) 12:22:28.06ID:bM4XiFmY
簡単すぎてVBA使うまでもないって話
適してないわけじゃないし勉強用にはちょうどいい題材
0552デフォルトの名無しさん2015/02/26(木) 12:35:21.12ID:yn8thPkp
>>547
やりやすい方法はって、何をやりたいの?
VBAの勉強としては良いんじゃね
実用品(クイズ)として考えるなら、横に答え見えるクイズとかどうよとかなんとか

>>550
今のVB.NET覚える気なら、VBAからじゃなくて直接覚えた方が良い
そして今からVB.NET覚えるならC#覚えた方が良い
今時のプログラミング学ぶのにVBAは向かない
0553デフォルトの名無しさん2015/02/26(木) 12:36:39.60ID:c8SpDIVp
VBA使うまでもなかったら、何を使うんだ?
まさかワークシート関数だけで出会い系アプリ出来るのか?
0554デフォルトの名無しさん2015/02/26(木) 14:06:09.87ID:x3jJQdhg
だったらC++がいいのでは?
今はこれが一番面白いと思う。Windows縛りもないし。
0555デフォルトの名無しさん2015/02/26(木) 14:57:42.63ID:Tj00qsvp
なんも導入しないで使えるVBAでいいでしょ。
興味が広がって考えればいいと思う。
0556デフォルトの名無しさん2015/02/26(木) 17:43:34.91ID:EsooSxVF
VBAの貧弱IDE使うと
VSの素晴らしさが分かる
次期officeのIDE強化頼む
0557デフォルトの名無しさん2015/02/26(木) 20:58:41.04ID:ldMRR6U8
>>541
面白そうだから考えてみたが俺にはVBAなし無理

>>547
VBA無しじゃ出来なかったので少しだけVBAのヤツ
一応動作するけど悪い見本です
http://fast-uploader.com/file/6980506926548/
PW shikoku (Excel97以降で動作します)
0558デフォルトの名無しさん2015/02/26(木) 23:17:54.66ID:qrq95qPM
質問ですExcel2007を使用しています。

ActiveXコントロールのボタンを配置してボタンを押した時に
ボタンの真下にあるセルを参照することってできませんか?

セルを決め打ちして処理するのではなくてボタンを移動して押したらその真下のセルの数値をとりたいのですが
やり方どころかできるのかどうかさえわかりません
よろしくお願いします
0559デフォルトの名無しさん2015/02/26(木) 23:57:49.37ID:s+XXacNk
>>558
可能
ボタンのプロパティに TopLeftCell と BottomRightCell がある
0560デフォルトの名無しさん2015/02/27(金) 03:27:27.90ID:U3hidJr1
>>557
1行マクロwww
面白いがVBAで全てやった方が簡単だ

>>558
出来ない
05615312015/02/27(金) 12:58:44.87ID:AIRVu99m
>>557さんどうもありがとうございます。
557さん。もしよかったら以下に説明するプログラムを作っていただきただけないでしょうか。
作っていただいたらアマゾンギフト券1万円差し上げます。
ギフトコードを送るために捨てメアドを用意して頂きたいです。
>>531で説明した市町村の都道府県当てクイズの選択を大きくしたものです。

http://fast-uploader.com/file/6980561621150/
↑画像
http://fast-uploader.com/file/6980561888004/
↑画像を作る為にエクセルで作成したひな形 パスワード 531

ひな形をそのまま使っていただいてもいいですし、似た感じで作っていただいても大丈夫です。

A〜ANボタンが都道府県に該当。ワークシートのa1〜an20が市町村に該当します。
A県に該当する市町村がa1〜a20です

県と市はわかりやすくするための例えで使いました。赤いもの青いものとかでもよかったわけです。

市町村にあたるa1〜ax20をランダムに表示させて、
表示されたものがn12だったらコマンドボタンのNを押せば正解。ほかのボタンを押したら不正解。

ワークシートのa1〜an20とボタンの名前「A〜AN」を自分で書き換えればクイズゲームとして機能するようなものを作ってほしいのです。
もし気が向いた方いたらよろしくお願いします。

http://fast-uploader.com/
アプロダです

[email protected]
このメールアドレスからお礼を送ります。
0562デフォルトの名無しさん2015/02/27(金) 19:51:35.21ID:qn0yExqX
windows7
Excel2013


初めてVBAでプログラムを作っております。
現在Excelマクロで、実行するとIEで指定のページを開いて、そこにあるプルダウンメニューの中で
セルの値に等しいものを自動的に選択・・・というものを作っております。

ページを開くところまでは行けたのですが、何度やってもプルダウンメニューの選択ができません。
エラーとしては「このプロパティまたはメソッドをサポートしていません」と言われるのですが、これについて調べてみたら、
根本的に式が間違っている可能性とも・・・。
なお、選択しようとしているコードは

objIE.Document.getElementByname("ソース表示した時のSELECT NAME名").Selectedtext = Range("A1") ※仮にセルA1とします


どこか間違っていますでしょうか。
0563デフォルトの名無しさん2015/02/27(金) 20:06:22.87ID:if/y8obX
>>562
JavaScriptと同じようなコードで良いんじゃないの?
getElementBynameもSelectedtextも見たことないな。
0564デフォルトの名無しさん2015/02/27(金) 20:11:44.22ID:qn0yExqX
>>563
お返事ありがとうございます。
いかんせん、色々なインターネットサイトを見ながら作成しているもので、
変なコードが混ざっているかもしれません。
0565デフォルトの名無しさん2015/02/27(金) 20:21:07.16ID:vnP6fImO
すくなくとも逆だろな。

range("a1").value = lval
0566デフォルトの名無しさん2015/02/27(金) 22:53:25.01ID:6q9/K/Gu
>>562
色々間違ってるね
×getElementByName・・・・・○getElementsByName

セルの値に等しいものが なかったらどうしたいのか知らないけれど
こうかな
ObjIE.document.getElementsByName("NAME名")(0).Value = Range("A1").Value
0567デフォルトの名無しさん2015/02/27(金) 23:01:51.39ID:wYZHWCrR
なるほど == のない言語か
0568デフォルトの名無しさん2015/02/27(金) 23:52:41.29ID:hF32CD2u
>>562
参照設定してる?
0569デフォルトの名無しさん2015/02/28(土) 10:10:29.69ID:O+M1UhJt
>>561
画像みたけどボタンが40個しかないじゃん
47個以上ないと全都道府県が選択肢に表示出来ないよね?

てか、そもそも47択とか40択とか、もうギャグとしか思えない。
普通はせいぜい4択とか5択ぐらいに留めておくモンだよ。

まぁ、地方ごとの括りで九州・沖縄地方で8県とか関東地方で1都6県とか
それに山梨加えて首都圏1都7県みたいな区分法があるから、
8択もしくは切り良く10択ぐらいまでは対応しててもいいとは思う。

ちょっと凝った作りにするなら
設問ごとに配点を変えて選択肢が多い問題は配点高め、少なければ低め、という具合にしたり
某クイズ番組みたいに、難しいと思ったら[50:50]ボタンを押すと回答の選択肢を減らせる(ただし、得点が下がる)
とかの機能も付け加えると学習ソフトとしては子供の食いつきも良くなると思う。

それから、回答する画面に出題内容のデータが見えてるってのも頂けない。
例えば、「高知市と同じ列にある市町村は全部高知県だ」っていうように
見えてるデータの並びから問題の答えが類推できちゃう。

これは設問データの登録画面と回答時の画面を別シートにすれば良いだけなんで
たいした問題じゃないけど。
0570デフォルトの名無しさん2015/02/28(土) 10:51:46.31ID:mh+ByRRh
糞なゲーム評論は別スレでやれ
0571デフォルトの名無しさん2015/02/28(土) 11:08:33.18ID:52f9dl67
>>561
557だけど
エクセルのワークシート関数は判るんでしょ?

うpした四国のシート保護を解除し15行〜20行を再表示すれば作業行の関数が見える
それを参考にすれば自分で拡張出来ると思います
05725312015/02/28(土) 11:28:27.65ID:FY4lD6Ni
>>562
これは都道府県を覚えるためではなくて仕事の能率を上げるためにタナの位置を覚えるためのものなんです。
40個のボタンは仕事場にあるタナです。タナの位置とそこに入る物の位置を暗記するとすごく仕事が速くなるんです。
仕事は数年では早くなるみたいなのですが、このプログラムがあれば短期間で熟練者と同じスピードになると思ったんです。
どなたか作っていただけないでしょうか。アマゾンギフト2万円分差し上げます。
作ってもいいという方いらっしゃいましたら、日をまたぐようならトリップを付けてください。

>設問データの登録画面と回答時の画面を別シートにすれば良い
画面を下にスクロールさせて設問データを見えないようにしてしまおうと思ってました。
でも別シートにできるのであればそちらの方がいいです。

凝ったつくりにする必要はありませんが、あえて贅沢を言うなら不正解を出したときに
不正解(正解はN)と付けることができればいいと思います。無理なら大丈夫です。
0573デフォルトの名無しさん2015/02/28(土) 11:34:52.26ID:52f9dl67
>>572
作るよ
05745312015/02/28(土) 11:37:53.36ID:FY4lD6Ni
>>573
よろしくお願いします!
捨てメアドを用意してください。
明日になるようであればトリップを付けてください。
どうぞよろしくお願いします。
0575デフォルトの名無しさん2015/02/28(土) 11:40:39.61ID:52f9dl67
>>574
[email protected]
こちらに連絡下さい
0576デフォルトの名無しさん2015/02/28(土) 11:43:43.88ID:zpiGIFyp
暗記に拘るより、まず棚の位置が分かり易くなる工夫が先のような気が。
0577デフォルトの名無しさん2015/02/28(土) 12:00:12.18ID:L5LuAS7l
棚に写真でも貼っとけよww
0578デフォルトの名無しさん2015/02/28(土) 12:25:12.68ID:BkRuYz43
576及び577の意見に大賛成
0579デフォルトの名無しさん2015/02/28(土) 13:30:06.52ID:WpflD63y
スレチ、じゃないと思うんだけど、クリックする処理をしても全く反応が無く、
おかしいなと思っていたら、クリックする処理の後にIEのアドレスを見てみたら最後に # が付いてた。
https://www.○○○.jp/#みたいな感じに。
普通に手動でクリックしたらページ移行するんだけど、これの原因って分かります?

クリックのコマンドは

For Each objLink In objIE.document.Links

If InStr(objLink.outerHTML, "ログイン") > 0 Then

objLink.Click

Exit For

End If

Next

OSは7、excelは2010です。
0580デフォルトの名無しさん2015/02/28(土) 14:21:15.01ID:WpflD63y
テスト
0581デフォルトの名無しさん2015/02/28(土) 14:23:12.94ID:WpflD63y
何か書き込めなくなっちゃってました。

ソース内に a href="#" OnClick=

とあるので、これが原因ですか。
0582デフォルトの名無しさん2015/02/28(土) 20:05:31.52ID:daVTIXn7
すみません解決しました。
ポップアップブロックを無効にしたらうまくいきました。
0583デフォルトの名無しさん2015/02/28(土) 23:51:49.81ID:D9zZ2LY4
複数のプロシージャにそれぞれショートカットキーを割り当てたのですが
どれにどのキーを割り当てたのか忘れてしまった場合一覧表示するような方法はないのでしょうか?
ショートカットキーを割り当ててないプロシージャも多く存在し探すのが困難な状態です。
0584デフォルトの名無しさん2015/03/01(日) 02:52:39.18ID:cyp+wkSl
面白そうだから

金はいらんけどココに貼ろうかなマクロ
0585デフォルトの名無しさん2015/03/01(日) 02:54:41.44ID:cyp+wkSl
>>583
デザインモード
プロパティ
でボタン1つ1つ見ていくしかない

activexのボタンなら
ckickイベントのプロシージャ名になってるから
区別しやすいけども
0586デフォルトの名無しさん2015/03/01(日) 02:55:24.51ID:cyp+wkSl
ごめん、ショートカットキーの話でしたか
解りません
0587デフォルトの名無しさん2015/03/01(日) 03:09:06.39ID:psXy7Mpk
>>583

既に設定済みのものを一覧で取得する方法は分らんが
今後ショートカットキーを設定する分に限れば
マクロのコード内でショートカットキーを設定する方法を用いることで
それをショートカットキー設定の一覧表のように運用できる。

やり方はこの辺参照
http://www.moug.net/tech/exvba/0150112.html

今までの分はマクロオプションのダイアログボックスで
一個ずつ地道にチェックしてくれ。
0588デフォルトの名無しさん2015/03/01(日) 14:41:51.83ID:xRoa0siU
VBEの「ファイルのエクスポート」で吐き出させてやれば、
ショートカットへの紐づけは一応確認できるな。
0589デフォルトの名無しさん2015/03/01(日) 16:47:27.07ID:mBjTa80/
>>585
>>586
>>588
ありがとうございます。モジュールが別れている場合は一つ一つ確認するしかないようですね。
0590デフォルトの名無しさん2015/03/01(日) 16:49:55.53ID:mBjTa80/
アナログながら行の先頭に次回からコメントでショートカットキーを書いておくと解決かな。
0591デフォルトの名無しさん2015/03/01(日) 19:47:42.95ID:psXy7Mpk
>>590
コメントに書くぐらいだったら>>587のが良いじゃん
0592デフォルトの名無しさん2015/03/02(月) 14:44:41.75ID:DriU0dF2
Excelがクラッシュして再起動した時に自動修復した?ファイル名がversion〜とかになったときのブック名を拾うことはできますか?
thisworkbook.nameだとクラッシュ前のままのようなのです。
よろしくお願いします。
0593デフォルトの名無しさん2015/03/02(月) 14:55:04.01ID:DriU0dF2
自己レスです。
ActiveWorkbook.Nameがありましたね。
ただ、これはブックの遷移によって変動するのでThisworkbooks.Nameのような静的?なプロパティはないでしょうか?
0594デフォルトの名無しさん2015/03/03(火) 07:28:16.96ID:eHtnEkEe
積み上げ棒グラフを作りたいのですが。数字を入力したら、グラフの範囲指定が
勝手に広がって積み上げ棒グラフが増えていくようにしたいです。
VBAで可能でしょうか?
0595デフォルトの名無しさん2015/03/03(火) 11:23:04.58ID:Su0lRAUl
>>594
能力のある人がVBA使えば可能です
俺には出来ないけど
0596デフォルトの名無しさん2015/03/03(火) 13:57:43.83ID:dNmnY3Tb
>>594
Googleスプレッドシートなら簡単ですよ
0597デフォルトの名無しさん2015/03/03(火) 17:21:59.69ID:pevxvD4R
>>594
GoogleスプレッドシートはA2:Nなんて具合の範囲指定ができます。スクリプトなしで作れますお
0598デフォルトの名無しさん2015/03/03(火) 21:47:05.98ID:11GO0ZYW
>>594
でける。
0599デフォルトの名無しさん2015/03/03(火) 22:42:59.49ID:wgn1BS+i
やっぱりでけん。
0600デフォルトの名無しさん2015/03/03(火) 23:24:41.97ID:X7j82Fgo
グラフ vba 範囲指定を自動で
でぐぐればいろいろ出てくるけどそういう事じゃないのかい?
0601デフォルトの名無しさん2015/03/04(水) 11:30:15.03ID:dDcQZ4yU
val と Array(val)(0) が違う件について
0602デフォルトの名無しさん2015/03/04(水) 17:41:05.26ID:VeSQgKXp
>>556
どのあたりが違うの??
0603デフォルトの名無しさん2015/03/04(水) 23:53:19.75ID:pCKZSdcy
>>602
そりゃあもう、変数にカーソル当てれば型が表示されるし、クラスやメソッド、プロパティなんか入力候補出まくりだし、
打ち間違えても執拗にエラーメッセージポップアップすることないし、修正候補も出るし。
0604デフォルトの名無しさん2015/03/05(木) 00:01:03.17ID:mXnwYOHg
あと、VBAは確か変数や関数を定義しているところに移動は出来たけど、その変数や関数をどこで使っているかまでは
移動出来ないんじゃなかったっけ?
VSはそれが出来る。
0605デフォルトの名無しさん2015/03/05(木) 00:28:47.23ID:5Zc9dVue
新旧ユーザ名を2列でシートに書き、対象フォルダのNTFSのアクセス権を旧から新のユーザに置換するプログラムを書きたいのですが教えてほしい。
0606デフォルトの名無しさん2015/03/05(木) 08:17:11.55ID:ookD3nmq
>>603
次期OfficeのIDE強化ってww

むしろ、VBAなんてなくす方向性なんだが?馬鹿なのおまえ?
0607デフォルトの名無しさん2015/03/05(木) 08:38:59.79ID:Z+dMZ8cD
>>606
そうなの?無くして代替は何になるの?
0608デフォルトの名無しさん2015/03/05(木) 08:53:30.38ID:ookD3nmq
>>607
代替なんてない。廃止。

office onlineで既にもう初めからその手のスクリプトを載せずに、外部からのREST
API(sharepoint)叩けってことで、済ましてる。でもそれはVBAとは全く異なるもの。

クライアントサイドでプログラム組みたけれVS2013Community使えって方針。
さらにAccessも次で廃止されると言われてる。ま、今のMSの状況みりゃ、クライアント
サイド強化なんて方針と真逆だからな。
0609デフォルトの名無しさん2015/03/05(木) 10:29:05.10ID:RO7xYmyN
>>608

とりあえず廃止ってのはっきりソース出せ
0610デフォルトの名無しさん2015/03/05(木) 10:57:32.41ID:ookD3nmq
>>609
命令口調で偉そうだなおまえw
0611デフォルトの名無しさん2015/03/05(木) 12:30:12.87ID:CjMOKIcO
w付けて馬鹿そうだなおまえ
06125602015/03/05(木) 12:56:01.40ID:7tJox84e
ソースも出せずに思い込みで語るとか、春ですねぇ...
0613デフォルトの名無しさん2015/03/05(木) 13:53:35.42ID:5zx38OHw
Accessなんて、2013でdbcompareなんてツールまで作っといて廃止すんのか
へー
0614デフォルトの名無しさん2015/03/05(木) 14:19:17.69ID:n243tM8K
>>608
> office onlineで既にもう初めからその手のスクリプトを載せずに、外部からのREST
> API(sharepoint)叩けってことで、済ましてる。でもそれはVBAとは全く異なるもの。
オーバーヘッドでかすぎで、使い物にならんよ。
0615デフォルトの名無しさん2015/03/05(木) 14:41:51.16ID:UlcZ3yHx
廃止したらそれこそoffice買う理由なくなるからな
今以上にGoogleとか互換ソフトに流れるでしょ
俺はむしろVBA以外の言語も使えるようにしてほしいな
c#のコンパイラがオープンソースになったと聞いたし
自社製品なんだから組み込んでほしいわ、Scriptとして
0616デフォルトの名無しさん2015/03/05(木) 15:18:58.12ID:kngTpWoB
Access廃止してどうすんだ?
SQLServerにVBAが搭載されるのか?
0617デフォルトの名無しさん2015/03/05(木) 19:06:43.36ID:vrsjH0xc
VBAなくなったら会社業務止まるお^q^
たのしいお^−^
0618デフォルトの名無しさん2015/03/06(金) 02:16:07.99ID:Af9vQGkK
>>606
俺は>>603だけど、>>556じゃないよ。
VSとVBAのIDEがどの辺りが違うのか>>602が聞いたから答えただけ。
それでいきなりバカ扱いとかどんだけ短絡思考なのかとは思うけど、
VSとの統合化はそれはその方面で進んで行くとして、
今までのような形態が無くなるとは思えないな。
Excel単体で色々出来るから間口も広いし重宝するんであって、
一々外部から命令与えないと処理出来ないのはシステムに組み込まれていることが前提になってる。
やっぱりみんなの言う通り、どこから廃止と言う話が湧いて来たのかソース晒せよと。
0619デフォルトの名無しさん2015/03/06(金) 02:57:20.31ID:Eaa00tz+
あまりテコ入れされるとVBAの良さがなくなっちゃう
そりゃ最新機能は使いたいけど、MSがそれやっちゃうとたぶんVSと同じようになっちゃう
VB6風のまま進化してくれるなら大歓迎だけど・・・
0620デフォルトの名無しさん2015/03/06(金) 03:49:08.11ID:dy/Vxtaj
正直、VBAって、言うほど簡単な言語じゃないと思う
むしろJavaやjavascriptやCとか、PHP、Rubyなどとあまりに違いすぎて
難しいかもしれない
その上エディタは信じられないくらい低機能かつおかしなデフォルト設定で、
作ってる側のマイクロソフトは
自分で作ってるこのエディタを、自分で使ったことすらないんだろう

このままだとGoogleのAppScriptに人気が移ってしまうかもしれないな
0621デフォルトの名無しさん2015/03/06(金) 07:48:03.54ID:S8ZVyGJZ
新規に学習するにはVB6相当ってのが辛いんだけどな
初級と上級の情報はあっても中間がなかなか見つけられない
0622デフォルトの名無しさん2015/03/06(金) 11:19:49.16ID:YGwFHVd8
Excelのオブジェクトが操作できれば言語なんてなんだっていいし、
VBAは言語として相当時代遅れだし発展性もないし他と比べて学習コストも高い
0623デフォルトの名無しさん2015/03/06(金) 11:41:49.74ID:zXU87W6+
今さらVBA廃止するわけにもいかないから
十年後も同じだと思う
0624デフォルトの名無しさん2015/03/06(金) 11:42:29.60ID:Af9vQGkK
それはExcelで使うObjectの解放の面倒臭さを知らないから言えるんだよ。
0625デフォルトの名無しさん2015/03/06(金) 12:00:42.97ID:oKSD57uY
ExcelVBAは普及しすぎて改造可能な成果物という遺産が多すぎて仕様を変えることができない
0626デフォルトの名無しさん2015/03/06(金) 12:01:34.34ID:EZssHJqp
使いづらい言語だからこそライブラリを充実させたぜ!という層が相当数いる。エクセルのオブジェクトをいじるのとは関係ない部分でもね。
彼らにとってはVBAはとても開発効率の良いツールになっていて、枯れてるんだからもう変えないでくれと思っている。
目的に応じて他の言語やツールを使っているのならまことにもっともな要望と言えよう。
0627デフォルトの名無しさん2015/03/06(金) 12:15:26.90ID:05NuRrrk
つまりVBAは負債
0628デフォルトの名無しさん2015/03/06(金) 12:23:13.72ID:EZssHJqp
>>627
それも正しい見解
0629デフォルトの名無しさん2015/03/06(金) 12:27:35.04ID:QQczZemz
>>623
VBAは資産として残して
別言語も追加すればいいんじゃないの
.NETからだと解放の手間とか色々とVBAユーザーから見たら手間かかる
0630デフォルトの名無しさん2015/03/06(金) 13:30:13.96ID:+sWdgm4H
そして>>1★2
0631デフォルトの名無しさん2015/03/06(金) 13:37:44.62ID:zXU87W6+
>>629
追加なら良いね
マクロシートは十年後に廃止で良い
0632デフォルトの名無しさん2015/03/06(金) 13:56:50.38ID:FLRSRQ+G
.netあまり知らないんだけどオブジェクトの解放なんて今時GCがやってくれないの?
0633デフォルトの名無しさん2015/03/06(金) 14:00:18.85ID:NM2JJvR7
>>632
やってくれません。
0634デフォルトの名無しさん2015/03/06(金) 14:07:18.82ID:NM2JJvR7
>>632
詳しくは、ここ参照。
『[C#] COM と RCW と参照カウント』
http://igeta.cocolog-nifty.com/blog/2007/07/rcw.html
0635デフォルトの名無しさん2015/03/06(金) 17:43:38.28ID:syMrohC1
.NETの中身なら解放するけど
EXCELって管理外だからね
0636デフォルトの名無しさん2015/03/06(金) 20:41:55.68ID:ci1Iacgw
こいうサンプルを参考にして
https://support.microsoft.com/kb/279721/ja?wa=wsignin1.0
実行中のEXCEL2010に対して、DDEでセルに値を書き込むような
簡単なプログラムをC++で作ってみたのですが、10回中5回くらいは
成功し、残り5回くらいは失敗します。失敗の場合でもコマンドの実行
結果は正常ですが、書き込めません。DDEってこんなに不安定な機能
なのでしょうか?
0637デフォルトの名無しさん2015/03/06(金) 20:56:08.83ID:2n7TyHez
Excel VBAからDirectX APIとか叩いてGPUで並列演算させられるようになんねぇかな。
0638デフォルトの名無しさん2015/03/06(金) 21:26:45.01ID:IUqp5Z1F
>>636
DDEはWin16時代の遺物みたいなものだから。
0639デフォルトの名無しさん2015/03/06(金) 21:35:54.72ID:ci1Iacgw
>>638
ではEXCELに確実に他のプログラムからデータやコマンドを送信
するにはどういう方法がお勧めですか?
0640デフォルトの名無しさん2015/03/06(金) 21:48:30.44ID:IUqp5Z1F
>>639
オートメーション。
VBScriptでExcelシートを弄る時とかに使ってるやつが、正にそれ。
0641デフォルトの名無しさん2015/03/06(金) 22:23:16.84ID:ci1Iacgw
ddeって非同期でexcel操作出来るけど、
オートメーションでも非同期操作出来る?
0642デフォルトの名無しさん2015/03/07(土) 07:45:28.31ID:M/xZU2Nr
>>636
昔やった時は通信確立からのプロトコルで組み上げてたわ
そこまでやると安定する
0643デフォルトの名無しさん2015/03/07(土) 08:08:10.53ID:axQ1bDXB
>>642
>通信確立からのプロトコル
って、どういう事ですか?もう少し解説お願いします。
0644デフォルトの名無しさん2015/03/07(土) 10:22:13.70ID:6R+vjf4I
もしかしてUDPでTCPモドキを実装するような感じ?
0645デフォルトの名無しさん2015/03/07(土) 20:21:45.36ID:8+lmC0CM
Excelワークシート関数についての質問はここでできるか?
0646デフォルトの名無しさん2015/03/07(土) 20:51:13.82ID:rhnGZpnT
>>645
VBAで使う時の質問じゃなければ
こっちで↓
Excel総合相談所 117 [転載禁止]&copy;2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1423908437/l50
0647デフォルトの名無しさん2015/03/07(土) 21:12:46.39ID:wvhHyM89
>>645
いいんじゃない?
どうせスレ違いだらけだし
0648デフォルトの名無しさん2015/03/07(土) 21:36:21.22ID:raieV8v8
別名で保存 ThisWorkbook.SaveAs Filename すると
開いているブックが新しく名前をつけたブックに置き換わってしまいますが
開いているブックはそのままで、別名のバックアップファイルのみを画面上では一切挙動せずに作成させる事はできないのでしょうか?
0649デフォルトの名無しさん2015/03/07(土) 21:54:50.26ID:QT74R4Ra
>>648
保存してコピーしたらいいんじゃないの?
0650デフォルトの名無しさん2015/03/07(土) 21:56:02.72ID:yEeTgVhP
>>648
コピーして保存したらいいんじゃないの?
0651デフォルトの名無しさん2015/03/07(土) 21:59:41.66ID:cLUisOVs
>>648
テンプレートファイル使えばいいんじゃないの?
0652デフォルトの名無しさん2015/03/07(土) 22:12:21.24ID:raieV8v8
>>649
>>650
>>651
ありがとうございます。
セルの数値を抽出してファイ無名の末尾に追加したいのですが (例として時刻とか)
保存してコピーしてリネームですね、単純なコードかもしれまでんが初心者なのでバグなくちゃんと動くかどうかの動作検証が大変そう!!
まあしょうがないか。。
0653デフォルトの名無しさん2015/03/07(土) 22:56:30.68ID:QT74R4Ra
>>652
だいじょうぶだよ
俺は検証が大変になるほどのテストケースを思いつけないからもっと初心者だ
0654デフォルトの名無しさん2015/03/07(土) 23:18:13.49ID:d3CzPbM9
>>648
ThisWorkbook.SaveCopyAs
でいいんじゃね?
0655デフォルトの名無しさん2015/03/08(日) 00:47:33.05ID:OitgB2a2
検索して合致したらコピーして右1上1のセルに貼って、元のセルのあった行は削除、それを上から下まで実行したいのですが可能でしょうか。行削除なのでfor分だとおかしくなっちゃいます
0656デフォルトの名無しさん2015/03/08(日) 00:52:12.11ID:7lK0xe8v
for文step-1で下の行から順に処理すれば
0657デフォルトの名無しさん2015/03/08(日) 00:57:10.10ID:Cw35OWdT
>>654
超簡単に問題解決できました。ありがとうございました。
0658デフォルトの名無しさん2015/03/08(日) 02:27:21.28ID:fWJ6KrFi
>>653
ファイルのコピーが不成立だった場合
同名のファイルが存在した場合
ファイルが存在しなかった場合
指定した領域へアクセスができない場合
etc
あなたならどうしますか?
0659デフォルトの名無しさん2015/03/08(日) 14:19:21.04ID:i6ndjJIT
>>658
それ全部
> ファイルのコピーが不成立だった場合
やんけ
0660デフォルトの名無しさん2015/03/08(日) 14:30:59.15ID:IpEma7q1
>あなたならどうしますか?

仕事ほっぽり出して寝る
0661デフォルトの名無しさん2015/03/09(月) 11:31:34.41ID:br0W6doH
印刷部数事にA1のセルの数値に+1するにはどうしたらいいでしょうか?
1枚目は1で10枚目は10にしたいです
0662デフォルトの名無しさん2015/03/09(月) 11:55:58.91ID:JeUKKiyc
>>661
つ Workbook_BeforePrint(Cancel As Boolean)
これを使ってA1に数字を入れたら?
0663デフォルトの名無しさん2015/03/09(月) 12:41:58.53ID:Y+wv5reb
>>662

実際には既に組んであるマクロに組み込むつもりで
他のセルから参照したりするので

印刷する部数毎にA1にプラス1する という最小限のコードを知りたかったのです
言葉足らずですみません
0664デフォルトの名無しさん2015/03/09(月) 13:46:31.78ID:b0X+6jZ8
xlsmとかxlamなどのマクロ付きファイルにパスワード設定する場合、
VBAの画面でプロパティで設定しますけれど、そういう方法ではなくて、
何かプログラム的な方法で設定できますか?
0665デフォルトの名無しさん2015/03/09(月) 19:59:21.82ID:nxAcVNnz
>>664
ThisWorkbook.Password = hoge

という事では無くて?
0666デフォルトの名無しさん2015/03/09(月) 20:13:38.37ID:YIVcJxyO
>>664
ZIPファイルに圧縮w
0667デフォルトの名無しさん2015/03/09(月) 20:24:33.59ID:b0X+6jZ8
>>665
ブックにパスワード設定ではなくて、VBAの画面で

VBAProject - プロジェクトプロパティ
表示して、[保護]タブをクリックして
パスワード       ********
パスワード確認入力 ********

って入れるとパスワード設定できますよね。
この操作を、こういう手作業でやるんではなくて、そのxlsmファイルがWindowsのどこかのフォルダに保管して
あるとして、そのxlsmファイルを何らかのプログラムか何かの方法で、パスワード設定出来ないかなという
質問です。そんな事は無理かな。
0668デフォルトの名無しさん2015/03/09(月) 20:33:26.16ID:nxAcVNnz
>>667
VBAProject パスワード 設定 で調べたら、
「出来ない事はないけどウィルスプログラムみたいなものなのでアンチウィルスソフトに引っかかるかもね」という回答を見つけたが。
06695602015/03/09(月) 21:01:35.47ID:R+XoG9o+
VBScript とか他のブックのマクロとか、COM 経由でやればできるんじゃね?
http://officetanaka.net/excel/vba/sheet/sheet07.htm
0670デフォルトの名無しさん2015/03/09(月) 21:04:53.18ID:R+XoG9o+
すまん、
>>667 > ブックにパスワード設定ではなくて
を見てなかったわ
>>669 は忘れてくれ
0671デフォルトの名無しさん2015/03/09(月) 21:53:01.84ID:7i5N+fBw
エクセルの最後の行の次の業を選択するマクロというかコードってありますかね?
例えば、

1:あいうえを
2:かきくけこ
3:さしすてそ
4:

とあって、4行目にたちつてとと入力するようなマクロを組みたい場合に
使えるようなマクロなのですが・・・
0672デフォルトの名無しさん2015/03/09(月) 22:12:11.05ID:YIVcJxyO
>>671
あるよ!

1行目から下に空白セルを探したり

最終行から上にデータあるセルをさがして+1したり
0673デフォルトの名無しさん2015/03/09(月) 23:02:07.53ID:7i5N+fBw
>>672
ありがとうございます
できれば教えて欲しいのですが・・・
0674デフォルトの名無しさん2015/03/09(月) 23:25:01.72ID:YIVcJxyO
>>673
>>1より抜粋
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0675デフォルトの名無しさん2015/03/09(月) 23:51:28.94ID:7i5N+fBw
>>672のどこにヒントの要素があるのか理解できませんが、
いずれにせよここでは解答が得られないのはよく分かりました。
スレ汚し申し訳ありませんでした。
0676デフォルトの名無しさん2015/03/10(火) 00:54:03.77ID:iHRWoavL
はいさようなら
次の方どうぞー
0677デフォルトの名無しさん2015/03/10(火) 03:44:57.92ID:jIX0x7uH
>>671
vba 最終行でググれば出てくるよ。
0678デフォルトの名無しさん2015/03/10(火) 20:07:26.42ID:2lxItQGz
>>675
1.RangeオブジェクトやCellsにはEnd()プロパティというのがあってCtrl+矢印を押した時と同じ働きをする。
2.Rows.CountとColumns.Countはそれぞれ指定された範囲内の行列最大値を返す。
3.Offsetは任意のセルからの相対的な位置を返す。
4.WorksheetオブジェクトにはUsedRangeというオブジェクトがあって現在、データの入っている領域を矩形範囲で返す。
5.Worksheet.Cellsは一つのワークシートが使用できる全ての行列を表す。
0679デフォルトの名無しさん2015/03/11(水) 00:23:55.81ID:eJ0rWRB5
なんか別スレでコード書いて貰ってたよ
0680デフォルトの名無しさん2015/03/11(水) 01:03:48.05ID:0W10G8DZ
Excelの1シートのセルの数には制限がありますが
・2003…65,536行×256列
・2007…1,048,576行×16,384列
・2010…1,048,576行×16,384列

全セルに10桁程度の数を入力して埋めていった場合
実用範囲は何シートぐらいまででしょうか?
0681デフォルトの名無しさん2015/03/11(水) 01:59:25.09ID:eJ0rWRB5
それを聞いてどうする?
何に使うんだ?
単純に冷やかしているようにしか見えないんだが。
0682デフォルトの名無しさん2015/03/11(水) 02:18:06.22ID:0W10G8DZ
>>681
とあるビックデータ解析です。
VBA以外は詳しくないので
すべてExcelで処理してみようかとあれこれ試行錯誤中です
最近1GBほどの容量のブックファイルがやや重いながらも
動作には問題無く動く事を知りました。
0683デフォルトの名無しさん2015/03/11(水) 02:28:45.90ID:Y69XOrvE
環境に依存するから自分で試すべきだし
VBAに無関係でしょ
0684デフォルトの名無しさん2015/03/11(水) 02:37:37.26ID:0W10G8DZ
>>683
自分でも調べますが
この手の事に詳しい人がいたら聞いた方が確実に早いかと
あとVBA処理することを前提に考えてますのでここで質問しました
0685デフォルトの名無しさん2015/03/11(水) 02:48:15.49ID:0W10G8DZ
>>683
>>680
ちょっと試して見た。
Excel2003で
1シート
・2003…65,536行×256列
を数字で埋めた場合約250メガバイトほどのファイルサイズになるようで
1GBを実用範囲とすると4〜5シートまで使用可能?
シートを開いたり保存したりするのには時間がかかるが
そのデータを元に集計を行うVBAが極端に遅くなく動けば実用範囲です。
0686デフォルトの名無しさん2015/03/11(水) 04:12:40.27ID:6SLte7oT
マシンスペックも書かずにそんなこと言われても何の参考にもなりゃしない
0687デフォルトの名無しさん2015/03/11(水) 05:57:52.20ID:/+JGHz5q
俺も会社でデータベース作ろうとしているから興味があって実験してみたけど、
"TEST"の四文字を一行16,384セルに詰めて64KB、コピーしまくったら250,000行で止まって15GB強。
セルのデータだけでメモリーいっぱいまで使えてしまうから「必要環境」はデータ領域+マクロの変数領域って考えりゃいいのかな。

それと気になったのは、ひらがなを256文字入れて一行分コピーしてみたんだけど、
計算上は8MB行くはずなのに2.7MBくらいしかいかなかったんだけど、どういう容量の取り方になってんだろ。
0688デフォルトの名無しさん2015/03/11(水) 07:18:06.75ID:Te5AMx4Z
ビッグ・データってんなら素直にデータベース使う方向で考えろよ
VBA以外は詳しくないってんならこの機会に覚えれば良いだろ。後、統計解析ならR
0689デフォルトの名無しさん2015/03/11(水) 07:19:04.52ID:mbZuxei0
xlsxってzipファイルだよな
0690デフォルトの名無しさん2015/03/11(水) 17:13:06.87ID:HQzc8cpY
>>689
うむ
0691デフォルトの名無しさん2015/03/11(水) 17:38:51.43ID:ZMdmfMKq
>>689
どういうことだ?
0692デフォルトの名無しさん2015/03/11(水) 18:02:06.25ID:pAchRHiO
拡張子をリネームしてみ
0693デフォルトの名無しさん2015/03/11(水) 18:45:05.93ID:8Wvfa6i6
単なるzipアーカイブだから圧縮率変えて再圧縮なんてのもあるね
0694デフォルトの名無しさん2015/03/11(水) 20:10:19.19ID:/+JGHz5q
>>688
大きな会社(特に昔からある会社)ほど自由にソフト触れないんだよ。
既存のソフトで代替出来る限りは「こういう便利なのがあるんですけど」って言っても要求通らないし。
0695デフォルトの名無しさん2015/03/11(水) 20:14:05.56ID:lYcCfnhh
>>685
ブック・オープン -> シート上のデータ読み込み -> ブック・クローズ -> 最初に戻る
していけばいい。I/Oのオーバーヘッドは加わるけど、メモリ・リソースの限度はなんとかなるだろう。
0696デフォルトの名無しさん2015/03/11(水) 23:55:33.99ID:i5IX39mp
エクセルで処理できるビッグデータってなんだ?
ビッグデータ言いたいだけちゃうんか
0697デフォルトの名無しさん2015/03/12(木) 00:04:11.00ID:kI3K8SOY
お前がビッグデータと呼べば、それはいつだってビッグデータなんだ。
ビッグデータはお前を裏切らない。
0698デフォルトの名無しさん2015/03/12(木) 00:19:12.57ID:lHipq8Mi
これを見てごらん?
すごく・・・ビッグデータです・・・(ぽっ
0699デフォルトの名無しさん2015/03/12(木) 00:21:50.08ID:sDEFzeK3
一覧データがあってある列でオートフィルターをかけて抽出し、一列目にあるチェックボタンがクリックでチェックされた行だけCSVで出力というコードをおしえてください。一括チェック、解除などもあればありがたいです。
0700デフォルトの名無しさん2015/03/12(木) 00:23:26.70ID:RhmAAC27
数値データだけで1GBを越えたらビックデータと聞いたけど
それを1000ファイル作って1テラなら確実にビックデータだろう
VBAならそれを生成することも解析することも適切にやればさほど難しい事ではない
つまり工夫すればVBAでビックデータ解析は可能に違いないと見ている。まだやったことないけど。
0701デフォルトの名無しさん2015/03/12(木) 00:36:47.34ID:RhmAAC27
>>700
1ギガ これは古い本で読んだ情報だけどググったら今は全然違ってるみたい
http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF
>2012年現在数十テラバイトから数ペタバイトの範囲である。
10テラ分割すれば出来なくはないだろうけどExcelだけだとしんどいだろうね。
ペタはさすがに無理かな。
0702デフォルトの名無しさん2015/03/12(木) 00:40:46.61ID:RhmAAC27
ペタバイトの数値データがExcelとVBAで軽々と処理できれば無敵だろうね。 マイクロソフトさん早期実現宜しくお願いします!!
0703デフォルトの名無しさん2015/03/12(木) 00:48:51.52ID:lHipq8Mi
そこまでするならせめてSQLServerと連携しろよw
0704デフォルトの名無しさん2015/03/12(木) 05:05:50.73ID:Grza6kM6
HPC Services for Excelって言うのがある
あるのは知ってるが実際に動いてるのものはしらないがw
0705デフォルトの名無しさん2015/03/12(木) 09:42:18.78ID:ilfcLh2n
>>680
集計とかやると、フルに使うまでもなく速度的に1シートも無理
0706デフォルトの名無しさん2015/03/12(木) 15:21:44.53ID:lKLpS/FL
Msgboxの文字列をコピー可能にする方法はない?
0707デフォルトの名無しさん2015/03/12(木) 15:36:32.45ID:FCsQ0GgG
>>706
普通のMsgBox()なら、コピーできるよ。
コピペすると、こんな文字列になってる。
---------------------------
Microsoft Excel
---------------------------
abcde
---------------------------
OK
---------------------------
0708デフォルトの名無しさん2015/03/12(木) 23:35:31.11ID:sDEFzeK3
Excelの特定範囲を、CSV形式で保存したいのですが、名前を付けて保存してもアクティヴワークブックをcsvファイルではなく、元のExcelファイルのままにできないのでしょうか?
0709デフォルトの名無しさん2015/03/12(木) 23:50:08.33ID:lTudpg1Y
特定範囲だけ別のシートに貼ってそれをCSVにすれば良いだけの話では?
0710デフォルトの名無しさん2015/03/13(金) 00:13:10.12ID:FCcf3p6z
>>709
別のワークシートだとアクティヴのワークブックはcsvになってしまいます。
別のワークブックを作成し、CSV保存し、ワークブックを閉じるのがよさそうですね
0711デフォルトの名無しさん2015/03/13(金) 02:59:56.91ID:8nJWpwmC
savecopyasって保存形式選べないんだっけ?
csv閉じるのもいいけど元ファイルを開いたままにしたいなら、
ブックをオブジェクトに保存
csvにしたいシートを新規ブックにコピー
新規ブックをcsvで保存
元ファイルを最初に保存しといたオブジェクトでactivate
0712デフォルトの名無しさん2015/03/13(金) 06:01:55.13ID:z8zfhg7x
シート上のrangeってどうやって取得してる?
0713デフォルトの名無しさん2015/03/13(金) 07:16:47.77ID:Fstr6ZGS
Range.CurrentRegionで
0714デフォルトの名無しさん2015/03/13(金) 08:10:07.94ID:aid4kS/u
それだと島になった孤立セル領域を含められないだろ
0715デフォルトの名無しさん2015/03/13(金) 12:25:47.41ID:8nJWpwmC
activewindow.rangeselection
0716デフォルトの名無しさん2015/03/13(金) 20:11:02.77ID:z8zfhg7x
>>713
>>715
あり
0717デフォルトの名無しさん2015/03/14(土) 09:38:49.78ID:rFJ2VspZ
素人です。教えてください。

エクセルで作業標準書を作って作業してもらっているのですが、
そこに作業時間を表示したいのですが、作業から離れるときに
ポーズ機能をつけたり、終わるときに別のシートに時間を書き込みに行くことは
可能でしょうか?
0718デフォルトの名無しさん2015/03/14(土) 10:48:54.96ID:6UgO5ZeW
>>717
作業開始、離席、再開、終了時になんかクリックとかしてもらえるなら可能
0719デフォルトの名無しさん2015/03/14(土) 13:18:26.47ID:rFJ2VspZ
>>718 ということは、全部ボタンを作ればいけるのですね。
各プログラムマクロを各ボタンにつければいけますか?
0720デフォルトの名無しさん2015/03/14(土) 13:39:31.91ID:sptcMfeO
>>717
可能だけどそんか細かい監視は嫌われますよ?
仕事の品質チェックならもう少し従業員のことを考えてあげないとうまく行かないと思います
0721デフォルトの名無しさん2015/03/14(土) 13:46:19.34ID:rFJ2VspZ
>>720 えっ そうですかね・・・ 大企業とか行ってないのですかね?
0722デフォルトの名無しさん2015/03/14(土) 14:12:26.09ID:VDfRGL41
コールセンターとかなら普通にやってる
0723デフォルトの名無しさん2015/03/14(土) 14:45:54.25ID:6mV+XECP
ストップウォッチ持たせて自分で記入させたほうが結果にコミットできると思うけどなぁ
0724デフォルトの名無しさん2015/03/14(土) 14:52:29.87ID:cCfCziOy
ブゥーチブゥーチッ

結局そういうのだと信頼性に欠けるしなぁ
0725デフォルトの名無しさん2015/03/14(土) 15:15:42.38ID:LSaN/4Jd
工場だと部品や製品にバーコードみたいなもの付けて
作業前後に読み取らせる、くらいのことはやってるところが
あるかもしれない。

工数や工程進捗の把握かな。作業者と紐付けることも
やっているかもしれん。

で、>>717だが、エクセルの作業で、用足しや電話の応対、
誰かに呼ばれたりなんてこともあるかと思うが、いちいち中断の
ための作業をするのは非現実的じゃないかな。

本人に今やっている仕事にどれだけ時間を費やしているか
認識させるためなら、キッチンタイマー(カウントアップできる
ものもある)とかじゃダメ?
0726デフォルトの名無しさん2015/03/14(土) 15:37:02.09ID:ZYVj/NvC
>>721
あなたの会社の規模によるとおもう。
0727デフォルトの名無しさん2015/03/14(土) 15:38:41.23ID:6mV+XECP
画像認識で持ち場を離れたことを検知してはどうだろう

うちもストップウォッチ(キッチンタイマーだけど)を持たせてるけど、間違いなく押し忘れてどっか行く
特に客が来たときは放置したままになりやすい
色々やらせるのがそもそもダメっていうのはあるけど、そこまで抜本対策をとるのは難しいだろう

パソコン操作させるのは時間のロスにもなるし、ミスの原因にもなる
フットペダルや大きいボタンなど周辺機器と連動させてはどうか
フットペダルならわりと安価でボタン割り当てもできるタイプもあるし、手を使わなくていい

ただ、その方向でがんばりすぎてトイレ標準時とか作り始めると士気が落ちる
柔軟にやってほしい部分をやらなくなって注意すると「(言われたことは)ちゃんとやったでしょ」という態度になっていく
まぁ、タバコやトイレで体調を自己管理させるのとどっちが効率いいかは微妙なところ

ちなみにこっちは工場じゃないからね
0728デフォルトの名無しさん2015/03/14(土) 18:35:08.33ID:rFJ2VspZ
みなさん ありがとう。
まぁ勉強がてら、いろいろプログラムを組んでみます。
0729デフォルトの名無しさん2015/03/14(土) 20:19:47.42ID:YK5dNgNX
VBAに関係ないのにみんなやさしいなw
0730デフォルトの名無しさん2015/03/15(日) 01:00:10.65ID:Oue+f2XF
現在のcolorindexを RGBに変換する方法はありますか?
colorindexを変更しまくっているため、既定値とは大きく違ってしまっています。
0731デフォルトの名無しさん2015/03/15(日) 03:56:42.56ID:Nu00PGZt
>>730
ColorIndexで設定した後にColorで取り出せばいいんじゃね。
0732デフォルトの名無しさん2015/03/15(日) 22:48:16.06ID:Oto6pkxv
>>731
ありがとうございます。
colorって設定ばかりだったから、読めることを思いつきませんでした。
0733デフォルトの名無しさん2015/03/16(月) 19:39:17.63ID:tk5ie8LU
1番厳密にプロパティ、メソッド調べられるのってオブジェクトエクスプローラ?
0734デフォルトの名無しさん2015/03/16(月) 21:32:02.14ID:3ZODMEse
文字列を格納して、”,”等で区切って配列に格納したいのですが、できますでしょうか?
その場合、文字列の中身は確定していないものとして、配列サイズは動的に変更できますか?
0735デフォルトの名無しさん2015/03/17(火) 01:34:13.86ID:Vi/eJRXz
Rubyでは文字列を、指定した区切り文字で区切って、
配列に格納してくれる

str = "A,B,C"

ary = str.split(/,/)
0736デフォルトの名無しさん2015/03/17(火) 02:35:49.91ID:/aRClwjb
>>734
str ←分割したい「,」入りの変数
dim val() as string, cnt as long
dim pos_cur as long, pos_next as long
pos_cur = 0
cnt = 0
do while true
pos_next = instr(",", str, pos_cur + 1)
if pos_next > 0 then
redim preserve val(cnt)
val(cnt) = mid(str, pos_cur + 1, pos_next - pos_cur - 1)
cnt = cnt + 1
pos_cur = pos_next
else
exit do
end if
loop
0737デフォルトの名無しさん2015/03/17(火) 03:40:10.86ID:Z0NUyV+t
>>733
実装調べるならまあそうだろうけど
ドキュメントにないプロパティとかでてもなぁ、という事もある

>>734
Split関数
0738デフォルトの名無しさん2015/03/17(火) 17:20:47.84ID:t2kdwNkI
http://yahoo.jp/box/uEInsU
VBAで組もうと思ったのですが、いかんせん高校の情報で習った知識しかなく、自分で組んだところ、
データ検索を押すと無限ループに陥ってしまい、うまくいきません。
初歩的な質問で申し訳ないのですがこのVBAを組む足がかりを教えていただけませんか?
0739デフォルトの名無しさん2015/03/17(火) 18:25:04.03ID:vCwecCoL
>>738
ダウンロードしてみたけど、コードが無いんだが。
0740デフォルトの名無しさん2015/03/17(火) 18:32:25.71ID:vCwecCoL
シートの内容だけ見たが、参考記録シートのレイアウトが良くない。
全競技横に並べると便利。
そうすれば、worksheets("参考記録").rows(1).find("400mH")とかで、競技を見つけられる。
あるいは、1競技1シートにすれば、探す必要がなくなる。
0741デフォルトの名無しさん2015/03/17(火) 18:41:56.57ID:t2kdwNkI
>>739,740
ご指摘ありがとうございます。前回作ったやつが強制終了でデータが消えてしまったようです。
740の意見を参考にしたいと思います。
Ifを使って、名前と競技結果が一致したら出力sheetに出力という関数を自前でやってみたのですが、
別々のsheetにあるものを同時に出力させる技術がなく、わけのわからないコードになってしまって、Loopした覚えがあります。
もう少しコンパクトにいける技術はあるのでしょうか?
0742デフォルトの名無しさん2015/03/18(水) 11:21:30.00ID:OporZNyH
DoEvent入れても応答なしになる。ESCもCtrlPauseもダメ。
Excel2013ってなんかエラー含みな気がするなぁ。
0743デフォルトの名無しさん2015/03/18(水) 13:02:18.09ID:BjLPqBwu
まずマクロ記録をマスターすべきだな
0744デフォルトの名無しさん2015/03/18(水) 16:58:02.44ID:wrJQV04f
あ、やっぱDoEventってそうなるよね?
俺だけかと思ってた
0745デフォルトの名無しさん2015/03/18(水) 17:45:23.15ID:lQVpCBZN
まさか、多重にDoEventしているとかいう初心者以前の状況じゃないよね?(´・ω・`)
0746デフォルトの名無しさん2015/03/18(水) 19:15:40.13ID:eDH0ZGAY
>>742
マルチスレッドならイケるんじゃね
0747デフォルトの名無しさん2015/03/18(水) 19:34:48.73ID:wrJQV04f
マルチスレッド対応してるの?API使ってとかじゃなくて?
0748デフォルトの名無しさん2015/03/18(水) 23:55:16.37ID:ga8Jk3h7
エクセルの関数って実体のファイルは、どこかの.dllだったりするの?
0749デフォルトの名無しさん2015/03/19(木) 12:35:13.54ID:7c4CnP4H
>>748
それ知ったところでエクセルの外からは使えんと思うぞ
何がしたいねん?
0750デフォルトの名無しさん2015/03/19(木) 15:43:57.39ID:1I3TwXi1
2つ質問させてください。

@2次元配列(100×4のinteger型)の2番目列の最大値を出すには総当たりしかないですか?

Aa、b、cという3つの変数に一括で同じ数値を入れる方法ありますか?

よろしくお願いします。
0751デフォルトの名無しさん2015/03/19(木) 16:28:51.44ID:VVf+EvQX
>>750
1:しかない
2:ない
0752デフォルトの名無しさん2015/03/19(木) 16:55:23.35ID:1I3TwXi1
>>751
ありがとうございました
0753デフォルトの名無しさん2015/03/19(木) 17:33:29.58ID:76Yv278k
>>750
1.max関数
0754デフォルトの名無しさん2015/03/19(木) 20:09:37.07ID:ygDVwDTU
>>753
max関数に引数を一気に入れる方法がない以上、総当たりだろ。
0755デフォルトの名無しさん2015/03/19(木) 20:20:15.65ID:DWTmmRVl
Dim WS as Worksheet,二次元配列(100,4) as Integer,最大値 as Integer

Set WS = Worksheets.add
Range(WS.Cells(1,1),WS.cells(100,4)) = 二次元配列
最大値 = Worksheetfunction.Max(WS.Range("B:B")

という事ではなくて?
0756デフォルトの名無しさん2015/03/19(木) 20:29:32.37ID:HCELgKhO
>>749
仕組みがしりたい
07577502015/03/19(木) 20:55:09.14ID:B57QaUqn
>>755
一度ワークシートに転記すればできるんですが
配列の中だけでできる方法がないかと思いまして。
0758デフォルトの名無しさん2015/03/19(木) 21:23:50.49ID:DWTmmRVl
>>757
俺も今日、ちょうどそういう問題に当たってネットで調べたりしながら試行錯誤してたけど、
結局は廃棄可能なワークシートを使うのが一番簡単だという結論にたどり着いた。
エクセルVBAはそこまで親切なシステムしてない。
というかシートなら少なくとも三次元配列までは表現できるから配列内を自由に弄りたければArrayはシートで表現する方が効率的。

ちなみに「エクセルが足かせになるなら、もうVBS使っちゃえばいいんじゃね?」という方向もある。
0759デフォルトの名無しさん2015/03/19(木) 21:34:06.05ID:B57QaUqn
>>758
ワークシート使うと処理速度が落ちるので避けたかったんです。
けっきょく総当たりに落ち着きました。
0760デフォルトの名無しさん2015/03/19(木) 21:59:12.43ID:d+3glag/
Sub TEST()
Dim testData As Variant
testData = ActiveSheet.Range("A1:D100")

With WorksheetFunction
Debug.Print .Max(.Index(.Transpose(testData, 2, 0)))
End With
End Sub

WorksheetFunction使いまくりで一応取得できる
.Transpose外せば行の最大値もとれるよ
0761デフォルトの名無しさん2015/03/19(木) 22:00:24.09ID:i95v39FG
いや・・ループ回せば終わるやろ(´・ω・`;)
0762デフォルトの名無しさん2015/03/19(木) 22:01:31.59ID:d+3glag/
Debug.Print .Max(.Index(.Transpose(testData), 2, 0))
閉じかっこ修正
0763デフォルトの名無しさん2015/03/19(木) 22:01:34.03ID:gLg2znKB
>>758
>Arrayはシートで表現する方が効率的。
とはどういう意味?
Arrayのままで十分効率的に扱えると思うけど。
それともループ処理が大嫌いとか?
0764デフォルトの名無しさん2015/03/19(木) 22:52:50.19ID:DWTmmRVl
>>763
「自由に弄りたいなら」という前提が何故抜けた。
一次元配列の操作で事足りる様な単純な処理ならまだしも
複数列に複数条件のフィルタかけて全ての情報を目的別に振り分けるみたいな複雑な処理の状況の場合はシートの方が効率いいんだよ。

だいたいエクセルで弄る事が前提になっている以上は配列の内容だってセルのどっかに記録されている状況の方が多いわけで、
わざわざ配列に値を入れるくらいならcopyしてシート上で扱う方が処理も速いし自由度が高い。

そりゃArrayのままで効率的に処理出来る条件下だけで語るなら「Arrayのままで十分効率がいい」んだろうけどさ。
0765デフォルトの名無しさん2015/03/19(木) 22:58:28.78ID:gLg2znKB
そりゃすまんかった。
人それぞれとしか言いようがないわな。
0766デフォルトの名無しさん2015/03/19(木) 23:05:34.69ID:DWTmmRVl
自分で書いて思ったんだが、要するに>>750の「100*4の二次元配列」が何処から沸いてきたのかさえ分かればいいんだよな。

まさか400に及ぶ要素を手書きでコードに埋め込んでいるわけでもあるまいし、
たとえば外部が吐き出したTXTを読み込んで各行をSplitで分けるくらいなら、読み込む時の設定次第でエクセルのシートとして読み込めるわけで、
「100*4の二次元配列」にする前にもっと出来る事があるような気がしてきた。
0767デフォルトの名無しさん2015/03/19(木) 23:28:49.91ID:gLg2znKB
for i = ・・・   matrix(i, j) = Int(1000 * Rnd())   ・・・  Next i

とかかも知れんわな。
0768デフォルトの名無しさん2015/03/20(金) 00:23:53.33ID:kFbLT/qS
自分は最初と最後の入出力にしかセルは使わないな。
ワークシートを使う操作はライブラリ化しにくい。
0769デフォルトの名無しさん2015/03/20(金) 05:11:47.63ID:uvRirvlk
ExcelのVBAで
入門書、初中級者用ではなく
クラスモジュールも駆使した上級者向けの本ってございませんか?
0770デフォルトの名無しさん2015/03/20(金) 07:57:10.50ID:Xj3wMBJM
上級者なら別言語やデザインパターンの本買って来るかネットで調べた方が早い
0771デフォルトの名無しさん2015/03/20(金) 08:03:16.34ID:uvRirvlk
>>770
そうなんですよ。
Java言語や結城なんとかのデザインパターンの本は読んでますが
ExcelVBAに独特のクラス文法が違ってるから
それに特有の本が欲しいんですよ。

VBAのクラスはプロパティを定義するのに特殊なのは知ってますか?(特殊というのはJavaを標準とした勝手な考えだけど。getterやsetterを必ず書かないといけないみたいなんです。)
0772デフォルトの名無しさん2015/03/20(金) 08:12:40.34ID:h8MQtvkP
>>771
> getterやsetterを必ず書かないといけないみたいなんです。
おとなしく初心者用の本を買って読めよ
0773デフォルトの名無しさん2015/03/20(金) 08:18:38.73ID:pLIOPcO5
初心者本もけっこう長く役に立つよな。
初心者本で見つけた小ネタ使って
これ以上処理速度上がらんだろうと思ってたコードをいじってみたら
3割ほどスピードアップしたっけな。
0774デフォルトの名無しさん2015/03/20(金) 08:18:55.30ID:Xj3wMBJM
>>771
プロパティに関しては面倒くさければメソッドと同じように作ってしまえばいい。

そんなことより継承が使えなかったりコンストラクタに引数を持たせることが出来なかったりする方がちょっと悩ましいが
それもデザインパターン知ってれば応用きかせて何とかなる範疇。
0775デフォルトの名無しさん2015/03/20(金) 08:24:41.38ID:uvRirvlk
>>774
そのとおり。
VBAでのプロパティの作り方など多言語の本には絶対載っていない。
さらにVBAは継承が使えないからもしそれを実現するにはどう書けばいいかなんてJava本には絶対に載っていない。

そういう文法的な意味でVBAの上級者向けの本を探しているのですよ。

こういうサイトを見つけました。

「昨日までJavaJavaしてた人がいきなりExcelのVBAを実装する羽目になったときのためのメモ」
http://qiita.com/opengl-8080/items/5bd8ae7fe95f5c31dfc3

逆に
「昨日までVBAVBAしてた人がいきなりクラスモジュール設定やオブジェクト指向を活用する羽目になったときのためのメモ」
みたいな本を探しているのですよ。
0776デフォルトの名無しさん2015/03/20(金) 08:27:04.31ID:94vKR86E
継承できないとかVB6かよwww
0777デフォルトの名無しさん2015/03/20(金) 09:05:34.70ID:Xj3wMBJM
>>775
無いだろうな。
VB6からVB.Netへ位ならあるかも知れないけど、そもそもJavaとExcelVBAは立ち位置もかなり違うものだしな。

むしろJavaが使えるならそっち側からExcelのObject操作すりゃいいんじゃないの?
0778デフォルトの名無しさん2015/03/20(金) 09:08:06.38ID:Xj3wMBJM
>>776
おいおい何を今更w
まさか殆どVB6と一緒なこと知らない訳じゃないだろ?
0779デフォルトの名無しさん2015/03/20(金) 09:23:52.40ID:LtTIDtbq
>>776
今頃何寝言言ってんのおまえ?
0780デフォルトの名無しさん2015/03/20(金) 09:56:50.63ID:+Z7yaCvp
ほんと、VBAはこのままでいいと思う。
機能追加なら使わなければいいけど、仕様変更など決して許しちゃダメだ。
0781デフォルトの名無しさん2015/03/20(金) 10:03:08.52ID:Z8yGKqIr
えー
0782デフォルトの名無しさん2015/03/20(金) 10:47:58.88ID:hT9HjgFm
>>777-780
じゃあVB6の本で十分なのか
0783デフォルトの名無しさん2015/03/20(金) 11:16:08.77ID:Z8yGKqIr
VB6の本でクラスについて詳しく書かれている本があるとも思えないし、あったとして
古本屋やネットで探すのも至難の技だろう
0784デフォルトの名無しさん2015/03/20(金) 11:44:56.91ID:G05napNA
>>766
>>750の質問は簡略化して書いたので、実際は
2000行×4列のデータがすでにワークシートに記入されてて、
1行ずつ2000行まで最大値とかいろんな計算をしてパラメータ変えてまた1行目から、ってのを繰り返します。
Dim data as Variant
Set data = Range("A1:D2000")
で変数に入れればMaxも使えるんですがなんせパラメータが数十万通りあるので
Variantやワークシート操作してると時間かかっちゃうんです。
0785デフォルトの名無しさん2015/03/20(金) 12:03:06.75ID:+Z7yaCvp
>>784
パラメーターが数十万通り・・・

悪いこと言わないから他の言語で扱
うことをお勧めする。
データ入出力はExcelのままでいいから、SAFEARRAY構造体をC++の
dllに渡すんだ。
処理スピードだけじゃなく、汎用性も得られるし選択肢が広がる。。
0786デフォルトの名無しさん2015/03/20(金) 12:18:14.92ID:G05napNA
>>785
アドバイスありがとうございます。
やっぱVBAでは限界ですねw ほかも勉強してみます。
0787デフォルトの名無しさん2015/03/20(金) 13:41:55.41ID:32JFZAss
>>785
そういう手法を解説したお勧めの本
教えて下さい。
0788デフォルトの名無しさん2015/03/20(金) 14:29:51.90ID:+Z7yaCvp
>>787
ごめん、本は知らない。
昔からある枯れた部分だからネット上に情報はたくさんあるはず。
一度出来るようになると、決まりきった実装パターンばかりなので、特に沼にはまりこむ心配はない。
0789デフォルトの名無しさん2015/03/20(金) 14:44:11.57ID:P202Q6+8
>>785
> パラメーターが数十万通り・・・
10通りのパラメータが10個で100億通り。
5通りのパラメータが10個で約1,000万通り。
数十万とか小さい小さい。
0790デフォルトの名無しさん2015/03/20(金) 18:45:29.63ID:fFgykzEN
Excelで新年度の計画表に記入しろって言われて、期限ギリギリで上司が電卓叩きながら間に合わねえ!とオロオロ嘆いていた。
どうせ前年比+数パーを入れるだけなんだからVBAでやったら?と言ったんだが、え?!vlookup?と言われたんで見捨てました。
皆さんならどうしますか?
0791デフォルトの名無しさん2015/03/20(金) 18:53:44.11ID:cY+yA+77
なんで電卓つかってんだよw
0792デフォルトの名無しさん2015/03/20(金) 18:58:49.37ID:gVsIDPUr
>>790
見捨てる、で正解だと思うw
0793デフォルトの名無しさん2015/03/20(金) 19:07:47.84ID:rtxuq3Ol
>>790
まず上司には敬語使うように心がけるかな
0794デフォルトの名無しさん2015/03/20(金) 19:29:13.80ID:Z8yGKqIr
>>790
横で応援する。
だが決して手は出さない。
0795デフォルトの名無しさん2015/03/20(金) 20:07:08.76ID:CMK1CytM
>前年比+数パーを入れるだけなんだからVBAでやったら?

セルに数式入れるだけで事足りるような
0796デフォルトの名無しさん2015/03/20(金) 20:40:37.64ID:JUaMRqUb
EXCEL上でVBA以外の言語を走らせるとか出来ないのかな。
ユーザーフォームにWeb Browserを追加して外部のHTMLページ(コントロール用)を読み込ませるっていう手法があるらしいけど、
その応用でExcelそのものにHTML5+CSS+jsを埋め込んで動作させるとか出来たらいいのに。
0797デフォルトの名無しさん2015/03/20(金) 21:04:30.06ID:h8MQtvkP
VB6 + Excel_Objects ≒ Excel_VBA
0798デフォルトの名無しさん2015/03/20(金) 22:14:04.26ID:3E+pQjq6
シートでEXCEL関数のみで結構色んな処理が出来るからな
シート外との入出力系はVBAに頼らないと出来ないけど
0799デフォルトの名無しさん2015/03/20(金) 23:35:14.35ID:JUaMRqUb
>>797
つまりVBでユーザーフォームに頼らない独自のウィンドウアプリケーションを作成できる!?
0800デフォルトの名無しさん2015/03/20(金) 23:43:59.91ID:luXrOx6r
>>799
その程度なら API でなんとでもなると思うが
0801デフォルトの名無しさん2015/03/21(土) 16:59:53.30ID:2HfMDNKF
Лист1
0802デフォルトの名無しさん2015/03/21(土) 19:30:53.45ID:GRvZe6my
>>800
あれ、ドラッグ&ドロップでラベルを動かして配置するUI作りたかったんだけど、そういうのも出来る?
調べても出てこなかったからあきらめてたんだけど、VBの本買えばいいのか??
0803デフォルトの名無しさん2015/03/21(土) 21:46:25.64ID:gVnYSHkq
まだコードを書く前なので先にここで質問ですが
VBAを多重稼動させるためにExcelはいくつぐらいまで起動しても大丈夫なのでしょうか?
用途的には16ぐらい動いてほしい状況ですがちゃんと動くのでしょうか?
Think different? by 2ch.net/bbspink.com
0804デフォルトの名無しさん2015/03/21(土) 22:05:58.09ID:qnP8SmNL
>>802
ネタだとは思うけどできるよ
ただマジでやりたいなら、VB.NET とか C# なりでやった方が楽だと思うぞ
0805デフォルトの名無しさん2015/03/21(土) 22:13:01.32ID:GRvZe6my
>>804
マジボケでごめん・・・。Windows APIを使って引数のやりとりが出来るという発想自体が無かったんだ。
そしてC/C++の方が習熟してるんだけど、会社でやってる事だからエクセル以外使えないんだ。
0806デフォルトの名無しさん2015/03/21(土) 22:25:57.78ID:DIvWRuL5
>>805
どういうこと?
コンパイル環境(VS)がない、とか
C/C++で作成したものを稼働させる許可がもらえない、とかかな?
0807デフォルトの名無しさん2015/03/21(土) 22:26:53.81ID:qnP8SmNL
>>805
> 会社でやってる事だからエクセル以外使えないんだ。

なら無理だと言って諦めた方がいい
わざわざ苦労したいなら別だけど、会社なそんなことを評価してくれないと思うぞ
0808デフォルトの名無しさん2015/03/21(土) 23:42:05.66ID:GRvZe6my
>>806
稼働の許可もらえないってのが一番近いかな。

俺はシステム作る名目で雇われたわけじゃなくてVBA使えるって事で上司に特別に仕事を振られたので、
エクセルやアクセスのVBA以外でシステムを構築するってなると俺が便利っていう以上の理由が必要なんだよね。
0809デフォルトの名無しさん2015/03/22(日) 00:00:20.46ID:jwoT93DU
>>803
動くよ。ただ、CPUのスレッド数以上立ち上げても意味ないだろ
0810デフォルトの名無しさん2015/03/22(日) 00:23:25.06ID:FHqRUY0c
>>808
じゃあ一般企業での話なんでしょ?
作ったものがVBAかどうかなんて区別できないんじゃないかなあ。
自作dll呼び出し放題の気がするけど?
0811デフォルトの名無しさん2015/03/22(日) 12:47:36.72ID:wjsHDVFt
[ACC2003] ドラッグ アンド ドロップ機能をシミュレートする方法
https://support.microsoft.com/ja-jp/kb/287642/ja

Excel 97/2000 ドラッグ&ドロップ−ListBox⇒ListBox
http://www.moug.net/tech/exvba/0150045.html

古いものだらけだけど、だからこそ枯れてる  かどうかは知らんけど 自分で試しても無いけど
会社側からすれば、人が替わっても受け継げるものでないと、その都度面倒が起きるんだ
それを嫌がるのはある  ええい! やってまえ! で生半可なモノつくり置いていった人の
作品は後輩達から嫌がられてるのがほとんど そういう意味でも評価が貶められるのは現実
0812デフォルトの名無しさん2015/03/22(日) 13:52:10.90ID:wb31i9Ft
会社によって色々だな。
共用のもの個人のものがごっちゃになると弊害があると思う。
後者だったら自分の仕事が効率アップして自分のアドバンテージになることだけ目指せばOKだけどね。
0813デフォルトの名無しさん2015/03/22(日) 21:27:27.96ID:ziwFlX65
助けて下さい

B1セルに test.jpg というファイル名の記載があるとします

A1セルに、B1セル記載のファイル名のフルパスを記載させたいの
ですが、どうすればいいんでしょうか。ググってみましたが、フルパス
を分離するのは見つかってるんですが、ファイル名からフルパスを取得
するのがどうしても分かりません。
0814デフォルトの名無しさん2015/03/22(日) 21:30:30.43ID:ziwFlX65
↑ファイルプロパティにフルパスが記載されているんですが、
他のpcでも現在作成中のvbaを入れたいので、なんとかVBA
プログラムでフルパスを取得したいと思っています
0815デフォルトの名無しさん2015/03/22(日) 21:41:30.15ID:fxQo9p+r
>>814
そもそもその画像ファイルとExeclファイルは何の関係もないよね?
0816デフォルトの名無しさん2015/03/22(日) 23:27:30.37ID:vsPNH1vO
>>813
そのtest.jpgっていうのは、どのフォルダにあるのか決まってるのか?
たとえばそのExcelファイルと同じ場所とか、そのユーザのマイドキュメントとか
決まってるならその場所によって方法はあるかもしれん
決まってないなら、基本的に不可能
0817デフォルトの名無しさん2015/03/22(日) 23:41:47.01ID:Ve0aRxWW
>>813
Sub Sample()
Range("A1") = FileSearch("C:\", Range("B1"))
End Sub

Function FileSearch(Path As String, Target As String) As String
Dim FSO As Object, Folder As Variant, File As Variant,FilePath As String
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Folder In FSO.GetFolder(Path).SubFolders
FilePath = FilePath & "," & FileSearch(Folder.Path, Target)
Next Folder
For Each File In FSO.GetFolder(Path).Files
If File.Name = Target Then
FilePath = FilePath & "," & File.Path
End If
Next File

FileSearch = FilePath
End Function


動作確認はしていない。
0818デフォルトの名無しさん2015/03/22(日) 23:58:38.25ID:wjsHDVFt
方法はあるかも・・もなにも、そのまんまじゃねーかw 決まってるならソコだろw

多分あちこちに分散してる画像をセルに挿入してんだろ で、元画像のファイルのプロパティを見れば
フルパスあるからそれを別セルに保存しておきたいと で、後々その画像の元フォルダを辿る必要が
出てきた時の参照としたいと   現場写真とかやってるとありがちな要求だわな

それだと画像挿入部分までVBAで処理してその途中でフルパスを取得する って手順踏まないと
挿入後だと元画像のフルパスは判別できなくなる  んだろうな、たぶん

現場写真 Excel でぐぐれば山盛りサンプル出てくるから当たってみれば
0819デフォルトの名無しさん2015/03/23(月) 00:08:20.30ID:2wZsOLL7
特定のログインが必要なWebサイトからテーブルの各セルから値を取得したけど
Webサイトで最初の本日の日付で

HPのサイトでのテーブルが

|日付|__|1日|2日|〜|22日|〜|31日|
|合計|19個|0個|4個|〜|15個|〜|__|

となっていて、ここで22日が15個という値と、合計が19個という状態。

ここで取得する値がVBAを実行する日によって違う(22日なら22日の個数)ようなのって
どうしたらいいんだろう?
0820デフォルトの名無しさん2015/03/23(月) 00:59:31.59ID:xwACqlut
日付(A1), B1, C1, D1
合計(A2), B2, C2, D2

よく知らんけど、
Date 関数か何かで、今日の日付を求めて、
例えば2日なら、C2の値を取り出す
0821デフォルトの名無しさん2015/03/23(月) 04:26:08.07ID:CJtumJO9
>>818
Excelファイルの位置も、マイドキュメントのフルパスも固定じゃないぞ
0822デフォルトの名無しさん2015/03/23(月) 22:28:08.11ID:m+jC0G5p
なにを言いたいんだw そんな時刻は熟睡してろw
早起きしちまったんなら、コーヒー飲んで頭冴えてから書き込めw
おまえのフォルダのフルパスなんか知る訳ゃ無いだろw だからソコって書いたんだ

フルパスが必要ってことはローカルのみならずLANの先って場合もあるだろ
WANのケースも有るかも知らんが  散逸してるファイルを辿りたいって需要を
解決したいんじゃないのか?
いずれにしろCellに貼り付けた後じゃ知りようも無いから、取得時にリンクを確保しろってこった

http://hinden.at.webry.info/201106/article_16.html  ←ほれ、ココにほぼ答え出てたわ
Excel 画像 フルパス でぐぐってこうも簡単に辿り着けるじゃねーか
ここで取得した MyPath を貼り付けたセルの左隣 ActiveCell.Offset(0,-1) = MyPath とでもすりゃいい
0823デフォルトの名無しさん2015/03/25(水) 21:20:36.49ID:kqCenuXt
813です。皆様ヒントやコード等本当にありがとうございます。仕事の関係で
返事が遅くなり申し訳ございません。アドバイスを元に、

For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 20).Value <> "" Then
s = Cells(i, 20).Value
s = ThisWorkbook.path & "\" & s 'フルパスを探す
'Range("s3").Value = s
Cells(i, 19).Value = s
Else
Cells(i, 19).Value = ""
End If
Next i

で書いてみたらなんとかいけました。同じ階層内、同じフォルダ内に
エクセルファイルと、画像ファイルを存在させるつもりなので、これで
いいのかなと思っていますがどうでしょうか。
0824デフォルトの名無しさん2015/03/25(水) 21:22:58.95ID:kqCenuXt
すいません、

dim s as string

です。
0825デフォルトの名無しさん2015/03/25(水) 21:25:10.89ID:kqCenuXt
何度もすいません、バックスラッシュが会社のpcで表示できないので、
\ で代用しています。
0826デフォルトの名無しさん2015/03/25(水) 23:02:09.61ID:sFFqA7vz
ttp://hamachan.info/win8/word/macro.html
こちらのHPに書かれていることを
ワードではなくエクセルでしたいのですが
どうすればよろしいのでしょうか?
0827デフォルトの名無しさん2015/03/25(水) 23:45:14.83ID:84HX5QPE
大いにエスパーが外れたにも拘らず大口叩いてすまんかった これこのとおり 謝る

アチコチに画像詰め込んだフォルダがある そのフォルダ内にExcelファイルも置く
B列にその画像のファイル名を列記しとく  で、A列にそのフォルダのフルパスが欲しい と、そおゆうこと?

それって、、 A列上から下まで全部いっしょじゃね? まごうことなく一緒だろ? マクロやVBA必要か?
もっと言えばExcel必要か? テキストファイルでよくね?  要望が読めね、、、
0828デフォルトの名無しさん2015/03/25(水) 23:47:52.45ID:bA1UtxNW
B2のセルでエンターキーを押すと”テスト”という名のマクロが実行される
というマクロを作りたいです

Private Sub worksheet_ ??
If KeyCode = 13 and Not (Target.Row = 2 And Target.Column = 2) Then Exit Sub
テスト
End Sub

こんなイメージなのですがどういう文にすればいいでしょうか?
0829デフォルトの名無しさん2015/03/26(木) 02:39:50.39ID:tQViIZIH
>>828
ワークシートやブックなんかでは、キー入力周りのイベントはサポートされてないはず
Worksheet_Changeあたりで代用するか、何やりたいか知らんが違う方法考える方が良いんじゃね
0830デフォルトの名無しさん2015/03/26(木) 07:01:14.21ID:zxUHxD8M
>>828
そのコード、エンターキー以外だとどのセルでもテストが実行されるけどいいのか?w
0831デフォルトの名無しさん2015/03/26(木) 07:43:43.83ID:LA0ApMoS
>>826
記号置換表.csv
(置換前文字列, 置換後文字列)
A01, 第1営業部
A02, 第2営業部
A03, 第3営業部

このファイルを、Excelに読み込んで、
同じように処理すれば、置換できるのでは?
0832デフォルトの名無しさん2015/03/26(木) 11:46:06.56ID:bzeZcoop
>>831
置換用のcsvはそう作ってあるのですが
マクロがワードでは使えましたが
エクセルでは使えませんでした
0833デフォルトの名無しさん2015/03/26(木) 13:39:20.84ID:iGJalkdz
>>832
>>1
> ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
0834デフォルトの名無しさん2015/03/26(木) 21:17:05.53ID:H+7SuQk0
>>833
はいざんねーん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0835デフォルトの名無しさん2015/03/26(木) 21:32:15.95ID:ufaysk4i
vbaを動かしているときに、リソース不足やメモリ不足が出るのは、vbaで解消できないですか?
内容は、あるデータをフィルターかけて、コピーし別のシートに値貼り付けを繰り返していると起きます。
Excel以外は起動させてません。
0836デフォルトの名無しさん2015/03/26(木) 22:02:52.90ID:t5xQu5lY
例題も元はExcelファイルだて書いてある それをWordのマクロで処理・・ てからには
いろいろ支障あるんで一旦Wordで処理したものを、もっかいExcelに戻すとかなんだろう それか楽な道を選択したとか

一回の処理量とか処理する頻度とかでもいろんな選択肢あるだろうけど、そのCSVの変換表作ってる間に
Select case や Replace でコツコツやっちまったほうが結果的に早いかも  後日の礎にもなるかもだし
0837デフォルトの名無しさん2015/03/26(木) 22:24:28.80ID:bzeZcoop
>>833
ヒントをください
0838デフォルトの名無しさん2015/03/26(木) 23:16:47.05ID:vUSUmWFZ
>>835
昔よくそうなっていた
windows7 64bit office2010になってから起きなくなった
OSやofficeのバージョンが関係しているかも

でっかいコピーなら、遅くなるが一度ファイルに書いて
そこから読むなど、工夫してみたら(←例であって効果があるかどうかわからないが)
0839デフォルトの名無しさん2015/03/27(金) 04:54:08.57ID:B/xnV6qp
>>835
loop
 メモリを使う
 GC(Garbage Collection)でメモリを解放
end

のように強制的に、GCを動かすことは出来ないの?

>>837
君は自分で、プログラムを書けるの?
0840デフォルトの名無しさん2015/03/27(金) 08:18:33.23ID:Ry4YBg/F
>>835
コピーしている範囲がデカいか、メモリの解放が行われる前に次のコピーやっちゃってるんじゃないの?
もっとも後者は起こるか分からんけど。

対応方法としては前者なら切り貼りする範囲をもう少し刻んで数回に分けて行う。
後者なら一回貼った後少し待った後で次のを貼るってことで対応出来るんじゃないかなぁ。
0841デフォルトの名無しさん2015/03/27(金) 15:41:53.13ID:B/xnV6qp
Rubyなら、こんな感じ。
str は置換したい文字列。
Convert.csvが置換表(置換前, 置換後)

File.open("Convert.csv") do |file|
# CSVファイルを、1行ずつ処理する
file.each_line do |line|

# カンマで区切る。cols[0]置換前、[1]置換後
cols = line.split(',')
str.gsub!(Regexp.new(cols[0]), cols[1]) # 置換

end
end
0842デフォルトの名無しさん2015/03/27(金) 17:05:28.27ID:YZyxoY3z
Rubyの話はもういいから
0843デフォルトの名無しさん2015/03/27(金) 18:46:07.82ID:rCZK4pzn
ほんとにリソースが不足するなら根本的な処理を見直さないとだめだけど
なんの処理でなんのリソースが不足してるのかもわからんし何とも言えん

>>839,841
VBAにGCとかありませんから
とっととお帰り下さい
0844デフォルトの名無しさん2015/03/27(金) 19:29:45.13ID:bun/1N9J
>>839
>>841
ここはおまえのような三流プログラマのくだらねぇテクを
披露する場所じゃありませんよw
0845デフォルトの名無しさん2015/03/27(金) 21:52:21.46ID:6BeyT2pm
とりあえずバックアップ残してからDimを全て消してマクロ動かしてみて、それで不足しなければ何か無駄に宣言してる。
0846デフォルトの名無しさん2015/03/28(土) 04:19:55.69ID:TdpMjFgv
丁寧にnothing入れていけば大体なくなる
0847デフォルトの名無しさん2015/03/28(土) 13:15:19.97ID:u275bbRu
835です。
いろいろ試した所、
dim worksheet() as worksheet
set worksheet(1)=worksheets(”いい”)
の部分を全部やめた所、エラーが無くなり、無事に動きました
いろいろ書き方と理解が間違っていたかもしれません。
0848デフォルトの名無しさん2015/03/28(土) 14:26:17.01ID:eRZ9PNxr
初心者です。エクセルのユーザーフォームで、コマンドボタンから
別のユーザーフォームを起動させることは可能でしょうか?
0849デフォルトの名無しさん2015/03/28(土) 14:43:09.48ID:q5Ls+EKq
>>848
余裕でOK
0850デフォルトの名無しさん2015/03/28(土) 14:47:04.72ID:eRZ9PNxr
>>849 UserForm2.Show ですね。 先にぐぐればよかったです・・・。
0851デフォルトの名無しさん2015/03/28(土) 17:15:43.62ID:7VDzjQQn
こんにちは
今日のテーマは1です
注意点は画面下へ書かれています。
それではどうぞ

こんにちは
今日のテーマは2です
注意点は画面下へ書かれています。
それではどうぞ

こんにちは
今日のテーマは3です
注意点は画面下へ書かれています。
それではどうぞ





こんにちは
今日のテーマは100です
注意点は画面下へ書かれています。
それではどうぞ


↑このような改行入りのテキストデーターの
文中の数字の所(1箇所)のみを
1ずつ増やし連続で100まで並べ最終的には
テキストで書き出しをする場合は
どのようにコードを書けばいいのでしょうか?
0852デフォルトの名無しさん2015/03/28(土) 17:53:11.39ID:QAYs++Hi
>>851
Sub Sample()
Dim i As Integer
For i = 1 To 100
MsgBox "今日のテーマは" & i & "です"
Next i
End Sub
0853デフォルトの名無しさん2015/03/28(土) 17:54:55.57ID:WTSMqzUy
>>851
1から100までループ
テキストを連結して作成
ファイルに書き出し

するコードを書けば良い
どこがわからない?
08548512015/03/28(土) 20:53:34.13ID:C5M2xat5
>>852
>>853
単数行なら>>852このコードがイメージできますが
今まで数字しか扱ったことがなかったため複数行の文字はどう処理すればいいのかイメージできませんでした
マクロ記録でやると
ActiveCell.FormulaR1C1 = "あああ"
Range("B4").Select
ActiveCell.FormulaR1C1 = "いいい"
Range("B5").Select

こう出てきましたのでこれを使って
A列に1行づつ書けば良いようですね解決できました
端的に述べると疑問点は、改行ってどうやるんだ?という話でしたw
ありがとうございました。
08558512015/03/28(土) 21:15:58.73ID:pZxnIH6J
>>851
>>852
>>853

全く糞な質問でしたが
文字情報の部分書き換えや置換を使うと
番号をふった整理券のような物の自動作成や
HTMLにすればホームページを配列を使ってあれこれできたり
相当色々な事に応用できますね。
VBAの世界が大きく広がりました。
0856デフォルトの名無しさん2015/03/29(日) 07:38:26.59ID:fP4a+V4v
Excel 2010で配列をセルに挿入しようとするんだけど上手くいかない。
Webにある解説を見ると、

Dim c(10) as Variant
For i = 0 To 10
c(i) = i
Next i

Cells(1,1).Resize(,UBound(c)+1) = c

という様な書き方で挿入できてるけど、実際にやってみると何故か出来ない。
しかし、

挿入範囲 = Cells(1,1).Resize(,UBound(c)+1)

For i = 0 to 10
挿入範囲(1,i+1) = c(i)
Next

Cells(1,1).Resize(,UBound(c)+1) = 挿入範囲

だとちゃんと挿入される。やり方が間違ってるのか仕様が変わったのか。
0857デフォルトの名無しさん2015/03/29(日) 15:27:14.77ID:mlKmLH/z
>>856が本当だとすると、1次元の配列の代入出来なくなった可能性があるんだが
ちょっとその仕様変更は信じられん
だれか検証してくれ
0858デフォルトの名無しさん2015/03/29(日) 16:21:54.86ID:MTuE08iQ
Excel2010だが

Cells(1,1).Resize(,10).Value=Array(1,2,3,4,5,6,7,8,9,10)

とやって問題なく代入できたぞ。
0859デフォルトの名無しさん2015/03/29(日) 19:00:05.38ID:mlKmLH/z
>>858
.Value 省略しても行ける?
だったら>>856の勘違いで大丈夫そうだけど
0860デフォルトの名無しさん2015/03/29(日) 19:27:35.74ID:HON2ESKs
>>856
単に「できない」じゃなくて
どんなエラーが出るのか、どこで止まるのか、具体的に書いてよ。

俺はExcel2000しか持ってないから検証はできないけど。
ちなみに2000ではそのコードで問題なく動く。
0861デフォルトの名無しさん2015/03/29(日) 19:44:22.48ID:wGTdxmyj
>どんなエラーが出るのか、どこで止まるのか、具体的に書いてよ


なんでみんなこれをしないのかね。こういうのをテンプレに入れとくべきだと思うんだがなぁ。
まぁ入れても見ないだろうけどw
0862デフォルトの名無しさん2015/03/29(日) 20:41:26.34ID:HON2ESKs
テンプレ強制は無意味というか有害なのでマジでやめて
0863デフォルトの名無しさん2015/03/29(日) 20:58:36.11ID:/K2gs69F
Win7 Excel2010です。

UserForm1のCommandButton1_Click()では、
変数Aを定義し、変数Aに値を格納し、UserForm1を閉じ、別のUserForm2を開く処理が記述されています。
UserForm2のCommandButton2をクリックしたときに、変数Aを利用した処理を行いたいと考えています。

UserForm2に変数Aを渡す方法をご教示いただけないでしょうか?
0864デフォルトの名無しさん2015/03/29(日) 21:18:52.44ID:WnJdNlgU
>>863
そのまま書いていけるんじゃない?
UserForm1のCommandButton1_Click()
の中にuserform2.showで変数は渡せない?

間違っていたらすみません
0865デフォルトの名無しさん2015/03/29(日) 21:26:52.85ID:MTuE08iQ
>>859
Cells(1,1).Resize(,10).Value=Array(1,2,3,4,5,6,7,8,9,10)
Cells(2,1).Resize(,10)=Array(1,2,3,4,5,6,7,8,9,10)
どちらも同じ結果。
0866デフォルトの名無しさん2015/03/29(日) 22:30:06.69ID:mlKmLH/z
>>863
インスタンスとか考えるとややこしいんだが、とりあえず
UserForm1にPublicで宣言して、UserForm2でUserForm1.Aで参照すれば行けるんじゃね
UserForm1をUnloadすると変数消えるかもしれんが、そのばあいはUnloadじゃなくてHideで

UserForm1にPublicな変数定義するより、UserForm2か標準モジュールあたりに定義した方が良いかもしれん


>>865
ありがと。じゃあ>>856の勘違いって事でよさそうだ
0867デフォルトの名無しさん2015/03/29(日) 22:56:32.06ID:HON2ESKs
>>863
一番簡単なのはグローバル変数を使う方法だと思うけど、変数のスコープはできる限り狭いほうが望ましいからこの方法はあまりオススメしない。

そんでさ、そもそもの前提を覆しちゃうんだけど、フォーム内で変数って使う必要ある?
フォームモジュールってのは結局、人間からの入力を受け付けたり結果を出力したりするためのものだよね?
そのためにテキストボックスとかスピンボタンとか、文字や数値を取得するための手段が用意されてるわけでしょ?
それをわざわざ変数に格納しないでそのまま他のモジュールとやり取りすれば良いんじゃないか?

たとえば
UserForm1にTextBox1とCommandButton1が有って、CommandButton1をクリックするとTextBox1に入力された値を
UserForm2のLabel1に表示するっていうコードを書くとこんな感じ

標準モジュール(シートモジュールやブックモジュールでも構わんけど)には以下のコード

Sub test
Userform1.Show
End Sub

UserForm1モジュールにはTextBox1とCommandButton1を用意しておく
コードは以下の物のみ

Private Sub CommandButton1_Click()
With UserForm2
 .Label1 = TextBox1
 .Show
End With
Unload Me
End Sub

UserForm2モジュールにはLabel1を用意しておく
コードは特に無し
08688632015/03/30(月) 01:15:08.95ID:ge81N56G
>>864
すみません。「そのまま書いていけるんじゃない?」の意味がわかりません。

>>866
解決できない場合には標準モジュールにPublicとして宣言してみます。
インスタンスとか今のところ理解できていませんので、
あなたのレスの大半が理解できず申し訳ありません。

>>867
UserForm1のTextBox1の値を
UserForm2に渡す場合でしたら貼り付けて頂いたコードで可能と思います。

ですが、後出しで申し訳ないのですが、
UserForm1からUserForm2に渡したい変数Aというのはジャグ配列です。
A (1 to N) (1 to 5) : Nは可変で10〜40ぐらいです。

配列を渡したい場合はPublicで宣言するしかないでしょうか?
0869デフォルトの名無しさん2015/03/30(月) 06:26:45.49ID:FGaX9eOv
>>868
何でPublicで宣言してはいけないのかをよく考えなければいけない。
変数を直接外部参照されたくないと言うのなら、Publicなプロパティを設定して維持する値をPrivateに指定すればいい。
そしてUserForm2は使うとき、明示的に生成して、使わなくなったら明示的に解放する。
生成するときに直接生成するのではなく、一つ関数を作ってその中で生成とプロパティへの値の受け渡しを行う。
VBAではコンストラクタに引数を渡すことが出来ないので、そのようにしてフォームからフォームへの値の引継ぎを行う。
08708672015/03/30(月) 06:50:14.17ID:hZPESK0V
>>868
>配列を渡したい場合はPublicで宣言するしかないでしょうか?

んなこたないけど、まぁそれが一番お手軽っちゃお手軽だろうね。
ただ、何度も言うけどPublic(グローバル変数)ってのはあんまり使いたくはないし、結局はフォーム内でややこしい変数使うような設計自体が間違ってるんだと思う。
もちろんひとつのフォーム内で処理を完結できるならそういうことやっても良いんだけど、複数のフォームを遷移して処理を引き継ぐようなら個別のフォーム内でそんなにややこしい事をさせるべきではない(と個人的に思う)。
せめて大元の処理(ジャグ配列を必要とする部分)は標準モジュールに書いておいて、そこから必要に応じて個々のフォームに値を引き渡し、フォームでの入出力を終えたら標準モジュールに値を戻す。
別のフォームに対してもその繰り返し、というパターンで作っといたほうが後々のメンテナンス性とかも高いんじゃないかな?
イメージとしてはこんな感じ(ジャグ配列の書き方が良く分らんからとりあえず普通の配列で書いときます)
改行多いんで続きます……
08718672015/03/30(月) 06:52:38.23ID:hZPESK0V
>>870の続きです

Sub Test()
Dim i
Dim A(1 To 2)
With UserForm1
.Show 'ユーザーフォーム1で値を取得後、Hideで戻ってくる
'フォーム内の値を配列変数に格納
For i = 1 To 2
 A(i) = .Controls("TextBox" & i)
Next i
End With
Unload UserForm1
With UserForm2
'配列変数の値をユーザーフォーム2に渡す
For i = 1 To 2
 .Controls("Label" & i) = A(i)
Next i
.Show ’ユーザーフォーム2で表示
End With
Unload UserForm2
End Sub

UserForm1にはフォーム閉じる用のボタンを用意しとく
Private Sub CommandButton1_Click()
Me.Hide
End Sub
0872デフォルトの名無しさん2015/03/30(月) 08:30:29.30ID:FGaX9eOv
>>870
なんかさー、処理と値をごっちゃに考えてない?
今回の論点はフォームの値引継ぎな訳であって、ややこしいのどうのは関係ないと思う。
引き継がれた値を使用する側のFormはその下にどんな複雑な処理有ろうが、サービス層が有ろうが
ビジネスロジック層が有ろうが関係ない。それは値を受け取った側のフォームの役割だから。
その中で共通化するなら共通部品を呼び出してもいいけど、そこで値を抱えると言うのもまた役割が違う。
ましてや、標準モジュールでUserForm1がHideになった時ってのを見てるってことは、挙動にまで影響してるじゃない。UserForm1を表示したままUserForm2を表示したかったらどうするの?
それと、UserForm2のコントロールに値を設定するのは、
UserForm1の役割でも標準モジュールの役割でもないと思うんだけど。
クラス構成が理解出来ないと言うのであれば、まだ単純にUserForm2にプロパティ作って渡してやった方がマシ。
プロパティの作り方が分からないと言うのであれば、UserForm2に引き渡したい値を引数で受け取って、
それをモジュールレベルスコープの変数に格納する関数を作ればいいだけ。
難しく考え過ぎなんだよ。
0873デフォルトの名無しさん2015/03/30(月) 08:36:31.78ID:Z5CFiRUu
>>872
難しく考えすぎなのはお前だ

コントロール公開でも、プロパティでもいいけど
VBAのユーザーフォームにおいて、それらがパブリックフィールドに明確に勝る点を
初心者にちゃんと説明できるのか?
0874デフォルトの名無しさん2015/03/30(月) 09:24:51.84ID:IplvGFPT
>>873
悪いけど、それ以前の問題。

プロパティは、受け渡しされた値の格納や取得という明示的な役割を持っている。

コントロール公開?コントロールの役割はどう言うものか分かってる?

分かっているならUserForm2のコントロールがUserForm1や標準モジュールから設定されるのはおかしいってすぐ分かるよね。

もうちょっとその辺勉強した方がいいんじゃないかなぁ
0875デフォルトの名無しさん2015/03/30(月) 12:30:52.21ID:SwYqzZJt
すまんが、初心者のプログラマごっこはよそでやってくれ
0876デフォルトの名無しさん2015/03/30(月) 12:39:06.77ID:IplvGFPT
>>875
これはすまない。
初心者のプログラマごっこで言われてる内容が全く理解出来ないとみえる。
0877デフォルトの名無しさん2015/03/30(月) 12:46:52.73ID:SwYqzZJt
>>876
いや、ごっこなんだから理解してないのは構わんよ。
ただここはそれをする場所じゃない。わかるよな?
0878デフォルトの名無しさん2015/03/30(月) 12:49:22.49ID:IplvGFPT
>>877
なんだ、ごっこと言うのはレベルを指しているのではないのか。
では、そっちの言う「ごっこ」の定義とは何なんだ?
思い付きで言っただけか?
0879デフォルトの名無しさん2015/03/30(月) 14:03:10.68ID:+221ILPC
みなさんVBAですよ
0880デフォルトの名無しさん2015/03/30(月) 14:57:33.78ID:IplvGFPT
さっきからずっとVBAの話をしている訳だが
0881デフォルトの名無しさん2015/03/30(月) 15:17:52.64ID:p2qlM+du
>>874
> 分かっているならUserForm2のコントロールがUserForm1や標準モジュールから設定されるのはおかしいってすぐ分かるよね。
全然おかしくないよ。
おかしいというなら、UserForm1.TextBox1がpublicな言語仕様がおかしいということになる。
いちいちUserFform1に、getterとかsetterとかpropertyとかViewModel経由とかで実装するには、自己満足に近いね。
0882デフォルトの名無しさん2015/03/30(月) 15:48:08.95ID:IplvGFPT
>>881
使えるのと使わない方がいいのは訳がちがうよ。
そんなことを言うなら普通にUserForm2でパブリックな変数設定しちゃえばいいじゃん。
0883デフォルトの名無しさん2015/03/30(月) 15:51:55.24ID:GSYx+SCW
VBAでコーディングの講釈とか無意味だよね?(´・ω・`)
どうせVBA以外では使い様がない代物が出来上がるんだよね?(´・ω・`)
0884デフォルトの名無しさん2015/03/30(月) 17:04:18.16ID:rTvnLKvE
>>874
>UserForm2のコントロールがUserForm1や標準モジュールから設定されるのはおかしいってすぐ分かるよね。
>>867でそれを勧めたのはお前じゃないのか?別人ならまあコントロール公開はお前の中からは除いておいてくれ

で、VBAのユーザーフォームにおいて、プロパティがパブリックフィールドに明確に勝る点を説明できるの?
外部に公開する意志の無いフィールドなら、パブリックである必要はないわけだが
getterやsetterを経由出来るのは確かにメリットはあるが、初心者にとってそれをVBAで実装する手間暇に見合うと思うの?
今回の範囲において、パブリックフィールドを否定してプロパティを勧めるなんて、必要以上の手間暇かけさせるだけだと思うがな
0885デフォルトの名無しさん2015/03/30(月) 17:26:16.09ID:IplvGFPT
>>884
だからそれ以前の問題だと言ってるし、もっと言うと結合度の問題がデカい。
そんな作り方しちゃうと、後で手を入れるとき苦労することになる。
0886デフォルトの名無しさん2015/03/30(月) 17:50:37.13ID:p2qlM+du
>>882
> そんなことを言うなら普通にUserForm2でパブリックな変数設定しちゃえばいいじゃん。
だから、それが自己満足だって言ってるんだが。
パブリック変数を経由することに何の意味もないね。
パブリックなPropertyを経由するのも同じこと。意味が無い。
0887デフォルトの名無しさん2015/03/30(月) 17:55:44.32ID:p2qlM+du
>>885
> だからそれ以前の問題だと言ってるし、もっと言うと結合度の問題がデカい。
そういうことは、UserForm1のデータ入力先がUserForm2だけじゃなくなるときに考えればいい話。

> そんな作り方しちゃうと、後で手を入れるとき苦労することになる。
何か苦労するようなことあるか?
俺には想像もできないような苦労がきっとあるんだろうな。
0888デフォルトの名無しさん2015/03/30(月) 18:07:21.07ID:rTvnLKvE
>>885
それ以前の問題ね
初心者に考えさせといて、悩んだら難しく考えすぎって言われてるんだがな

まあ別に、間違った内容を言ってるとは思わんから好きにすれば良いけど
0889デフォルトの名無しさん2015/03/30(月) 20:52:57.55ID:x60hXgEg
VBAのプロシージャって呼び出す処理自体が重いから、
特に頻繁に投げ合うなら下手にプロシージャ通すより全部Publicで宣言して直に読ませた方がいいよなぁ。

そもそもローカル変数なんてあって無きが如しのVBAでスコープ範囲とか考えるだけバカみたいだし、
変数の目的が重複しない一連のプロシージャ同士でモジュールレベルに宣言された変数を共有し、
共有しあった同士のモジュールが互いに別のモジュールのPublic変数を読みに行く方がVBA的には理に適ってる。

だいたいDLLで読み込む関数を変えられるわけでもないから別々のモジュールの入出力をプロパティ名で統一する意味も無いし、
どうせ手で直すんだから依存度が高かろうが、その旨をコメントにでもして分かりやすくしておけば実用上は問題ない。

そしてオフィシャルで用意された関数使うより、同じ機能を持つ関数を自分で組んだ方がだいたいの場合、処理が速いというオマケ付き。
他の言語の常識が通用しないVBA恐ろしすぎ。
0890デフォルトの名無しさん2015/03/30(月) 20:58:04.55ID:IplvGFPT
>>886
1人でただ動くだけのツールでも作ればいい人の発想だな。
UserForm2で表示する文字や配列の加工をUserForm1でやるってか。
引き継いだ人は大迷惑だな。

>>887
結合度の話はもっとクラスを理解したときに出てくる。クラスを生成して同じメソッドや
プロパティ名でそのクラスの役割に合わせた別の振る舞いを行うと言ってピンと来なければまだ早い。分かった時に後で
苦労するなら今の内にちょこっとした作りでそれを回避出来るならしておけばいいと言う話。
取り敢えずその時のためにプロパティで設定しておけばいい。

>>888
そこまで深く掘り下げたのは、初心者ではなく教えてる側がイケてないコードをドヤ顔で晒し出したから。
まだ違うフォームからフォームのコントロールを弄ることに全く違和感すら感じてないみたいだし。
0891デフォルトの名無しさん2015/03/30(月) 21:26:33.17ID:wOaPArz5
VBAでやることじゃないな
0892デフォルトの名無しさん2015/03/30(月) 21:27:03.16ID:/a2cNIAv
人が作った1万行もあるModule1を改修した時思い出した
殆どの変数がpublicで泣きそうになったな

ありえんぐらい長いサブプロシージャ
何がしたいのか、何が返ってくるのかわからない関数
意味が分からないコメント

読みやすいコードは、たとえVBAでも、将来の自分の為にしっかり書こうと思った瞬間だったな
0893デフォルトの名無しさん2015/03/30(月) 21:31:31.32ID:SH4IOcCA
まだやってんのか。動けばいいんだよ、VBAなんて。
コードオナニーしたいやつはマ板にいけ。
0894デフォルトの名無しさん2015/03/30(月) 21:40:28.10ID:Qy+ezY+G
>>892
1から作り直せよんなもんwww
0895デフォルトの名無しさん2015/03/30(月) 21:44:38.71ID:/a2cNIAv
>>894
いや無理無理、時間も限られてるし
一から作るほど暇じゃないわw
0896デフォルトの名無しさん2015/03/30(月) 22:05:12.15ID:F/o+TWVm
質問させて下さい。

2つのブックのランキングデータを比較しアップダウンを表示するVBAを作ろうと思っています。
「最新ブック」は最新のランキングで「過去ブック」は過去のランキングです。
双方共にTOP100のデータがあります。
「最新ブック」には新しくランキングINしたものがあり逆にランク外になったものもあります。
夫々のブックはその時の上から順位順にA列に順位が記載 B列に商品名が記載されています。

「最新ブック」のB列の商品名を「過去ブック」にあるか参照して
もし「過去ブック」にデータがあるなら「最新ブック」のC列にどれだけ順位が上がったかもしくは下がったかの数値を記入したいです。
もしランク外になったのなら「OUT」・新しくランクインした物は「NEW」とC列に記載したいです。

両ブックの同じ行に同じ商品名が記載されていれば比較が簡単なのですが順位が入れ替わるので
同じ行を参照しC列に数値をだせないので困っています。

どの関数をどのように使えばいいのでしょうか?

アドバイスをお願い致します。
0897デフォルトの名無しさん2015/03/30(月) 22:38:18.25ID:idTw5koc
負の遺産処理か、大変だなあ。
と、思いながら動けばいいコードを書いている自分がいる。
0898デフォルトの名無しさん2015/03/30(月) 22:44:29.33ID:wOaPArz5
VBAのプログラムなんて仕事で使うとしても個人のものであって、引き継ぎなんてものが発生している時点で間違ってるんだよ。
0899デフォルトの名無しさん2015/03/30(月) 23:45:01.75ID:IplvGFPT
>>893
コードオナニーってのは自分以外はどうでもいいや的なもんだと思う。
0900デフォルトの名無しさん2015/03/31(火) 00:03:45.46ID:Q3Hv60nc
>>889
何か凄いな。1度作ったコード見せて欲しいわ。

俺はコメント入れるけど、何をやっているかのコメントは極力書かなくてもいいように作る・・・努力はしている。

出来ればそれはヘッダコメントだけにとどめておきたい。大体コード見れば何をやってるか分かるし。

どっちかと言えば何をやってるかより、何のためにやってるかの方が情報として欲しいから、
作ってて忘れない内にそっちのコメントを残すようにしてる。特にDBからSQLで値を取って来たり取ってきた値を
加工しているところ辺り。
0901デフォルトの名無しさん2015/03/31(火) 00:06:44.03ID:P6CDl22r
>>896
俺なら重複データとランキングの順位を比べるかな?
もちろんナポリタンコードで。
0902デフォルトの名無しさん2015/03/31(火) 04:26:44.84ID:eM9+JYzu
>>900
いや、VBAの仕様というか、「あっちの方が処理が速い、こっちの方が処理が遅い」というのを調べた結果から、
理に適った作り方というのを語っただけで実際にやってるわけじゃないよ。一連の流れで他の言語の話を持ってきてたからVBA独自の環境について話しただけ。

他の言語を知っていると可能な限り独立性の高いモジュールを作りたくなるけど、
だからといって初心者に強要するようなものではないし、VBAの環境に限っては間違っていると言いたいだけ。
0903デフォルトの名無しさん2015/03/31(火) 04:44:07.20ID:eM9+JYzu
>>896
関数だけでやるならVLookUpかMatchかな。ランクの上下を監視するならD:E列も使わないとやってられないと思うけど。

For Each c in Range(過去ブック.Cells(1,1),過去ブック.Cells(10,1))
 最新ランク = 最新ブック.Find(d.Value)
 If Not 最新ランク Is Nothing Then k = 最新ランク.Row

 If k then
   If k = c.Row Then
     最新ブック.Cells(k,3) = "→"
   Else If k > c.Row Then
     If k > 10 Then
       最新ブック.Cells(k,3) = "OUT"
     Else
       最新ブック.Cells(k,3) = "↓"
     End If
   Else If k < c.Row Then
     最新ブック.Cells(k,3) = "↑"
   End If
 End If
Next

For Each c in Range(最新ブック.Cells(1,3),最新ブック.Cells(10,3))
 If c.Value = "" Then c.Value = "NEW"
Next

というVBA的な解決の仕方もあるけど。
0904デフォルトの名無しさん2015/03/31(火) 04:57:16.70ID:eM9+JYzu
修正

誤:最新ランク = 最新ブック.Find(d.Value)
正:最新ランク = 最新ブック.Find(c.Value)
0905デフォルトの名無しさん2015/03/31(火) 05:50:10.24ID:eM9+JYzu
そしてこうでよかった事に気づく。

For Each 過去ランク in Range(過去ブック.Cells(1,1),過去ブック.Cells(10,1))
 Set 最新ランク = 最新ブック.Find(過去ランク.Value)

 If Not 最新ランク Is Nothing then

   If 最新ランク.Row = 過去ランク.Row Then
     最新ランク.Offset(0,2) = "→"

   Else If 最新ランク.Row > 過去ランク.Row Then

     If 最新ランク.Row > 10 Then
       最新ランク.Offset(0,2) = "OUT"
     Else
       最新ランク.Offset(0,2) = "↓"
     End If

   Else If 最新ランク.Row < 過去ランク.Row Then
     最新ランク.Offset(0,2) = "↑"

   End If
 End If
Next

For Each c in Range(最新ブック.Cells(1,3),最新ブック.Cells(10,3))
 If c.Value = "" Then c.Value = "NEW"
Next
0906デフォルトの名無しさん2015/03/31(火) 07:42:55.85ID:s6+ygsCh
dim 行数,i,j as integer

for i = 1 to 100
行数=worksheetfunction.iferror(worksheetfunction.match(最新ブック.cells(i,1),過去ブック.range(”a1:a100”),0),””)
if 行数〈〉”” then
最新ブック.cells(i,3)=最新ブック.cells(i,1)−過去ブック.cells(行数1,1)
else
最新ブック.cells(i,3)=”out”
endif
next

for j =1 to 100
if cells(i,3)=”” then
cells(i,3)=”out”
endif
next

これで回るかな。実験してません、、
0907デフォルトの名無しさん2015/03/31(火) 07:58:12.15ID:s6+ygsCh
後半修正です。
for j =1 to 100
if 最新ブック.cells(i,3)=”” then
最新ブック.cells(i,3)=”new”
endif
next
0908デフォルトの名無しさん2015/03/31(火) 08:39:18.75ID:ouUOmgwb
>>905
取り敢えず仕様を無視するのをやめようよ。

何で100件のデータがあると言ってるのに10件のデータしか見ないの?

何で順位がどれだけ上下したかの数値を出したいと言ってるのに矢印なの?

商品名を当てるんじゃなくて順位をFindの対象に当てるの? 多分、どれも順位上下無しで終わっちゃうよ。

商品名をFindの対象にしたとして、Find先のシートは一覧外にも同じ値が設定されてたら拾っちゃうけどいいの?
0909デフォルトの名無しさん2015/03/31(火) 08:40:14.56ID:gG6nRdzp
以前、なにかデータの集まりを操作するコードをつくるとき
いつもDictionaryをすすめてくるDictionary厨のかたがいらっしゃったが
このDictionaryって便利だな。

配列とかCollectionとかもう不要だ。
0910デフォルトの名無しさん2015/03/31(火) 08:42:10.48ID:Q3Hv60nc
何かまだ色々直してるね。
直し終わった後にあげたら?
0911デフォルトの名無しさん2015/03/31(火) 08:43:38.46ID:Q3Hv60nc
>>909
ディクショナリは便利だけど、参照設定しないといけない。
場合によっては面倒くさいよ。
0912デフォルトの名無しさん2015/03/31(火) 08:48:21.92ID:gG6nRdzp
>>911
あれれ?
ということは参照設定すればもっと便利に使えるということですね?
どこにチェックすればいいか教えてもらえませか?
0913デフォルトの名無しさん2015/03/31(火) 09:20:06.06ID:KDX/jTC0
WIN8 EXCEL13の環境で 突然
path1 = ThisWorkbook.Path や
ThisWorkbook.Save で
オートメーションエラーが出るようになってしまったんですけど
原因に心当たりある方いますか?
昨日まで普通に動いてたんですが。
直接、値を与えると普通に動きます
0914デフォルトの名無しさん2015/03/31(火) 09:58:01.20ID:z9RWcobv
>>872
話題を蒸し返すようで申し訳ないですけど
フォームと変数をやり取りときには結局どうすりゃいいんですか?
VBAしか知らないので他の言語の話とか
抽象的な概念の話をされても分からないです。
できれば具体的なサンプルコードとか出してください。
0915デフォルトの名無しさん2015/03/31(火) 10:25:46.23ID:855buxIJ
>>890
> UserForm2で表示する文字や配列の加工をUserForm1でやるってか。
UserForm2が単なるViewで、そこに表示するデータを別Classで実装する場合も、UserForm2-UserForm1と
同じ関係なんだが、それでもそんなこと言うの?

> >>887
> 結合度の話はもっとクラスを理解したときに出てくる。
UserFormもクラスなんですが。

> プロパティ名でそのクラスの役割に合わせた別の振る舞いを行うと言ってピンと来なければまだ早い。
そもそもUserForm内にビジネスロジックを実装するのが筋が悪い。
UserForm2になんらかのロジックがある場合、UnitTestはどうやるんだ?

> 苦労するなら今の内にちょこっとした作りでそれを回避出来るならしておけばいいと言う話。
何度も言うが、getter/setter/propertyを通しても、それは直接Controlの値を読み書きするのと変わらない。

> まだ違うフォームからフォームのコントロールを弄ることに全く違和感すら感じてないみたいだし。
「違うフォームからフォームのコントロールを弄ること」ができるのがVBA(VB)のメリットなのに。
0916デフォルトの名無しさん2015/03/31(火) 10:35:40.93ID:855buxIJ
>>911
CreateObjectすれば良いよ。
ただ、インテリセンスが効かないが。
0917デフォルトの名無しさん2015/03/31(火) 11:46:57.62ID:z7dmzx2W
ディクショナリとか汎用性あるのかねえ?
VBAのようなオーバーロードもテンプレートもない言語だと、配列との使い分けで悩ましいしな。
0918デフォルトの名無しさん2015/03/31(火) 12:51:00.68ID:vWx1RFOR
ディクショナリと配列で悩むとかなんか勘違いしてるとしか思えない
話は違うが WSH のディクショナリは値として文字列しか扱えないのがすごく残念
バリアントにしといてくれれば..
0919デフォルトの名無しさん2015/03/31(火) 12:55:13.55ID:Q3Hv60nc
>>915

えー、まだやるの?

>UserForm2が単なるViewで、そこに表示するデータを別Classで実装する場合も、UserForm2-UserForm1と
>同じ関係なんだが、それでもそんなこと言うの?

当たり前でしょ。フォームである限りいつどんな仕様変更が入るか分からないし、上司に後々Viewでしか使わないと確約でも取らない限り、そんな作りは使えない。

>UserFormもクラスなんですが。

それも当たり前の話。要するにフォームもクラスとしての視点で理解していない。

>そもそもUserForm内にビジネスロジックを実装するのが筋が悪い。

誰がUserForm内に直接ビジネスロジックを書くって言ったよ。曲解も甚だしいなぁ。

>UserForm2になんらかのロジックがある場合、UnitTestはどうやるんだ?

言ってる意味が分からない。何でUserForm2に何らかのロジックが有ったら単体テストに戸惑うの?

>何度も言うが、getter/setter/propertyを通しても、それは直接Controlの値を読み書きするのと変わらない。

そんなこと言ってるから>>781みたいにUserForm1を閉じないとUserForm2が開けないような制約の付いたへんてこりんなコード組んじゃうんじゃない。懲りないねぇ。

>「違うフォームからフォームのコントロールを弄ること」ができるのがVBA(VB)のメリットなのに。

別に.Netでもフォームから別のフォームを弄ることは出来るよ。役割が違うことをみんな理解してるからやらないだけ。
だからVB6とかシステムを扱うくらいの大きさなら、よほどゆるいところで無い限り、
詳細設計の時点でつっかえされると思うよ。
0920デフォルトの名無しさん2015/03/31(火) 13:00:21.60ID:Q3Hv60nc
>>781じゃなくて>>871か。済まんね。
0921デフォルトの名無しさん2015/03/31(火) 13:28:03.63ID:855buxIJ
>>919
> 誰がUserForm内に直接ビジネスロジックを書くって言ったよ。曲解も甚だしいなぁ。
> > プロパティ名でそのクラスの役割に合わせた別の振る舞いを行う
これは、Propertyのメソッドの中で、なんらかのビジネスロジックを定義するということじゃないのか?
単にprivateな変数に値を代入・参照するだけなら、public変数となんら変わりはない。

> 言ってる意味が分からない。何でUserForm2に何らかのロジックが有ったら単体テストに戸惑うの?
「単体テスト」じゃなくて、UnitTest。テストコードを使った自動テスト。
画面にロジックが合ったらUnitTestしづらくなるのは、どんな言語でも一緒。

まあ、お前が言わんとしてることはわからんでもないが、どんな場合にもその設計思想を適応しろというのは
あまりに硬直した考えすぎる。

そもそもVBAはExcelの機能を操作するのが目的で、ThisWorkbook以下、全てのExcelオブジェクトは
UserForm1が必要なデータをUserForm2を開いて入力したい、というのが元々の要求で、素早く実装できる
方法をとっても全然かまわないと思うがね。
0922デフォルトの名無しさん2015/03/31(火) 13:29:37.91ID:855buxIJ
>>921
>そもそもVBAはExcelの機能を操作するのが目的で、ThisWorkbook以下、全てのExcelオブジェクトは
消しそびれた文章が残ってた。
無視してくれ。
0923デフォルトの名無しさん2015/03/31(火) 13:31:15.90ID:iH7+3M/J
フォーム使いたきゃ、Accessでやれ 糞が
0924デフォルトの名無しさん2015/03/31(火) 13:37:18.20ID:855buxIJ
VBAは(多分VB6もそうだったと思うんだが、記憶が定かでは無い)、規定のインスタンスという仕組みがあって、
例えばUserForm2にTextBox1があり、UserForm1でその初期値を設定してからUserForm2を開くとき、
UserForm1:
Sub foo()
  UserForm2.TextBox1.Text = "hoge"
  UserForm2.Show
End Sub
これだけでいい。
(UserForm2の入力結果をUserForm1に戻す必要がある場合は、もう少しコードが必要だが。)

こんなにシンプルに書けるのに、余計な仕組みをかます必要がある?
0925デフォルトの名無しさん2015/03/31(火) 14:03:26.80ID:z7dmzx2W
>>918
配列の各要素にある処理を適用する関数があって、それのディクショナリ版も欲しくなったときに同じ名前を付けたいじゃないか。generate とか。
09269142015/03/31(火) 14:12:55.54ID:z9RWcobv
>>915>>919
分かってる人同士で完結しないで、初心者向けの>>914の質問にもお答えお願いします。

できたら>>872の人が言ってるやり方が具体的にどういうものなのか理解したいです。

あの文章では知らない言葉が多くて意味が分からないのですが、
実際にコードを見れば多少は理解できると思うのです。

書かれたコードが結果として良いのか悪いのかはともかく、
>>871みたいにサンプルコードを書いてくれたら
何をしてるのかが実際に試せるので初心者でも分りやすいのです。
0927デフォルトの名無しさん2015/03/31(火) 14:22:33.35ID:koel4+b2
それはよくないね?(´・ω・`)
VBAというのは初心者が気軽に使っていいものじゃないよ?(´・ω・`)
ありとあらゆるコンピュータ・プログラミングに精通し、やりつくしたマスタークラスの
人間にしかVBAを使う事は許されていないんだよ?(´・ω・`)
でないと、悲劇が起こる、というか起こってきた悲惨な歴史があるからね?(´・ω・`)
0928デフォルトの名無しさん2015/03/31(火) 14:35:23.66ID:iH7+3M/J
>>927
消えろ小僧
0929デフォルトの名無しさん2015/03/31(火) 14:48:30.53ID:855buxIJ
>>926
>>872でいいよ。
別のやりかたとして、UserFormをNewする方法もある。
このやり方だと、UserFrom2を閉じても(HideじゃなくUnload)、form変数を通してUserForm2が持っている情報にアクセスできる。

Sub foo()
 dim form as New UserForm2
 form.GlobalVarialble = 100;
 form.TextBox1.Text = "hoge"
 form.Show
 ' From2でGlobalVariableの値を変えたり、TextBox1の内容を変えたり
 Debug.Print form.GlobalVarialble
 Debug.Print form.TextBox1.Text
End Sub

ごちゃごちゃやってたのは、Global変数使うなPropertyにしろ的なことや、UserForm外部からControl触るな的な話。
0930デフォルトの名無しさん2015/03/31(火) 16:23:34.63ID:FJ2GPSZa
>>926
あの文章で解らない単語が出てるようでは、コードをみても多分理解できないと思う
コードをみて、何をやってるかは多分理解できるだろうけど
なぜそういうやり方をするのかはおそらくコードからは読み取れない

設計方法の問題で、初心者にプロの開発と同等な設計を求めるか
そこまでしなくても良いかで戦ってるやつらがいるだけだから
09319142015/03/31(火) 17:15:58.53ID:z9RWcobv
>>929
ありがとうございます。
要するに>>871のやり方でも構わないというご意見なのですよね?
あれは読んで理解できたので別のやり方も知りたいのです。

>>930
とりあえず、学んでみない事には始まらないので是非サンプルお願いします。

もちろん、文章で書かれていても構わないのですけれど
ここまで読んだ限りでは貴方の文章は初心者向けでは無いというか
初心者向きの文章を書くお積りが無さそうなので
コードのほうがまだ勉強になると思います。

少なくとも、フォームとほかのモジュールの間で変数の受け渡しをする手法
を知る事は、その手法を選択する意図を知らなくても
コードを書く際の選択肢を増やすという意味で役には立つと考えています。

(結合度云々といった概念はうっすら分ってるつもりです。
そしておそらくその辺りを問題にしてらっしゃるように思いました。)
0932デフォルトの名無しさん2015/03/31(火) 17:28:45.16ID:855buxIJ
初心者に優しい俺ですら腹立ってきたぞ。
0933デフォルトの名無しさん2015/03/31(火) 17:29:08.84ID:i/Y8nWi2
初心者に理解してもらえる文章を書くには、
相当な実力を必要とするからねー
0934デフォルトの名無しさん2015/03/31(火) 17:34:53.58ID:FJ2GPSZa
>>931
>初心者向きの文章を書くお積りが無さそうなので
ああ、正解だw

本気で学ぶ気があるなら、VBAにこだわらない一般的な設計方法を学ぶべきで
そのうえでVBA独自の事情を考慮できるようになるべきだと思う
ある程度の規模のプログラムを数多くこなさないと実感としてその設計の意義を感じられないだろうし
設計方法はこのスレの範疇を超えた話だと思う

>その手法を選択する意図を知らなくても コードを書く際の選択肢を増やす
じゃあ、ああしろこうしろはいっぱい言われてただろ
>>871ができたのなら、次はフォームのパブリック変数かモジュールのパブリック変数でやってみたら?
次はフォームのプロパティでやってみる
で、それぞれの方法でどこが良くて何が悪いか考えてみ
まあ、VBAは特殊事情が多すぎて、その辺考えるのに向いた言語じゃないんだがな
0935デフォルトの名無しさん2015/03/31(火) 17:38:28.66ID:855buxIJ
>>933
> 初心者に理解してもらえる文章を書くには、
> 相当な実力を必要とするからねー
まさに、その通りなんだが、
> 初心者向きの文章を書くお積りが無さそうなので
とか言われるとね−。(俺が言われたわけじゃないが)
0936デフォルトの名無しさん2015/03/31(火) 17:54:31.02ID:FJ2GPSZa
>>935
初心者に超優しい俺はこの程度では腹は立たないw

まあ俺には簡潔に説明できる実力もないけど
さすがにスレの守備範囲ってのがあるだろうと思ってる
09379142015/03/31(火) 18:13:03.66ID:z9RWcobv
>>932-933
出来る出来ないの問題ではなく
やりたくないとかやるつもりがないとかの次元だと思うので
お願いした所でそこのところをどうこうできるものでもないのだろうと考えただけです。

>>934
>じゃあ、ああしろこうしろはいっぱい言われてただろ
>>>871ができたのなら、次はフォームのパブリック変数かモジュールのパブリック変数でやってみたら?

すみません、職業プログラマやってるわけじゃないので、
誰かにああしろこうしろ言われたこともなければ
他の言語はもちろんVBAもちゃんと学んだ事はありません。
本を2冊ぐらいとあとはOffice田中さんとかネット検索で調べた範囲で分かる事程度です。

自分の仕事の手作業を多少減らせる程度の事しかやりませんし
フォーム自体さほど使いません。

フォームをあまり使ってないので変数の受け渡しもそれほど気にしないのですが
仮にやるならグローバル変数使ってました。初心者なら普通はそうすると思います。

ただ、出来ないことが出来るようになるのは単純に楽しいですし、
どうせやるなら効率的な方法がよろしかろう程度の認識です。

>>935
そういうわけなので他意はないです。
ご気分を害されたのならごめんなさい。
0938デフォルトの名無しさん2015/03/31(火) 19:17:39.00ID:vWx1RFOR
なんだかんだ言ってもこの板でコード出せずにウダウダ言ってるだけの奴はスルーした方がいい
0939デフォルトの名無しさん2015/03/31(火) 19:20:18.77ID:vWx1RFOR
>>925
> 配列の各要素にある処理を適用する関数があって、それのディクショナリ版も欲しくなったときに同じ名前を付けたいじゃないか。

それを使い分けとか言わないだろ...
0940デフォルトの名無しさん2015/03/31(火) 19:43:00.28ID:z7dmzx2W
>>939
配列とディクショナリそれ自体はトレードオフで比較されるだろうけど、配列をターゲットにした既存のライブラリがあってそれを使うと楽できる、という状況があるとする。
ここからディクショナリもターゲットにするよう、ライブラリを拡張すればいいんだけど、それはしんどいからすぐにはできない。
使い分けに悩むことになる。
それなのに>>909
「配列とかCollectionとかもう不要だ。」とか言うからカチンと来る。
0941デフォルトの名無しさん2015/03/31(火) 19:55:45.48ID:z7dmzx2W
ちょっと補足するが、配列でもディクショナリでも後続処理を同じインタフェースでできる言語なら、悩まずに済むことがあるんだよ。
配列だったものをディクショナリに変えたり、やっぱり戻したり、が気にせずできるから。
VBAだとそれは難しいんじゃないか?
0942デフォルトの名無しさん2015/03/31(火) 20:16:07.88ID:vWx1RFOR
ムキになってレアケース出されても...
0943デフォルトの名無しさん2015/03/31(火) 20:19:11.33ID:eM9+JYzu
>>937
基本的にVBAのモジュールは内部のプロシージャが何処かに呼び出されている間しかPublicな変数をメモリに保持しない。
変数はメモリに保持されている間しか値の出し入れを受け付けてくれないので、
特定のモジュールに書かれた変数を使用したければ何でもいいからモジュール内のプロシージャを呼び出す必要がある。
そしてユーザーフォームはロードしてる間、もしくは表示している間はプロシージャが呼び出されっぱなしという扱いになる。

従ってユーザーフォーム(以下、UF)に変数をぶち込むには、

・メモリにロードしてからUF側の変数に値を入れる。(例:Load Userform1という命令がある。)
・表示させてからUF側の変数に値を入れる。(例:Userform1.Show Showの中にはLoad命令が入ってる)
・UF側に書いたPublicなプロシージャに引数を渡して、そのプロシージャが終わる前にLoadかShowさせる。
・UF側に書いたPublicなプロシージャから呼び出し元のモジュールのPublicな変数を読んでもらい、UF側のプロシージャが終わる前にLoadかShowさせる。

という方法が考えられる。Newについては俺はやった事無いので知らない。

効率的な(すなわち処理速度の速い)方法については、イミディエイトウィンドウを表示してDebug.Print CDbl(Timer)と実行するプロシージャのどっかに書くと時間が表示されるので、
他のプロシージャを呼び出す前後なんかに書き込んで比較するなどして自分でコード書いて実験してみてほしい。
自分で実験しないなら出来る出来ないの問題ではなく、やりたくないとかやるつもりがないとかの次元の話だから。
0944デフォルトの名無しさん2015/03/31(火) 20:23:29.01ID:z7dmzx2W
>>942
レアケースと捉えるか、設計上の要点と捉えるかは、あんたの勝手だがね。
0945デフォルトの名無しさん2015/03/31(火) 20:45:57.63ID:jLTlCPq6
初心者ですが、メモリに入れるとか難しすぎるので、エクセルのシートのA1セルに
書き込んで値を保持しておくとじゃダメ?
それだとセルA1の値を取ってこいとか、かなり楽になります。
どんな値が入っているかも見れますし・・、初心者には分かりやすいです。
0946デフォルトの名無しさん2015/03/31(火) 20:49:37.69ID:jxVHEXHO
何のためのイミディエイトウィンドウだか
VBAのセル操作は遅いよ
0947デフォルトの名無しさん2015/03/31(火) 20:57:38.92ID:ZKbW1T33
>>944
はいはい、なんか触れちゃいけないところに触れちゃったみたいだな w
0948デフォルトの名無しさん2015/03/31(火) 21:01:05.15ID:eM9+JYzu
初心者なら速度よりも分かりやすさだろ。

余分なワークシートを常に一枚保持できるならA列をキー、B列を値として役割を分けて、
値を保存する時はA列をキーワードで検索してヒットしなかったら新しい行に書き、ヒットしたらB列に上書きする。
値を持ち出す時はA列でヒットしなかった時、独特な値(B列に絶対保存しない様な値)を返すっていう仕組みを作ると後々知識的な意味で役に立つ。

ついでにコードを書く画面でシートを選択した時、プロパティにあるオブジェクト名を、たとえば"保存用"に変更すると保存用.Cells...などと直接アクセス出来るので便利。
0949デフォルトの名無しさん2015/03/31(火) 21:42:14.92ID:FJ2GPSZa
>>937
>誰かにああしろこうしろ言われたこともなければ
いや、このスレでいっぱい、その方法はどうのこうの言われてただろ
極端に間違った事を言ってる人はいないから、いろいろ自分で試せばいいさ
その理由が理解できなくても、今はそういう方法があるとだけ思っておけばいいんじゃね

>ただ、出来ないことが出来るようになるのは単純に楽しいですし、
極端に言えば、出来ない事が出来る用にはならん
出来る事をやる方法のバリエーションが増えるだけだ

>どうせやるなら効率的な方法がよろしかろう程度の認識です。
効率とは、何の効率?
単純なプログラム作成や、実行時のパフォーマンスで考えると
効率が下がるようなことを良しと主張してる人もいるぞ
そう言う人は、将来の変更に対応する効率を重視してる。いわゆる保守性ってやつね

向上心は悪い事ではないけど、まあ、この件でこれ以上のレスはそろそろやめにするわ
0950デフォルトの名無しさん2015/03/31(火) 21:47:54.66ID:Q3Hv60nc
>>921

>>921
>これは、Propertyのメソッドの中で、なんらかのビジネスロジックを定義するということじゃないのか?

>単にprivateな変数に値を代入・参照するだけなら、public変数となんら変わりはない。
Propertyのメソッドの中って何?大丈夫?
まあビジネスロジックにPropertyで受け取った値を直接、加工、値を基にして
他の値を取得したりしてそれらをまたビジネスロジックのプロパティに渡すことはある。
ビジネスロジック自体は当然別クラスでUserFormの中で生成されたり、使用されることもあるよ。
>画面にロジックが合ったらUnitTestしづらくなるのは、どんな言語でも一緒。

NUnitやJUnitみたいなもんでしょ。何を使ってるのか知らないけど、
単体テストって言うのはそう言うのも引っくるめて言うんだよ。
実際、.Net系はコードエディタ側に「単体テスト」タブが有って、「単体テストの設定」から行うことが出来る。
画面テストが難しいからこそ、値取得や加工するところのロジックを絡めないで、
後は値が設定されているところを確認すればいいところまで持ってけばいいじゃん。
そんなUserForm1側でちまちまロジック絡めて設定してどうすんのさ。

>まあ、お前が言わんとしてることはわからんでもないが、どんな場合にもその設計思想を適応しろというのは
>あまりに硬直した考えすぎる。
はいはい。だからクラス構成や役割もおざなりにすると。構造化言語なのにねぇ。
そう言えば前Goto文を使うのは極力避けた方がいいと言ったとき
頑なに否定してた人がいたな。何か同じニオイがする。
0951デフォルトの名無しさん2015/03/31(火) 22:09:04.49ID:Q3Hv60nc
>>926
そうだなぁ、例えばUserForm1から値を直接UserForm2に設定したとしましょう。
そこに仕様追加がやって来て、UserForm3が追加されました。
これは、UserForm1とUserForm2の値を受け取って、その値を使ってDBからデータを取得して、表示します。
ついでに同じ条件でDBから値を読み直す更新ボタンも付いていたとしましょう。
さて、UserForm3のコントロールに値を設定するのは、UserForm1、2、3に点在するのと、UserForm3に処理を
固めてしまうのと、どちらの作りの方が仕様追加対応が楽でしょう。

とでも言えば取り敢えず何で直接別画面のコントローラー に値を設定しちゃいけないか分かってくれるかなぁ。
0952デフォルトの名無しさん2015/03/31(火) 22:13:06.11ID:HkMdwPkF
continueに代わるGoto文はどうしても書いてしまう
条件1が負の場合、条件2が負の場合、条件3が正の場合みたいに…
やっぱりダメなんかね
0953デフォルトの名無しさん2015/03/31(火) 22:15:32.33ID:Q3Hv60nc
コードは書きたいけど、仕事の合間に喫煙所でiPhoneからレス付けてるんでちょっと厳しいなぁ。
合間をぬって家でやるしかないか。
0954デフォルトの名無しさん2015/03/31(火) 22:18:24.59ID:Q3Hv60nc
>>952
VB6やVBAにはContinueの概念が無いからね。気持ちは分かる。
0955デフォルトの名無しさん2015/03/31(火) 22:27:05.57ID:z7dmzx2W
>>952
いいんじゃね
0956デフォルトの名無しさん2015/03/31(火) 22:36:03.29ID:FJ2GPSZa
>>952
適切なgoto文によるメリット
馬鹿なgoto文によるデメリット
goto文禁止するデメリット

これらを総合的に判断すると、on error以外のgoto文全面禁止という結論は妥当な落とし所だとおもう
0957デフォルトの名無しさん2015/03/31(火) 22:38:22.72ID:5HeyB+AP
>>952
goto文は使い方を間違えなければ、使ってもよい。
0958デフォルトの名無しさん2015/03/31(火) 22:40:39.16ID:Q3Hv60nc
>>924
.Netで途中から復活して「負の遺産がまた増えた」と騒がれてたアレでしょ?

.Netの話で悪いけど、厳しいところでは極力フォームの暗黙のインスタンスや標準モジュールは使わないで、
シングルトンパターンのクラスを明示的に作るようにコーディングルールで定めているところもあるよ。

まぁ、そこまで厳密にはVBAではやることないし、多分出来ないけど。
それはObject指向の範囲だから、頭の片隅にでもとどめて置けばいいけど、
別のフォームからコントロールにってのは構造化の範疇だから少なくとも俺はやらないし、
そんなコード引き継ぎで渡されたら絶対ブーたれる。
0959デフォルトの名無しさん2015/03/31(火) 22:45:32.17ID:UgHipcgW
見る人が「ああこのパターンね」と思える定番のgotoは問題ないな。
0960デフォルトの名無しさん2015/03/31(火) 22:47:53.77ID:Q3Hv60nc
>>956
>>957
今は全くその通りだと思う。
ただし、スパゲティソースの温床であることも確かだから、
コーディングルールで使うシュチュエーションを制限することが必須になるかな。
0961デフォルトの名無しさん2015/03/31(火) 22:55:49.36ID:UgHipcgW
コーディングルールでプロシージャ(関数)の長さ制限あるとしたら、だいたい何行くらいがアウトなんだろう。
0962デフォルトの名無しさん2015/03/31(火) 22:59:24.26ID:Q3Hv60nc
>>961
ていうか数行に渡るほどの長さの感数名ってどんなときに必要なの?
0963デフォルトの名無しさん2015/03/31(火) 23:01:44.25ID:UgHipcgW
>>962
えっ
関数の行数だよ?
0964デフォルトの名無しさん2015/03/31(火) 23:06:41.28ID:Q3Hv60nc
>>963
ああ、文字列数のことね。ごめん、ちょっと考えれば分かることだったな。
Javaとかだと制限見たことないけど、VBAはどうだろう。
取り敢えず、分かり易さ優先だと思うから、そう言った意味で完結に何やってるか分かり易い名前ならいいんじゃないかなぁ。
0965デフォルトの名無しさん2015/03/31(火) 23:09:03.37ID:z7dmzx2W
ところでVBAって変数の後ろにアンスコ二つ以上付けてx__とかしてもいいけどアンスコ始まりはダメなんだな。
_1を使いたかったのに。
09668962015/03/31(火) 23:11:19.74ID:TUZDQGkb
>>905
凄くいいお手本ありがとうございます。

Rowで過去の順位を引き出すようになんとか作って見たいと思います。
VBAは勉強したてて検索しながら参考にしてちょこちょこっとした物しか作ってませんが
パターン的な物を覚えながら複雑な物も作れるように覚えて行きたいと思います。
ありがとうございました。
0967デフォルトの名無しさん2015/03/31(火) 23:18:54.22ID:UgHipcgW
最近書いた関数で長いのは46行あった。
反省はしてるけど、短くするのエネルギーがいるんだよね・・・
0968デフォルトの名無しさん2015/03/31(火) 23:21:41.94ID:Q3Hv60nc
>>965
同意。よくVB.Netやってる合間にVBAやるとそれで「あ」ってなる。
0969デフォルトの名無しさん2015/03/31(火) 23:26:14.39ID:Q3Hv60nc
>>963
再度すまない。関数名じゃなくて関数そのものだったのね。
凄く適当だけど、自分の中では余程特殊な場合を覗いて2画面に表示されるくらい。
その辺規定がある仕事場もあるけど、結構マチマチ。
0970デフォルトの名無しさん2015/04/01(水) 05:58:20.41ID:23d2B5Z/
エクセルVBAはエクセルの操作を補助するためにあるのであって資産として引き継ぐの自体おかしい。
拡張性とか保守性とかいう言葉が見えた気がするけどよほど単純な働きのマクロ以外は新しいケースに合わせて一から作り直すべきだし
継続的に引き継ぐような重要なのならVBAで作るべきじゃない。
0971デフォルトの名無しさん2015/04/01(水) 06:25:01.54ID:by1Nk6ea
じゃあ何かあるたび1から作り直せばいいよ。俺は嫌だけど。
0972デフォルトの名無しさん2015/04/01(水) 07:02:55.80ID:by1Nk6ea
>>970
まぁ何の根拠もない持論なら俺も展開させて頂くと、VBAの資産引継ぎが無ければとっくに.Net化してるか無くなってるか。

VBAの今までの資産があるから.Net化出来ないとか、今のMicroSoftの考え方では
そんなもん無くして外部から弄れよ的な方向になってるとか風の噂でよく聞く。

まぁそうなったらそうなったで、その対応の仕事が増えるし、VBAしか出来ない人が淘汰された分の仕事が増えるから
俺個人としては寧ろありがたいけど。
0973デフォルトの名無しさん2015/04/01(水) 07:04:32.12ID:IqBtbgK/
個人限りで使え、って意味だよ。
つまり他人に引き継ぐなってこと。

もともとマイクロソフトがそう言ってることだし、OFFICE TANAKAとかでもトップページにそうただし書きがかいてある。
0974デフォルトの名無しさん2015/04/01(水) 07:22:57.72ID:by1Nk6ea
OfficeTANAKAのトップページってここだど思うんだけど、どこに書いてある?
それともページが違う?

http://officetanaka.net
0975デフォルトの名無しさん2015/04/01(水) 07:27:41.62ID:E9lgPX7z
>>914
http://officetanaka.net/excel/vba/tips/tips113.htm

ここの理屈馬鹿の連中に聞くより、ググったほうが為になりますよ。
ハッキリ言って使えないクズしかいませんから。

質問者そっちのけで、馬鹿なコーディング論争してる しかも、エクセル
程度のものでそんな事に時間費やしてるカスは相手にする価値もあり
ません。

投稿時間見てりゃわかるでしょw
0976デフォルトの名無しさん2015/04/01(水) 07:28:13.75ID:E9lgPX7z
>>973
いいから失せろww

おまえらカスの下らない議論は他でやれよ。ザコ。
0977デフォルトの名無しさん2015/04/01(水) 07:39:11.55ID:by1Nk6ea
>>975
OFFICE TANAKAは相変わらず初心者に優しいな。
俺もよくお世話になってる。
0978デフォルトの名無しさん2015/04/01(水) 07:42:31.36ID:E9lgPX7z
>>977
わかりやすく完結で、散々お世話になった。
0979デフォルトの名無しさん2015/04/01(水) 08:24:29.04ID:oQJvnQwQ
ちゃんと作ればVBAでも充分に引き継ぎ対象のモノができるよ。
小さい会社ならなおさら。
0980デフォルトの名無しさん2015/04/01(水) 08:33:56.77ID:by1Nk6ea
>>973の言うとおりなら会社では使いものにならないね。
会社だったら人の入れ替わりなんていくらでもあるだろうから。
0981デフォルトの名無しさん2015/04/01(水) 09:04:00.22ID:/egDYYol
エイプリルフールネタはさておき、>>973は個人のツールとして使えと言ってるだけで、仕事で使えないとは言ってない。
0982デフォルトの名無しさん2015/04/01(水) 09:38:14.80ID:NnPClKRj
うめ
0983デフォルトの名無しさん2015/04/01(水) 09:46:35.15ID:by1Nk6ea
はい、埋め
0984デフォルトの名無しさん2015/04/01(水) 10:28:52.49ID:MxSupW0l
>>950
> まあビジネスロジックにPropertyで受け取った値を直接、加工、値を基にして
> 他の値を取得したりしてそれらをまたビジネスロジックのプロパティに渡すことはある。
というコードをテストするには、画面クラスを通す必要がある。

> 画面テストが難しいからこそ、値取得や加工するところのロジックを絡めないで
厳密に言えば、今回の話は、画面クラスにビジネスロジックがあったときに、それをテストするときの話で、
何が問題かというと、画面構築コストが高い場合があるということ。
ビジネスロジックが通常Class内にあれば、100個のテストが100msで終わるのに、画面クラス内にあるが
ためにテスト実行に毎回画面構築コストのオーバーヘッドがかかり、100個のテストに5000msかかるように
なったりする。
1回のテストに100msしかかからないのならば頻繁にテストを実行するだろうが、5000msかかるとなると
テスト実行を躊躇することになり、あちこち変更してテストしたらいろんなところでTest Failになってた
みたいなことが起こりがち。

> 頑なに否定してた人がいたな。何か同じニオイがする。
俺からすれば、お前は、Gotoは適切に使えばいいよねという中で、「いや絶対Goto禁止」と叫んでる奴に見えるな。
0985デフォルトの名無しさん2015/04/01(水) 10:30:12.48ID:MxSupW0l
>>958
> 別のフォームからコントロールにってのは構造化の範疇だから少なくとも俺はやらないし、
でも、標準モジュールからWorksheetオブジェクトにはアクセスするでしょ?
それも駄目なの?
0986デフォルトの名無しさん2015/04/01(水) 10:32:46.20ID:VV7GjGd7
次スレはここ↓でいいのか?
テンプレが無いようだが。
違っていたなら誘導よろ。

Excel VBA 質問スレ Part37 [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1420841190/
0987デフォルトの名無しさん2015/04/01(水) 10:52:51.79ID:E9lgPX7z
>>984
>>985
消えろ。邪魔だ。
0988デフォルトの名無しさん2015/04/01(水) 10:53:35.08ID:E9lgPX7z
>>986
くだらねぇコーディング議論するマヌケは、マ板に引きこもってろっていうテンプレ
追加しておいてくれ。

実に目障りだ。
0989デフォルトの名無しさん2015/04/01(水) 12:35:23.29ID:/egDYYol
ユーザ目線かプログラマ目線か
0990デフォルトの名無しさん2015/04/01(水) 19:05:13.07ID:by1Nk6ea
>>984
何を言ってるのか分からないけど、ビジネスロジックってフォーム内に組むもんなの?

俺の知ってるのと違うな。
0991デフォルトの名無しさん2015/04/01(水) 19:09:42.12ID:by1Nk6ea
>>986
その辺の話さわるとまた違う意味の基地外が出てくるから黙ってそこ使っておけばいいと思うよ
0992デフォルトの名無しさん2015/04/01(水) 19:10:31.36ID:+PU+R+SL
>>990
>>991
いつまで、くだらない論説繰り返すわけ?三流プログラマさん
0993デフォルトの名無しさん2015/04/01(水) 19:12:31.91ID:by1Nk6ea
>>992
え?
0994デフォルトの名無しさん2015/04/01(水) 19:14:23.69ID:by1Nk6ea
なんか勘違いしてる人がいるみたいだから埋めとくか

埋め
0995デフォルトの名無しさん2015/04/01(水) 19:14:30.60ID:+PU+R+SL
>>993
え じゃねぇよ。
ここは質問板だ。お前のくだらない論説はマ板に言ってやれって言ってんだよ。
0996デフォルトの名無しさん2015/04/01(水) 19:16:20.23ID:by1Nk6ea
>>995
よくわからないけど、何とたたかってるのかな(*^^*)
0997デフォルトの名無しさん2015/04/01(水) 19:34:33.95ID:/egDYYol
不明埋め
0998デフォルトの名無しさん2015/04/01(水) 19:37:48.83ID:by1Nk6ea
マ板マ板叫んでる奴は狂犬病埋め
0999デフォルトの名無しさん2015/04/01(水) 19:42:19.04ID:23d2B5Z/
>>972
他の言語が出来る人なら当然気がつくだろうけどVBAのは機能がとても制限されてる。
そしてその制限された部分から保守性や拡張性を考えていない設計である事も当然理解できる。
もちろん保守性や拡張性を出来るだけ高めたのを作る事は出来るけどVBAのは向いてない。
保守や拡張を念頭に入れたものを作るならVBAなんてオモチャを選択しない方がいいという話をしたんだけど
1000デフォルトの名無しさん2015/04/01(水) 19:43:59.85ID:fYspEhnu
ume
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。