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

Excel VBA 質問スレ Part34

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2014/06/28(土) 08:24:45.78ID:CYmFK5pL
ExcelのVBAに関する質問スレです

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

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

コードが嫌な人はこちらのスレへ
http://toro.2ch.net/test/read.cgi/tech/1381151995/l50

※前スレ
Excel VBA 質問スレ Part33
http://peace.2ch.net/test/read.cgi/tech/1382015080/
0002デフォルトの名無しさん2014/06/28(土) 18:38:16.95ID:EodHiYJU
 
★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)
 
0003デフォルトの名無しさん2014/06/28(土) 19:16:33.29ID:vnVg5isx
>>2のテンプレは嘘です
誰かがマイルールで勝手に作って貼っているだけなので無視して下さい
0004デフォルトの名無しさん2014/06/28(土) 19:45:39.65ID:CYmFK5pL
>>2
>>1をよく読め。
そしてお前はまずPart32を埋めてこい。
0005デフォルトの名無しさん2014/06/28(土) 21:05:43.43ID:x8pWVUAe
まぁ、自助努力を惜しまない人のほうが回答を貰い易いってのは確かだし、
>>2の中でも

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

だけはやってくれた方が回答する側もやりやすい。
だけど他は無視して良いよ。

質問者の態度が気に食わないとかの理由で答えたくないヤツは
回答せずにスルーすれば良いんだから。
答えたいヤツが答えることまで個人的ルールを盾にして禁じるなんてのは
余計なお世話だ。
0006桃白白 ◆9Jro6YFwm650 2014/06/29(日) 08:43:58.59ID:brJxynPM
前スレの1000とったの誰?なに書いてんの、桃白白鼻水でたよ
0007デフォルトの名無しさん2014/06/29(日) 20:09:04.86ID:vHu5Qjdi
>>3-4
必死すぎw
0008デフォルトの名無しさん2014/06/29(日) 20:16:11.68ID:0+H85njY
>>7
むしろ>>2が必死すぎ
こっちのスレがウザイテンプレ抜きにして上手くいってんのが
よほど悔しいとみえる
0009デフォルトの名無しさん2014/06/30(月) 08:52:19.10ID:1+6mRIRO
1+1の結果はドキュメントに明示されてない(保証されてない)から、いつ仕様が変わるかわからない
処理系によっても異なるので、思い込みバグの元になる

試行錯誤で裏技テクニックを発見するのはいいけど、そういうのは大々的に使うべきじゃない
この危険性が理解できない人は、それこそプログラミングに向いてない
0010デフォルトの名無しさん2014/06/30(月) 12:35:31.49ID:sL6k3OgI
質問なんだけど

>1+1の結果はドキュメントに明示されてない(保証されてない)から

2にならないことがあるって事?
0011デフォルトの名無しさん2014/06/30(月) 12:47:45.34ID:DNhhFBBa
プログラミングは算数が通用しない世界だからな
0.1を10回足しても1にならないとか、初心者は必ず混乱する
0012デフォルトの名無しさん2014/06/30(月) 13:22:45.22ID:f17tdAtr
>>10

>>9が書いてるのは隔離スレPart32での1000のパロディー
0013デフォルトの名無しさん2014/06/30(月) 17:12:05.56ID:0nWL9M6a
あ
0014デフォルトの名無しさん2014/07/01(火) 05:56:47.96ID:mubpqKNe
>>12
パロディーではあるが、歴とした>>9自身の主張でもある
パロディー風に書けば、間違った事書いても、指摘や反論は免れるなんて決まりは無いからね

コピペや引用なんかでもそうだが、何かを投稿するってことは、その内容を最初に考えたのが投稿者じゃなくても
その内容に同調や同意しているってことになるから、その内容は投稿者の意見や主張でもあるってことになるので
コピペだから、パロだからといって、指摘や反論を小馬鹿にしたり躱そうとするするのは、
本人なら卑劣な逃げ、他人なら的外れな茶々ってことになる

まあ、元から破綻した内容を楽しむネタコピペを改変したものなら、破綻を指摘されても
「これは元から破綻っぷりを楽しむものですから」って言い分はありかもしれないけど、>>9の元はまともな内容なので、
パロディー化して破綻した内容になったなら、その破綻はパロディー元ではなく>>9主張が間違ってることに起因するからね
0015デフォルトの名無しさん2014/07/01(火) 07:39:47.71ID:/AUZGirl
>>14

元ネタがまともだと思ってる時点でお察しですな。
あれは、それだけを読めば特に間違ってはいないんだけど、
話の流れからいったらバカ丸出しの発言だったんよ。
(論点がずれてた)
0016デフォルトの名無しさん2014/07/01(火) 12:54:50.64ID:Na3PDdXv
ずれてないと思うけど
0017デフォルトの名無しさん2014/07/01(火) 13:22:24.29ID:rAfyooRv
異論はあるだろうけど
隔離スレの話題をあんま引っ張るのもどうかと

同じスレタイトルで こっちが本スレで
あっちが隔離スレって言われるてるか考えるともうね

あっちでやって て感じだよ
0018デフォルトの名無しさん2014/07/01(火) 21:16:33.87ID:aaK0kqTr
最近勉強をはじめた初心者です。質問させてください。

Aの列に様々な桁の数字が並んでいます
その数字の中で8桁の数字だけ下3桁の数値にしたいのです。
そしてその列のセルの値が何も無くなった時に止めるようにしたいのですが・・・

この場合どのようにすればいいでしょうか?

Do〜Loop で条件を「○桁の時に」とすると桁が変わってループが止まるので困っています

windows7でEXCEL2003です。
0019デフォルトの名無しさん2014/07/01(火) 21:27:08.30ID:aaK0kqTr
>>8
すみません「○桁の時に」  = 「8桁の時に」

です。
0020デフォルトの名無しさん2014/07/01(火) 21:31:44.24ID:c88Zrj/0
A
1
123
1234
…
12345678←これを678にする
空白
↑こういうこと?
DO
0021デフォルトの名無しさん2014/07/01(火) 21:33:46.75ID:c88Zrj/0
>>20
すまん途中で書きこんじゃった
A
1
123
1234
…
12345678←これを678にする
空白
↑こういうこと?
俺も覚えた手だけど、DO〜LOOPってDO Whileみたいな仕様なら
実行後に判定するからループ止まるんじゃないの?
FOR文で回してIF で桁数変更したほうがいいんじゃない?
0022デフォルトの名無しさん2014/07/01(火) 21:56:11.46ID:/AUZGirl
>>18
そのブックのシート1(シートタブが一番左のシート)で
A列を上から順番に調べて、「セルの値が数値」で、かつ「長さが8桁」のときに
そのセルの値を1000で割った余り(つまり下3桁)をそのセルに書き込む
条件に合わなければその行をスルー
次の行へ、
セルが空白だったら終了
という動作をするマクロ
ただし、全ての数字が整数である前提で組んでますので、
小数が混じってると上手く動作しません

Sub test()
Dim rw As Long
With ThisWorkbook.Sheets(1)
 rw = 1
 Do
  If .Cells(rw, 1) = "" Then Exit Do
  If IsNumeric(.Cells(rw, 1)) Then
   If Len(.Cells(rw, 1)) = 8 Then
    .Cells(rw, 1) = .Cells(rw, 1) Mod 1000
   End If
  End If
  rw = rw + 1
 Loop
End With
End Sub
0023デフォルトの名無しさん2014/07/01(火) 22:25:24.05ID:Jua//xVo
色を指定するとき
vbRedやvbBlueの他にも
たくさんの定数があったように思いますが
それらはどう記述しますか?

オレンジ色、紫色、ゴールド、ぐんじょう色などなど、かなりあったように記憶しているのですが。
0024デフォルトの名無しさん2014/07/01(火) 22:32:10.01ID:Jua//xVo
わかったよ。
みなにも情報を共有しとくよ。
オレンジならrgbOrangeみたいにrgb+色の英単語でok

大人気のわたしのホームページは
http://msdn.microsoft.com/ja-jp/library/office/ff197459(v=office.15).aspx
0025182014/07/01(火) 22:50:38.16ID:aaK0kqTr
>>21
レスありがとうございます。

そう書いた方が判り易かったですね。
ずばりそういうことです。

私もIFでやってみました。
LenとRightを使用し条件と処理をさせて
ループをForで以下のようにしました。

For i = 1 To 100

If Cells(i, 1) = "" Then
i = 100

一応動作してますけどこのような止め方でいいのでしょうか?
0026デフォルトの名無しさん2014/07/01(火) 22:53:28.97ID:/AUZGirl
>>25
それでもいいですけど、
For Nextループから抜け出すなら

If Cells(i, 1) = "" Then Exit For

が一般的だと思いますよ
0027デフォルトの名無しさん2014/07/01(火) 22:54:11.72ID:CqL4nbrB
>>25
だめ
方法はいろいろあるけど、適切な例の一つ

r = 1
Do While Cells(r, 1) <> ""
  3桁化の処理
  r = r +1
Loop
0028182014/07/01(火) 22:59:58.38ID:aaK0kqTr
>>22
なるほど
そういう書き方があるんですね。
勉強になります。

基本的な事しか判らないのでこんな方法で表現できるのにびっくりです。
もっと勉強しようと思いますありがとうございます。
0029デフォルトの名無しさん2014/07/01(火) 23:07:55.67ID:aaK0kqTr
>>26
>>27

なるほど。そうやって止めるのが正解なんですね。
経験が無く応用も効かないので判らないでいました。
さっそく使わせて頂きます。
ありがとうございました。
0030デフォルトの名無しさん2014/07/02(水) 02:41:17.64ID:Dxc+vPNX
ブックイベントに関して教えて下さいです

(Excel2000 以上で動作してほしい)
(Excel2000 ないから Excel97 でトライ中)


 Private WithEvents App As Application

 Private Sub App_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)
   ・・・・・・
 End Sub
とかで
他ブックのイベントを拾う事ができますが
BeforeCloseではなく他ブックが完全に閉じた事をイベントで拾う事はできないでしょうか?


自分自身を参照設定してるブックが無くなったらCLOSEしたいのです。
(ホンネは
 参照設定してるブックが開いたら自動オープンするんだから
 参照設定してるブックが閉じたら閉じてほしい所)


BeforeCloseでそれをやると
「現在このブックは他のブックから参照されているため,閉じることはできません。」
まあ当然ですが
0031302014/07/02(水) 04:27:10.80ID:Dxc+vPNX
えっと 一応 自己解決かな

参照設定される側でなんとかしようと
自分でも色々ぐぐってたけど 無理そうなんで

アプローチ変えて 参照設定する側で対策する方向で 今実験してるけど
オープン時に 参照設定追加して クローズ時に設定解除するようにする事で
解決しそうです。


なので 質問取り下げます  お騒がせしました ごめんなさい
003261=622014/07/02(水) 04:47:33.48ID:Dxc+vPNX
>>62
名前欄間違えてた ゴメンなさい
0033デフォルトの名無しさん2014/07/02(水) 07:15:03.96ID:SuduICFH
>>15
恥ずかしすぎw
0034桃白白 ◆9Jro6YFwm650 2014/07/02(水) 07:17:18.36ID:TNx19tqM
         ____
       /⌒  ⌒\
      /( ●)  (●)\
    / ::::⌒(__人__)⌒:::: \
    |     |r┬-|     |
    \      `ー'´     /
      >         <
     ( |        / )
      `|       /'
         |   r  /
       ヽ  ヽ/
        >__ノ;:::......
0035定期統計資料2014/07/02(水) 07:50:39.40ID:DiScokhV
http://20m.ziploader.net/dl.phpx?id=ziploader2479
★zipファイルの「阪神京阪無」ディレクトリ以下
「平成26年4月」の数値未発表で一部合計値比較不可能の為
 平成26年3月〜平成13年4月は以下路線の各駅を合計・増減から除外して再計算。
 「京阪」─「本線」「中之島線」
 「阪神」─「本線」「なんば線」
★zipファイルの「阪神京阪有」ディレクトリ以下
 除外せず、「平成26年4月」の未発表数値を前年同月と同一と仮定

※「Hnn(年度)」…平成(nn-1)年4月〜平成nn年3月
※「中之島」「渡辺橋」「大江橋」「なにわ橋」…「H21」10月の[総数]は日割り(13/31日) 。
※「大阪難波」「桜川」「ドーム前」「九条」…「H21」3月の[総数]は日割り(12/31日) 。
※「総数」…「H18」の7月以降及び年度平均はOTS線を除いた数値となっている。

平成24年4月〜平成26年4月
http://www.city.osaka.lg.jp/toshikeikaku/page/0000020916.html
[2014年6月30日]
http://www.city.osaka.lg.jp/toshikeikaku/cmsfiles/contents/0000020/20916/6-2.xls

平成25年3月〜平成13年4月
http://www.city.osaka.lg.jp/toshikeikaku/page/0000164566.html
[2014年5月27日]
http://www.city.osaka.lg.jp/toshikeikaku/cmsfiles/contents/0000164/164566/12-6.xls
0036桃白白 ◆9Jro6YFwm650 2014/07/02(水) 21:39:14.83ID:TNx19tqM
>>35
(; ・`д・´) な、なるほどね(思考停止)
0037デフォルトの名無しさん2014/07/03(木) 02:43:32.81ID:M35dK7YS
名前付き前方参照の \k< name > の、

 k

って、なぜ k なんでしょうか?(何かの頭文字?)
気になって夜も眠れません。
0038デフォルトの名無しさん2014/07/03(木) 03:47:36.59ID:liGccDS8
>>37
\g の g もなぜだろうねー?て思うけど
スレ違いなので合わせて正規表現スレで聞いてきてくれ
0039デフォルトの名無しさん2014/07/03(木) 08:14:27.30ID:wxwXyXef
ExcelのVBAからOutlookを操作してメールの下書きを作ったあと
またExcelのWindowのほうにactiveをうつしたいんだけど、どうする?
0040デフォルトの名無しさん2014/07/03(木) 09:43:11.60ID:ZDqPh3/H
どうしよっか、飲みに行こっか
0041デフォルトの名無しさん2014/07/03(木) 10:13:46.13ID:wxwXyXef
飲みには問題が解決してから行こうよ
0042デフォルトの名無しさん2014/07/03(木) 11:36:53.35ID:nnmK9CiW
桃白白くんは未成年なんだからアルコールは飲んじゃだめだよ
0043桃白白 ◆9Jro6YFwm650 2014/07/03(木) 19:49:32.03ID:gqLdubbD
>>42
(´・∀・)ノ ぁぃ
0044デフォルトの名無しさん2014/07/03(木) 20:30:19.77ID:erpxq4bc
>>41
大丈夫だよ、問題ないよ
0045デフォルトの名無しさん2014/07/03(木) 20:58:53.30ID:qSEJiQtR
やりたいことをそのままコードで書けば良いだけだもんな
何の問題もないし、呑みに行こうぜ
0046デフォルトの名無しさん2014/07/03(木) 22:59:34.20ID:rdvQkZpj
Workbooks.Open Range("A1").Value &amp; ".xls"
Sheets("sheet1").PrintOut Copies:=Range("A2").Value

これを使って.xlsの代わりにpdfを印刷したいのですがどうすればいいですか?
0047デフォルトの名無しさん2014/07/03(木) 23:54:41.78ID:sKt0Rrir
>>46
そのコードのままデフォルトプリンタをPDF仮想プリンタにする
0048デフォルトの名無しさん2014/07/04(金) 00:05:58.80ID:/0RQ9iAJ
Excelのシートに貼りついてるチェックボックスとかラジオボタンを操作するにはどうすればいいですか?
0049デフォルトの名無しさん2014/07/04(金) 00:25:03.37ID:PB6bDjd0
>>48
http://www.happy2-island.com/excelsmile/smile03/capter00716.shtml
0050デフォルトの名無しさん2014/07/04(金) 20:39:30.74ID:rrkT7maN
Property getの存在意義が分かりません。
普通にfunctionで戻り値返せばいいじゃん。
0051デフォルトの名無しさん2014/07/04(金) 20:50:26.54ID:FK82BIfr
>>50
まぁね。確かJavaとかはそんなじゃなかったっけ?
だけどプロパティとメソッドを明確化出来るからいいんじゃないの?
0052デフォルトの名無しさん2014/07/04(金) 21:22:10.52ID:RpeAMBuD
>>50
Property Let
Property Get
これで同じ プロシージャ名を使えます。
つまり
値 取得専用 とか
設定時と取得で別処理させるとか
できるのですよ

ヘルプより
>通常、Property プロシージャは 2 つ 1 組で使います。
>この組み合わせは、Property Let プロシージャと Property Get プロシージャ、
>または Property Set プロシージャと Property Get プロシージャのいずれかです。
>Property Get プロシージャだけを宣言した場合は、値の取得のみ可能なプロパティが作成されます。
0053デフォルトの名無しさん2014/07/04(金) 21:39:03.62ID:FK82BIfr
>>52
それって別にFunctionでも出来るでしょ?
0054デフォルトの名無しさん2014/07/04(金) 21:47:17.08ID:RpeAMBuD
>>53
こういう事できたっけ?

Dim Data As Long

Property Let TEST_Property(arg)
 Data = arg
End Property
Property Get TEST_Property()
 TEST_Property = Data & "/"
End Property


Sub TEST()
 '値設定
 TEST_Property = 7

 '値読み出し
 Debug.Print TEST_Property

End Sub
0055デフォルトの名無しさん2014/07/04(金) 23:25:57.31ID:RpeAMBuD
まあ普通クラスモジュールとかで
メソッドと 一緒に プロパティとして
オブジェクトに組み込んで使う事が多いと思うんで
使う必要のある 局面は少ないとは思う
0056デフォルトの名無しさん2014/07/05(土) 02:34:17.66ID:uNQKpKRE
オブジェクト.メソッド.メソッド
こういう書き方って出来ましたっけ?
0057デフォルトの名無しさん2014/07/05(土) 02:57:48.08ID:xSzrfFSo
出来るよ
最初のメソッドがオブジェクトを返せば
そのオブジェクトのメソッドが使える

こういう意味のない事も可能だったり(^^
Workbooks.Open("b:\book1.xls").Close
0058デフォルトの名無しさん2014/07/05(土) 04:35:55.69ID:uNQKpKRE
なるほど
オブジェクト以外だとエラーになるんですね
ありがとうございました
0059デフォルトの名無しさん2014/07/05(土) 07:59:47.17ID:DUAZ7FzQ
>>57
> こういう意味のない事も可能だったり(^^

ブックの存在確認とかかな

> Workbooks.Open("b:\book1.xls").Close

なんか久々に B ドライブって見たわ
0060デフォルトの名無しさん2014/07/05(土) 08:55:53.30ID:u2/EtCN+
FSO.FileExistsでええがな
0061デフォルトの名無しさん2014/07/05(土) 11:04:09.38ID:1SqY6dYc
なんで、worksheets("sheet1") とかってworksheetのメソッドの補完ウィンドウ出てこないの?

そのせいでわざわざsetして補完聞くようにしてるわ。
0062デフォルトの名無しさん2014/07/05(土) 11:15:29.62ID:DUAZ7FzQ
>>60
意味があるかどうかの話で、ペストかどうかは別の話
0063デフォルトの名無しさん2014/07/05(土) 12:25:02.96ID:ILQB+TND
スニペット
0064572014/07/05(土) 13:02:28.24ID:xSzrfFSo
>>58
微妙に誤解してるような してないような
書き方悪かったかな

>そのオブジェクトのメソッドが使える
を訂正して
>そのオブジェクトにメソッドがあれば 使える
とします。
オブジェクトっても色々あるわけで


>>59
そこにツッコミ入れますかw
0065デフォルトの名無しさん2014/07/05(土) 21:31:52.75ID:fgyLnXmf
Intel Xeon Phi(ファイ)
http://ja.wikipedia.org/wiki/Xeon_Phi
http://www.intel.co.jp/content/www/jp/ja/processors/xeon/xeon-phi-coprocessor.html
というXeon向けの60コアあるコプロセッサーボードがあると最近知ったのですが
これを使うとExcelの処理速度が超爆速になったりするのでしょうか?
0066デフォルトの名無しさん2014/07/05(土) 21:42:46.76ID:ILQB+TND
>>65
Excel単体では、それだけたくさんのコアで動作するように設計されていないので何も変わらない
裏で別のアプリが動作している時に影響が出ないってだけ
0067デフォルトの名無しさん2014/07/05(土) 22:18:09.55ID:DUAZ7FzQ
>>66
VBA はダメっぽいけど、Excel 自体はマルチスレッドに対応してるよ。
60 コアまで有効かどうかは知らんが。
0068デフォルトの名無しさん2014/07/05(土) 22:35:37.11ID:H4PfIfbh
http://www.penguincomputing.com/files/xeon_phi_starter_kit/xeon-phi_product-feature.png
Xeon Phi はCPUではなくてGPUのような演算ボードのようで
0069デフォルトの名無しさん2014/07/06(日) 07:34:38.77ID:WRsZVHJU
>>67
マジだった
でもセル選択からの書式設定で初回30秒待たされる方をどうにかして欲しい
0070デフォルトの名無しさん2014/07/06(日) 09:04:23.85ID:0QsWr+IB
>>69
> でもセル選択からの書式設定で初回30秒待たされる方をどうにかして欲しい

kwsk
0071デフォルトの名無しさん2014/07/06(日) 10:54:22.78ID:WRsZVHJU
>>70
セル選択で右クリックして書式選択すると初回のみダイアログ起動にやたら時間かかる
EXCELの遅延初期化とディスクキャッシュの問題かと
0072デフォルトの名無しさん2014/07/06(日) 11:04:08.29ID:0QsWr+IB
>>71
それ新規のシートでもなるんか?
なら、PC 買い換えろとしか言えない。
確かに初回は数秒かかるけど、10秒越えてるのは明らかになんかおかしい。
0073デフォルトの名無しさん2014/07/06(日) 11:11:56.20ID:0/5ncYP/
フォントの入れすぎと違う?
0074デフォルトの名無しさん2014/07/06(日) 11:25:02.83ID:svvUNKuj
VBAプログラムの内容を自動的に解析して簡単なフローチャートのようなものを作成してくれるツールはありますか?
自分で書いたVBAプログラムの無駄を省きすっきりさせたいのですが、入り組んでいて手作業だときついものがあるのです。
そんなツールがない場合には手作業で作ろうと思うのですが、、プログラムに適したフローチャートの書き方ってあるものなのでしょうか?
キーワード的なものを教えていただきたいのです。よろしくお願いします。
0075デフォルトの名無しさん2014/07/06(日) 11:28:16.81ID:0ko7UgYL
PC買い換える前に、OSのクリーンインストールを試してみては?

と言っても、初心者にはOS入れ直しって敷居が高いらしいからな
慣れてる人は、普段からOSやOS入れてるHDDが突然逝っても困らないようにしてるから
その対策がOS入れ直しの時にも役に立って、OS再インスコなんて大した手間でもないけどね
0076デフォルトの名無しさん2014/07/06(日) 18:13:03.33ID:o4RIpn+i
教えて下さいませ VBAでの文字操作で
Str1 = ChrW(&H3042):      Debug.Print Str1, Hex(AscW(Str1))
Str1 = ChrB(&H42) & ChrB(&H30): Debug.Print Str1, Hex(AscW(Str1))
Str1 = ChrB(&H30) & ChrB(&H42): Debug.Print Str1, Hex(AscW(Str1))

<結果>
あ 3042
あ 3042
? 4230

となったんですが
 ChrB(&Hnn) & ChrB(&Hnn)
とする時には 逆にしないと いけないのは なぜなんでしょうか

そもそも使い方が間違っているのか
何か理由があるのか知りたいでのす。

よろしくお願いします。
0077デフォルトの名無しさん2014/07/06(日) 18:47:49.33ID:WRsZVHJU
>>76
そんな使い方出来たんだ、知らなかったわ
UNICODEにはLEとBEがあってVBAはLEだろうから内部的には前後バイトが逆になってるはず
0078デフォルトの名無しさん2014/07/06(日) 20:00:32.87ID:o4RIpn+i
>>77
ありがとう
UniCode自体は知識として知ってはいたけど
Excelは BEだと 思い込んでた ChrW()の返り値が BEなんだもん

いままではChrW()使っていたけど
クグっていた時に偶然見つけたのです
でやってみたらアレ?って感じで

という事は
 内部     :UniCode(Litle Endian)
 AscB(),ChrB():バイナリ
 AscW(),ChrW():UniCode(Big Endian)
 Asc(),Chr() :Shift-JIS(日本語環境時)
という理解でいいのかな?
0079デフォルトの名無しさん2014/07/06(日) 20:09:25.77ID:JKZH1xqw
いろいろ混乱してるな
0080762014/07/06(日) 20:20:28.44ID:o4RIpn+i
>>79
うん おもいっきり 混乱してる

で自分で気づいた事
×Excelは BEだと 思い込んでた ChrW()の返り値が BEなんだもん
○Excelは BEだと 思い込んでた AscW()の返り値が BEなんだもん

他に 理解の上で おかしい点ある?
0081デフォルトの名無しさん2014/07/06(日) 20:33:53.21ID:Q8Jj+bR6
>>80
それらのメソッドが扱っているのは符号化表現ではなくコードポイントでしょ?(と思ってる)
0082デフォルトの名無しさん2014/07/06(日) 20:36:46.70ID:JKZH1xqw
>>80
> Excelは BEだと 思い込んでた
ChrB(&H42) & ChrB(&H30) が 3042 になるのはCPUのアーキテクチャがリトルエンディアンだから
excelやunicodeに依存する話じゃない。

> AscW()の返り値が BEなんだもん
AscW()の返り値はInteger。エンディアンに関係なく数値としては0-65535の値。
0083762014/07/06(日) 20:52:13.02ID:o4RIpn+i
>>81-82
ありがと

お二人が言われている事全てを理解できて ないけど
根本的に
>excelやunicodeに依存する話じゃない。
って事なんだろうなとは思った

さすがに
CPUのアーキテクチャ云々は
趣味でVBAを扱っている身としては 考えた事もなかった
0084デフォルトの名無しさん2014/07/06(日) 21:00:35.71ID:0/5ncYP/
>>81
メソッド?関数じゃないの?
0085デフォルトの名無しさん2014/07/06(日) 23:49:54.02ID:v6JPrHa9
初心者で今入門書で勉強しているのですが、わからない事があるので質問させていただきます。

Ifステートメントでは

Range("A4").Value Range("C4").Value = Range("E4").Value

と記述できたのですが、なにもステートメントもなしに同じように記述すると、「+」がエラーで書き込めませんでした。

Range("E4").Value + Range("A4").Value Range("C4").Value

だと問題なく記述できます。
これはどのような仕組みになっているのでしょう?
0086デフォルトの名無しさん2014/07/06(日) 23:52:09.20ID:v6JPrHa9
すみません、2つめのコードは以下の間違いでした。

Range("E4").Value = Range("A4").Value + Range("C4").Value
0087デフォルトの名無しさん2014/07/07(月) 00:26:13.07ID:UAdVZ0Fj
>>85
質問がよくわからない
エラーの出た行と、比較したいプログラムを省略せずに書いて
0088852014/07/07(月) 00:49:27.67ID:Z2I36dsb
失礼しました。

Sub チェック()
Range("A4").Value + Range("C4").Value = Range("E4").Value
End Sub

このように記述しても、足し算の行を記述した後モジュール内をクリックすると「+」が消えてしまいます。

一方、以下のようなIfステートメント内だと問題なく記述できます。

Sub チェック()
If Range("A4").Value + Range("C4").Value = Range("E4").Value Then
Range("E4").Font.Color = vbBlue
Else
Range("E4").Font.Color = vbRed
End If
End Sub

割り切って「そういうものだ」と覚えればよいのかもしれませんが、よろしくお願いします。
0089852014/07/07(月) 00:53:07.08ID:Z2I36dsb
インデントするのを忘れてしまい、読みづらくなってしまいました。
度々すみません。
0090デフォルトの名無しさん2014/07/07(月) 00:56:43.05ID:gM0SREJl
>>88
その二つでは"="の持つ意味が違う
エラーが出ている方は「代入」のための"="
If文に使われてるのは「比較」のための"="
比較のほうは"="の右辺と左辺が同じかどうか
判断するものだから順番は関係ないけれど、
代入のほうは"="の右辺を左辺に代入するものだから順番を逆にすると意味も反対になる。
代入の時には左辺側には演算子は使えない。
0091デフォルトの名無しさん2014/07/07(月) 01:10:48.79ID:tBZpjBzU
>>88
If Range("A4").Value + Range("C4").Value = Range("E4").Value Then
を解釈すると・・・
Range("A4").Value A4セルの値 と
Range("C4").Value = Range("E4").Value という比較演算結果 を足して、
ゼロ以外なら真、ゼロ以外なら偽という分岐をします。
比較演算結果を計算に使うとき真なら−1、偽なら0です。
決して、A4セルの値とC4セルの値を足したものがE4セルの値に等しいか
どうかの判断はしていません。
A4セルの値とC4セルの値を足したものがE4セルの値に等しいか、ということなら
If Range("E4").Value = (Range("A4").Value + Range("C4").Value) Then
とします。
0092912014/07/07(月) 01:21:12.01ID:tBZpjBzU
91の続きで、E4セルにA4セルの値とC4セルの値を代入する式は>>90さんが書いたように
Range("E4").Value = Range("A4").Value + Range("C4").Value
となります。代入するときの = は ← と思えばいいです。
0093デフォルトの名無しさん2014/07/07(月) 14:20:36.21ID:IFMXh2PZ
チェックボックスを使った計算表を作っています。
ActiveXチェックボックス自体は正常に動作しているのですが、
チェックボックスに触るとそれ以前の操作をアンドゥ出来ません。どこかに設定があるのでしょうか?

また、代替出来る機能、方法などがあれば教えていただけないでしょうか。
クリック操作によりTrueかfalse、もしくは0か1かを返せるものが目的です。
0094デフォルトの名無しさん2014/07/07(月) 15:04:38.55ID:AzugW9Um
>>93
チェックボックスに限らず、VBAやコントロール操作が絡むと
アンドゥ利かなくなるのは仕様でどうしようもない

毎度の手間が増えても、アンドゥ使える利を取ってVBAやコントロール使わず手動操作するか
アンドゥの利を捨ててでも、毎度の手間を省けるVBAやコントロールを活用するか
アンドゥ可能で毎度の手間も省けるように、最初だけ莫大な手間掛けてでもアンドゥを自前で実装するか
の3択かな?

あとはどれ選ぶかはお好きなように
0095デフォルトの名無しさん2014/07/07(月) 15:07:04.51ID:93FPLnbj
マクロでシート弄ったりするとUndo飛ぶよ
マクロからシートへ干渉しつつUndoを保護出来るのはユーザー定義関数だね
0096デフォルトの名無しさん2014/07/07(月) 16:08:21.48ID:IFMXh2PZ
>>94-95
ありがとうございます、あきらめて01入力にします
0097デフォルトの名無しさん2014/07/07(月) 20:01:25.58ID:hZfGBIQ8
Undoでーきない
もーどれーなーいー♪
0098882014/07/08(火) 00:13:12.93ID:Ik2S5C3q
ご回答ありがとうございます。
>>90
とりあえずはIfステートメント内で"="を使うと比較になるが、それ以外は代入になるという理解でよろしいのでしょうか?
>>91
If Range("A4").Value + Range("C4").Value = Range("E4").Value Then
は、比較演算子として"="を使用できたので、頂いたご回答の内容は間違えているような...
俺が間違えてたらすみません。
0099912014/07/08(火) 00:26:14.65ID:jfQgGLMx
>>98
If Range("A4").Value + Range("C4").Value = Range("E4").Value Then の"="は
何と何の比較演算子として使用されているか、わかりますか?
0100882014/07/08(火) 00:37:52.22ID:Ik2S5C3q
>>91
よく読んでみたら、多分俺が間違えてますね。
すみません。
よくわからないのですが、例えば2+7=9だとしたら、7=9になるためには7は+2足りないので-2となり、
2+(-2)は0でこれは真になり、それ以外は偽ということでしょうか?
バカで初心者な俺は>>98で書いたような理解で割り切っておいた方がよさそうですが...
0101デフォルトの名無しさん2014/07/08(火) 00:40:43.94ID:IVVVLtjN
> とりあえずはIfステートメント内で"="を使うと比較になるが、それ以外は代入になるという理解でよろしいのでしょうか?
いいえ

変数やプロパティ = 〜〜〜

の場合が代入であり、それ以外はIfに限らず比較演算

例えば
 変数1 = 変数2 = 変数3
だと、後者の=が比較演算で、変数2と変数3が同一値ならTrue、違えばFalseを変数1に代入する


あと>>91の回答については、彼は演算子の優先順位と結合規則を勘違いしている
算術演算子(+)は、比較演算子(=)より優先されるので
A4と、C4=E4の比較結果を加算し、それを論理値として評価するのではなく
A4+C4の結果と、E4を比較して分岐するというのが正しく
彼が「決して〜していません」と言ってるものが実際の動作だ

彼が最後に ( ) を付けたコードを書いてるが、元から算術演算子(+)が優先なので
+側は ( ) を付けなくても優先評価され、逆に彼が言うような動作にしたい場合に、=式に ( ) を付けるのが正しい

なんなら
Debug.Print Range("A4").Value + (Range("C4").Value = Range("E4").Value)
として、A4、C4、E4に、それぞれ10、20、30とでも入れて実行してみると良い

>>91の解釈では10と、20=30の結果の加算なので、20=30がFalseで0、10+0で10が返るが
実際には10+20で30、30と30を比較してTrueが返るから
0102882014/07/08(火) 00:41:13.02ID:Ik2S5C3q
完全に私が馬鹿でした。
汚い言葉を吐いてしまい、申し訳ありませんでした。
0103882014/07/08(火) 01:46:50.13ID:Ik2S5C3q
俺が書き込んでいる最中に他の方が回答してくださり、変なタイミングで書き込んでしまいました。

>>101
「変数やプロパティ = 〜〜〜

の場合が代入であり、それ以外はIfに限らず比較演算 」

なるほど、ありがとうございます。
Sub チェック()
 Range("A4").Value + Range("C4").Value = Range("E4").Value
End Sub
で"+"が消えてしまうのは、Ifステートメント以外で変数やプロパティ等の直後に算術演算子は使えないということでしょうか?
他の算術演算子は消えてしまうのではなく、エラーでしたが。
Debug.printはまだ勉強してないのですが、実行してもなんの反応もありませんでした。
0104デフォルトの名無しさん2014/07/08(火) 02:20:58.30ID:8MxDgJSC
>>103
なんか見てて 算数なんかの
1 + 2 = 計算結果
をイメージしてるように感じるんだけど 違うかな?

プログラムだと
計算結果 = 1 + 2

と考えないとだめなんだよね
0105882014/07/08(火) 03:23:55.36ID:Ik2S5C3q
>>104
説明が下手で申し訳ないのですが、要は、Ifステートメント内だと算数のように記述できるのに、Ifステートメントがないと、どうして算術演算子をはじめにもってこれないのか、というのがわからないのです。
01061042014/07/08(火) 04:32:10.50ID:8MxDgJSC
うむ説明するの難しいな じゃあ

★ifの無いやつ(こういう表現きらいだけど)
 入れ物 = 1 + 2 (1+2の 計算結果を 入れ物にいれる)
 って考えた方がよいかな
★★★★右辺と左辺は逆にできない★★★★

★if ・・・は計算結果の入れ物は無くて
正しいかどうかを判定しているだけ

算数の
 3a+3b=3(a+b)
の考え方ににてる これは正しいよね でも
 3a+3b=3(a+b)+1
は間違いだよね

プログラムのif は
 if 3a+3b = 3(a+b)+1
と書かれたとき
それが正しいか間違っているか のみを判定してるのよ
正しいか間違ってるか だけだから
 if 3a+3b = 3(a+b)+1
 if 3(a+b)+1 = 3a+3b
この両方は一緒の判定
★★★★右辺と左辺が逆になっても評価は変わらない★★★★

注意:上の if文は プログラム構文上間違いだけど 説明の為に あえて算数的表現にしてます)
0107デフォルトの名無しさん2014/07/08(火) 09:47:49.84ID:GI47KTJ5
Excel VBAのIDEが頭悪くて、

Range("A4").Value + Range("C4").Value = Range("E4").Value

が、文法的に許されていないから

Range("A4").Value( Range("C4").Value = Range("E4").Value )

のようにValueメソッドの引数だと解釈されてるだけ
だから"+"が消える
0108デフォルトの名無しさん2014/07/08(火) 10:12:36.38ID:2n5wMRln
>>104

Range("A4").Value + Range("C4").Value = Range("E4").Value

は文法的に間違ってる

Range("E4").Value = Range("A4").Value + Range("C4").Value

という書き方ならIf関係無しに書ける。(というかこれは当たり前の書き方)

これは端的に言って「そういうルール(文法)だから」としか言いようが無い。
「代入は常にイコールの右からイコールの左の方向で行う」という決まりだから、
イコールの左側には一個の変数(あるいはオブジェクト)しか置けない。
(そうじゃないと右辺の演算結果(あるいは評価結果)が代入出来ないでしょ。)

つまり、あなたの言う算数的な書き方(A+B=Cの書き方)はVBAのルール上認められていない。
0109デフォルトの名無しさん2014/07/08(火) 10:14:06.13ID:rhZFZ210
この場合プラスは加算じゃなくて正符号と見なされてしまって、だから消えるわけだな
ところで正符号が消えずに残るようなケースってあるんだろうか?

a = +1

みたいに数値や変数の符号として使うと絶対に消えるよなあ
01101042014/07/08(火) 10:29:48.35ID:8MxDgJSC
>>108
ん? そういうつもりで書いてるけど

>1 + 2 = 計算結果
>をイメージしてるように感じるんだけど 違うかな?
は >>103を見ての感想なのだが
01111082014/07/08(火) 12:01:55.31ID:2n5wMRln
>>110
あ、ごめん安価ミスってた。
>>108は>>105宛でした。
0112デフォルトの名無しさん2014/07/08(火) 12:49:17.50ID:bwv+df8u
代入演算子と比較演算子のリテラルが一緒だからこういうことが起きるんだ
Excelはいい加減VBAから脱却してくれ
0113デフォルトの名無しさん2014/07/08(火) 13:06:47.36ID:IVVVLtjN
それで戸惑うのは、極一部の理解力が乏しい奴だけだし
そういう奴は、代入演算子と等価の比較演算子が別になったところで
どうせ違うところで混乱するので言語の問題じゃない
0114882014/07/08(火) 14:32:04.31ID:Ik2S5C3q
いろいろ答えてくださりありがとうございます。
結局条件分岐以外で「=」を使うと代入になり、VBAではそういうルールになっていると。
引数はまだわからないですが、条件分岐以外ではじめに「+」を持ってくると消えてしまう理由は>>107と>>109の説明がわかりやすかったです。
>>101
「> とりあえずはIfステートメント内で"="を使うと比較になるが、それ以外は代入になるという理解でよろしいのでしょうか?
いいえ

変数やプロパティ = 〜〜〜

の場合が代入であり、それ以外はIfに限らず比較演算 」

ここの部分がわかりません。

If Range("E4").Value = Range("A4").Value + Range("C4").Value Then

の場合の"="も代入になると言ってる訳ですよね?
この"="は比較ではないのですか?
ちなみに今読んでいる入門書には「条件分岐の中で使われている「=」は比較演算子であり、
それ以外の場所で使われている「=」は代入演算子であると見分けるとよいでしょう」とありました。
とりあえず参考書の説明で理解していこうと思います。

学習を始めたばかりで人によって違う事を言われたり、まだ習っていない内容で答えてもらっても非効率だと思うので、そろそろこの質問も終わりにしたいと思います。
0115デフォルトの名無しさん2014/07/08(火) 14:58:05.12ID:2n5wMRln
>>114
>ここの部分がわかりません。
>
>If Range("E4").Value = Range("A4").Value + Range("C4").Value Then
>
>の場合の"="も代入になると言ってる訳ですよね?


違うよ>>101はそんな事言ってない
>>101は

>例えば
> 変数1 = 変数2 = 変数3
>だと、後者の=が比較演算で、変数2と変数3が同一値ならTrue、違えばFalseを変数1に代入する

という部分で言及してるけれど、
この二つのイコールが入った文は最初の(変数1 = の)イコールは代入だけど、
次のイコールは比較になってるの。

だから、Ifの中にも代入のイコールがあるということではなくて、
Ifが無い比較演算子のイコールも存在するといってるんだよ。

IfのなかでThenの前には比較演算子としてのイコールしかないと思うよ。
(Then以降には代入のイコールが入る)

というか君自身はあっさりスルーしてるけれど
一連の質問の中で一番間違ってた部分は
A + B = C という書き方自体なわけで
まずそこが間違ってることを理解することが一番肝心だと思うよ。
0116882014/07/08(火) 15:37:35.95ID:Ik2S5C3q
>>105
ありがとうございます。
条件分岐なしの場合だと代入と比較を使えるが、条件分岐ありだと比較しか使えないということですね。
よくよく考えてみれば後者条件分岐なのだから比較なのは当たり前ですが。

C = A + Bという順番にしなければいけないのは、VBAは文法的に、Cについての説明はCの後に持ってこなければいけないということですよね?
このCについて説明するというのが代入で、左辺と右辺が同じかを判断するのが条件分岐の比較だと。
0117デフォルトの名無しさん2014/07/08(火) 17:41:56.73ID:tPs811eF
参考にしてる本とやらがクソ過ぎるのでは無いだろうか

基本的に"="はどんな時でも比較演算子とみなされる
ただし、いきなり
a = 1
とか書いた時だけは代入演算子とみなされる

という考えの方が(とても雑だけど)いいよ

例えば
a = 1 = 1
という式の場合は、a = の=だけが代入演算子で、1 = 1は比較演算子になる

IF 1 = 1 = 1 then
の場合は全部比較演算子



引数っていうのは
Range("E4")
の "E4" のことだ
0118デフォルトの名無しさん2014/07/08(火) 22:58:13.00ID:ptSAp+eF
はじめまして
OS:XP
Excel:2003です

職場で、oracleからADOでレコードをとってきて更新するマクロを使っているのですが、
重複レコードがないのにoracleの一意性約違反が出てしまいます
拙いながら調査すると、256レコード目までは更新できるのですが、257行目でエラーとなっているようです
ちなみに、全く同じ更新内容を、同じツールを使い、別のマシンで実行すると正常に行きます

マシンのメモリの限界などがあるのでしょうか?
どうしたら今のマシンでも動くようになるでしょうか
漠然とした質問ですみません
よろしくお願いします
0119デフォルトの名無しさん2014/07/08(火) 23:03:36.99ID:Nz16FxJy
全く同じ更新内容で一意制約違反が出たり出なかったりするなら
それはoracleの致命的なバグなんだと思うよ
0120デフォルトの名無しさん2014/07/08(火) 23:05:30.32ID:rhZFZ210
>>118
正常に動く別のマシンもXPでExcel2003なの?
0121デフォルトの名無しさん2014/07/08(火) 23:06:40.64ID:ptSAp+eF
>>120
そうです
詳しくは見てませんが
マシンの購入時期によりスペックはまちまちです
0122デフォルトの名無しさん2014/07/08(火) 23:08:28.34ID:rhZFZ210
>>119
実績を考えたら、欠陥はOracleじゃなくて自作VBAの側にあると考えるのが自然
0123デフォルトの名無しさん2014/07/08(火) 23:11:32.37ID:rhZFZ210
>>121
まずはシステム構成やバージョンなどを詳しく見てきてください
ADOのバージョンも、それぞれのマシンで確認してください
それから、正常に動作したマシンからブックをコピーして試してください
0124882014/07/08(火) 23:14:32.01ID:Ik2S5C3q
>>117
>>107で説明してもらってますが、いきなりRange("A4").Value + Range("C4").Valueと書くと、
+ Range("C4").ValueがただのRange("C4").Valueと判定されて+が消えてしまうのですね。
Valueはメソッドとしても使えるのですね。
今勉強している本は『Excel VBAのツボとコツがゼッタイにわかる本』というものです。
この本はamazonで随分人気が高いようですが、初心者に「VBAとはこういうもの」とサラッとわからせるのが目的みたいで、
「初心者のみなさんは、このような理解でいいでしょう」という言葉が結構あります。
深く理解するのは他の本でやってくださいって感じですね。

>>113
知恵袋の話ですけど、パソコン教室でVBAを習う人の中で、なんとか使えるようになる人が1割で、バリバリ使えるようになるのはさらにその中の1割らしいです。
私もそうですが、世の中理解力の乏しい人間がほとんどなのだと思います。
頑張って「なんとかVBAを使える1割」に入りたいものです。
ちょっと自信を失いかけてますが...

正直まだ疑問に思う部分はあるのですが、お陰様でとりあえず最初の疑問は解決できました。
勉強を進めていって、それでも理解できなければまた質問させていただきます。
ありがとうございました。
0125デフォルトの名無しさん2014/07/08(火) 23:14:58.74ID:ptSAp+eF
>>123
ありがとうございます
見てきます

ちなみにDB更新ツールはサーバ上に置いてあり
サーバ上で実行してるのですが私のマシンからではNGで
他のマシンからならOKなんです
0126デフォルトの名無しさん2014/07/09(水) 00:22:55.85ID:fvKhY7zR
どんな拡張子でも印刷できるように
Range(A1).Value & ".拡張子"

で参照したファイルを右クリック
・ショートカットメニューが出現
・「印刷(P)」を選択

こんなコードを書いて貰えないでしょうか
0127デフォルトの名無しさん2014/07/09(水) 00:58:34.95ID:tDynlsgr
>>125
突っ込もうとしているデータが本当に一意制約に違反してるのか調べるところからじゃないの?
0128デフォルトの名無しさん2014/07/09(水) 01:18:18.59ID:YAhpnUVv
>>127
それは調査してみました
エラーの出るところまでで入ってるレコードの主キーを全部書き出し、エラーの出てるレコードの主キーを確認しましたが、全く重複はしていませんでした
257行目の挿入で何が起きているのかがさっぱり不明です…
0129デフォルトの名無しさん2014/07/09(水) 01:22:42.42ID:rKYF3dJl
>>126
> どんな拡張子でも
って、もちろん「Excelで開ける拡張子なら」って話で良いんだよね?

「Excelで開ける」って縛り無しだと、億単位の金が稼げるようなビックプロジェクトになっちゃうし
0130デフォルトの名無しさん2014/07/09(水) 01:33:26.12ID:hwFRyxUk
>>128
キー重複があれば一意制約違反が起こる。
重複がなければ一意制約違反は起こらない。
事実はそのいずれかに限られるんだ。
つまり、君の話す事は矛盾しているのだよ。
おかしいと思わないかい?
0131デフォルトの名無しさん2014/07/09(水) 01:34:01.84ID:tDynlsgr
>>128
いやいや、エラーになった時のデータベースの中身見ろよ...
0132デフォルトの名無しさん2014/07/09(水) 08:09:19.69ID:cCCpjr/i
>>129
面倒な書き方をしてしまいました。
エクセルファイルを右クリック
・ショートカットメニューが出現
・「印刷(P)」を選択

このコードの作り方を知りたいです
0133デフォルトの名無しさん2014/07/09(水) 08:20:28.11ID:nZmCpVll
>>132
WMIで出来たと思うが見つからなかったので第2案

拡張子を気にせず印刷する
http://vbaexcel.seesaa.net/s/article/148418450.html
0134デフォルトの名無しさん2014/07/09(水) 12:50:02.75ID:fvKhY7zR
>>133
さっぱり理解できませんが頑張ってみます
ありがとうございます
0135デフォルトの名無しさん2014/07/10(木) 20:16:55.64ID:dz0pgHBR
Option Explicit
Dim PrinterName As String
Dim filename As String
Dim myshell As Object
Sub Macro1()
PrinterName = Application.ActivePrinter
filename = ファイル名.pdf
Set myshell = CreateObject("WScript.Shell")
myshell.Run ("AcroRd32.exe /t " & filename)
End Sub

印刷部数を指定したいのですが、どこに何を追加したらいいですか?
0136桃白白 ◆9Jro6YFwm650 2014/07/10(木) 20:30:42.90ID:sacsCKyO
>>135
AcroRd32.exeの起動引数で部数を指定することはできなさそっすね。
じゃあ、Runをループでぐーるぐる。

Dim NumberOfCopies As Integer
NumberOfCopies = 4

Dim i As Integer
For i = 1 To NumberOfCopies
 myshell.Run "AcroRd32.exe /t " & filename
Next
0137デフォルトの名無しさん2014/07/10(木) 20:35:00.30ID:dz0pgHBR
>>136
お早い回答ありがとうございます!
0138デフォルトの名無しさん2014/07/10(木) 21:12:25.60ID:sywxafAf
こんばんは>>118です
マシンのスペックを見たところ、私のマシンはメモリ1G
正常に動作するマシンは516M
単純に物理的なメモリだけなら私のマシンのスペックのほうが上でした
ADOのバージョンは2.8
サーバで動作させてるので両方バージョンは同じです

こういった事象はあまり報告がないのでしょうか?
ちなみに、かのツールを使い他の更新データで更新をかけても、
同じように256レコード目までは動作し、257レコード目のrecordset.update
で一意制約違反で死にました。

更新データはStringのみのユーザー定義型配列に全件セットし、そこからレコードセットに渡して更新をかけています。
配列の中身は正常です
レコードセットにも値は渡っています
他に何が考えられるでしょうか??

職場はネットに繋がらず
環境をいじることは禁止されているので
ADOのバージョン等をあげることはできません
0139デフォルトの名無しさん2014/07/10(木) 21:26:57.28ID:HM31btdY
PKのデータ型が何でどこにunique indexがあるのかとかテーブルに関する情報一切なしで
言われても…なんですが。

これ以上はDB板のoracleスレで聞いたら?
情報一切なしで質問しても同じこと言われるだろうけどさ
0140デフォルトの名無しさん2014/07/10(木) 21:31:56.79ID:+ocYnFzf
>>138
データベースなんてろくに使ったことがない私には
何のことやらさっぱりなんですけど、
それにしたってExcelVBAの話なら
コードを晒すのが一番手っ取り早いと思うんですよ。

それは無理なんですか?
(クローズドなネットワーク上にあるなら無理なのかな?)

あるいは、NGなマシンとOKなマシンで
それぞれマクロをステップ実行して
NGのマシンでエラーが出るところの動作の違いを
比べてみるとかできませんか?

もちろん、最初からステップ実行するんじゃなくて、
ループの256周目にブレークポイントつけといて
そこからで良いと思いますが。
0141デフォルトの名無しさん2014/07/10(木) 21:36:16.36ID:qlQWaxh+
>>138
かのツールって?
0142デフォルトの名無しさん2014/07/10(木) 23:28:04.08ID:WG8zYGhC
うーんそうですか…
PKは4つですべてVARCHAR、上述もしましたが全く同じテーブルに全く同じ更新をかけても私のマシンでだけ死ぬんですよね…
なので端末によってString配列の保持できる限界があって、257レコード目が実は値が持てていないか変な値になってしまっているとか
そういうことを疑ってみたのですが…


ソースを公開はもちろんできませんが
簡単に書くと
For i=1 to 配列数
 recordset.Fields(カラム1)=string(0)
 recordset.Fields(カラム2)=string(1)
 recordset.Fields(カラム3)=string(2)
 …

 recordset.update
Next

というようなごく普通の更新なのですが
iはLongです
動きを比較するのはやってなかったので試してみますね
それでわからなければ諦めます…
0143デフォルトの名無しさん2014/07/11(金) 03:00:02.99ID:7vFSIHSK
そのPCの設定が、他と違っているのかも

こういうのがあるかどうかも知らないで言うけど、
トランザクションの限界が、256レコードとか?
0144デフォルトの名無しさん2014/07/11(金) 03:07:24.40ID:REfi/XET
言っておくが、一意制約違反は主キーで起こるとは限らない
あと、トリガとか張ってあったりしたらクライアントの問題ではないかもしれん

が、どう考えても>>138のコードがバグってる可能性が高いんだがw
エラー出たときに実際にインサートしようとした値と配列の中身調べろよ
本気で聞きたいならミニマムコード作ってあげろ
0145デフォルトの名無しさん2014/07/11(金) 12:27:48.35ID:z7P6dWBI
人の話を聞く気がないみたいだから、放置でよくね?
0146デフォルトの名無しさん2014/07/11(金) 12:46:32.42ID:ngtQGasB
>>145
一々賛同者を求めなくて良いよ。
君が放置したいならそうすれば良い。
誰もそれを咎める奴などいない。

でも答えたがる人達も居るんだから
そういう人達が回答するのを君が止める必要は無い。

そういうことを言ってるとしまいには隔離スレのようになる。
0147デフォルトの名無しさん2014/07/11(金) 13:07:44.63ID:kQWSbLrz
>>146
お前が>>145を放置しとけよ
0148デフォルトの名無しさん2014/07/11(金) 13:55:04.29ID:GBtr3LPr
>>147
お前も>>146を放置しとけよ
0149デフォルトの名無しさん2014/07/11(金) 14:26:47.23ID:kQWSbLrz
>>148
>>146みたいな馬鹿には言ってやらんとわからんからな
親切心だ
0150デフォルトの名無しさん2014/07/11(金) 15:16:07.32ID:u5XcYD/q
>>149
ここはあと二回くらいはテンドンするべきところだったと思う。
非常に残念でならない。
0151デフォルトの名無しさん2014/07/11(金) 15:41:49.56ID:AD+RWQfG
聞く気が無くても気になる
V$SQL系から履歴確認してみたら?
文字が化けてたりするかもよ
0152デフォルトの名無しさん2014/07/11(金) 16:32:55.01ID:dVpzO1KY
ダチョウ倶楽部を見習うべきだった。
0153デフォルトの名無しさん2014/07/11(金) 17:23:48.62ID:XLLUm7RS
>>146
> 一々賛同者を求めなくて良いよ。

あちゃー、文面通り受け取る素直な奴がまだいたんだな...
別に賛同なんて求めてなくて、「答えて欲しけりゃ人の話聞けよ、バーカ」っつーのを婉曲に言ってるだけ。
世の中にでたら、こういう嫌みな言い方する奴一杯いるから気を付けてね (w
0154デフォルトの名無しさん2014/07/11(金) 17:59:23.92ID:7ammqW7i
必死だなwww
0155デフォルトの名無しさん2014/07/11(金) 18:41:00.17ID:AD+RWQfG
揚げ足取り必死だなwww
0156デフォルトの名無しさん2014/07/11(金) 20:20:58.51ID:4w3m6myd
なんかもっと血がたぎるような質問ないの?
0157デフォルトの名無しさん2014/07/11(金) 20:59:19.50ID:1uaPwXNB
会社に持ってったらスゲー尊敬されるマクロください
0158デフォルトの名無しさん2014/07/11(金) 22:57:19.14ID:Ed0PB8nf
築地に持ってったらスゲー尊敬されるマグロください
0159桃白白 ◆9Jro6YFwm650 2014/07/11(金) 23:13:38.38ID:GkKreVX4
>>158
              ∩___∩
            /  ノ   \  ヽ
            | ●    ● |
          彡   (_●_)    ミ
           /、   |∪|    ,\
          /.|     ヽノ    | ヽ
       ,,/-―ー-、, --、   .|_,|
    r-、,'''";;:;;:;::;;;;:;;::;:;:;;::;:;`'- /_,l,,__ )
   |,,ノ;;:;r'" ̄ ゙̄^"`Y'-、;;;::;:;::;:;:;:;::;:|
    .ヽ,′       ;   `"";;;;;⌒゙')
     ´`゙'''''''''''‐-‐'"`‐-‐'"゛  `゙´
0160デフォルトの名無しさん2014/07/12(土) 00:26:50.10ID:RDT19VbG
>>154
誤解させてごめんな (w
0161デフォルトの名無しさん2014/07/13(日) 14:19:53.82ID:CV5kHNB8
起動時にブックの高さ、幅のサイズを設定することって出来ますか?
出来るなら教えて下さいm(__)m

フォームならプロパティで設定出来ますよね
0162デフォルトの名無しさん2014/07/13(日) 14:44:58.98ID:QheVEL1d
高さと幅があるのはウィンドウ。ブックじゃない。
エクセルで出来るかは知らんけどな。
01631612014/07/13(日) 16:57:32.39ID:CV5kHNB8
application. と打ってなんかそれらしいプロパティ無いかなぁ〜って見たところ、ありました

With Application
.Top = 50
.Left = 150
.Width = 1000
.Height = 650
End With

確かにウィンドウの方であってブックでは無い…のか。
言葉を間違えるとダメですね。
0164デフォルトの名無しさん2014/07/15(火) 23:11:41.68ID:Pf38M2Fb
質問させて下さい

ブック1のA列の文字とブック2のA列の文字全てと比較し
もし同じ文字がブック2のA列に1個でもあった場合にブック1のB列のセルに「一致」という文字を入れるようにしたいのですがどのようにすればいいでしょうか?

例えばブック1の Cells("1,1") に「A100」とありブック2の Cells("5,1")が「A100」の場合一致となり
ブック1の Cells("1,2") に 「一致」 と入るようにし、なければなにも記入しない
同様にしてブック1の Cells("2,1")と一致するブック2の列を探しループさせたいのです。


よろしければアドバイスを下さい。

windows7
EXCEL2003 です。
0165デフォルトの名無しさん2014/07/16(水) 00:11:56.86ID:S0iOCF8s
>>164
Find
0166デフォルトの名無しさん2014/07/16(水) 12:15:49.25ID:Q5qGFd/O
Excelのリボンを自作したいのですが、お勧めの開発ツールありますか?
0167デフォルトの名無しさん2014/07/16(水) 14:29:58.32ID:uTSBoZhX
>>166
とりあえずVisual Studioでいいんじゃね
どのエディションから出来るがしらんが
0168デフォルトの名無しさん2014/07/16(水) 19:15:16.20ID:CWCGAhMr
質問が曖昧なんだが
たとえば 2007以前の Office にリボンを付けたいのか
自作アプリに Excel風のリボンを付けたいのか
2007以降の Office のリボンの項目をカスタマイズしたいのか
それともまったく別の話なのか
0169デフォルトの名無しさん2014/07/16(水) 19:44:30.07ID:Q5qGFd/O
>>168
コメントありがとうございます。
EXCELに自作のリボンを組み込んで、EXCELをVBAとそのリボンで操作
したいのですが。
0170デフォルトの名無しさん2014/07/16(水) 20:39:39.91ID:tTSUc19b
なるほどね
0171デフォルトの名無しさん2014/07/17(木) 02:49:51.87ID:TFQGtdi0
http://www.ynsk.co.jp/nsk/knowhow/sendmail/sendmail5.htm

こちらのサイトに公開されてるアクセスのコードなんですが
Windowsの標準DLLを利用して、メールを受信、送信するプログラムを
実行したいのですが、うまく動かせません。

動かそうとしてるソフトのバージョンは、アクセス2010です。
作成されたとおもわれる環境は、アクセス97、2000のようですが。

やったこと
テーブルに、メールアドレス、パスワードなどの情報をいれて保存しました。
マクロを実行しようとすると、マクロ名がありません。→いまここ

初歩的なところとでとまってるんでしょうが、受信したメールがテーブルに入るのを確認できたら
それをVBAで編集して必要な情報をエクセル連携で情報をとりだして業務に活用したいと考えております。

よろしくお願いします。
0172デフォルトの名無しさん2014/07/17(木) 05:34:57.77ID:loHvM2sv
>>171
ここで聞いちゃダメって訳でもないのですが、
アクセスVBAには専用のスレがありますよ。

Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/l50

一応、マルチポスト扱いにならないように
ここで誘導されてきた旨を明記した上で向こうで再質問してはいかがですか?
(多分向こうのスレで回答できるような人達はこっちも見てると思います。)
0173デフォルトの名無しさん2014/07/17(木) 22:23:42.15ID:XaAH9ack
WIN7
EXCEL2007
を使用しております

IEobjectを使用し特定のラジオボタンにチェックをつけるという事をしたいと思っております

<INPUT value=1 CHECKED type=radio name=turkKknFlg>指定なし
<INPUT value=2 type=radio name=turkKknFlg>2日以内
<INPUT value=3 type=radio name=turkKknFlg>5日以内
<INPUT value=4 type=radio name=turkKknFlg>1週間以内
<INPUT value=5 type=radio name=turkKknFlg>日付を指定

ObjIE.Document.all.item("turkKknFlg").Value = 5
ObjIE.Document.all.item("turkKknFlg").checked
objIE.Document.getElementsByName("turkKknFlg")(5).Click
などをやってみたのですが 同じ名前が5個ある為か
オブジェクトはこのプロパティまたはメソッドをサポートしていませんと怒られてしまいます

ObjIE.Document.all.item(123).checked
の様に数字を指定せずに何かいい方法無い物でしょうか?
0174デフォルトの名無しさん2014/07/18(金) 00:05:56.35ID:CjYs434G
>>173
そのエラーは名前の重複と関係ないと思われ
0175デフォルトの名無しさん2014/07/18(金) 03:25:21.72ID:5y1KopaY
>>173
インデックスは 0スタートです
下どれでも好きなのを

objIE.Document.all.Item("turkKknFlg")(4).Checked = True
objIE.Document.all.Item("turkKknFlg")(4).Click
objIE.Document.getElementsByName("turkKknFlg")(4).Click

>数字を指定せずに何かいい方法無い物でしょうか?
これが インデックスを指定せず なら
これとか(Value値 5 を探している)

Dim turkKknFlg
For Each turkKknFlg In objIE.Document.all.Item("turkKknFlg")
 If turkKknFlg.Value = 5 Then
   turkKknFlg.Checked = True
   Exit For
 End If
Next
0176デフォルトの名無しさん2014/07/18(金) 06:52:11.81ID:H4/dInHH
>>175
インデックス決め打ちしてるけど、順序ってHTMLに出現した順序になる保証はあるのか?

つか、VBA関係ない話だな
01771752014/07/18(金) 08:05:44.40ID:5y1KopaY
>>176
>インデックス決め打ちしてるけど、順序ってHTMLに出現した順序になる保証はあるのか?
下記で HTMLに出現した順序になると解釈しているが違うのか?

とは言え VBA関係ない話なのは そうだから これでお終いにする。


http://msdn.microsoft.com/ja-jp/library/cc410318.aspx
構文 object.all([index])
>注意事項
>エレメントオブジェクトの順番はHTMLソースの順番となる。
>例
>次のJScript例は、ドキュメント内の全てのタグ名をその出現順に表示する。


http://msdn.microsoft.com/ja-jp/library/cc428088.aspx
element = object.item(index [, subindex])
>例
>エレメントをドキュメントの中で出現する順番で読み出すことになる。
0178デフォルトの名無しさん2014/07/18(金) 14:13:32.67ID:pod0w9Wn
>>175
皆さんありがとうございます
無い物を指定していたのでエラーになっていたのですね
0179デフォルトの名無しさん2014/07/18(金) 20:06:18.93ID:V7toNe43
EXCEL VBAでDOS窓を開いてそこに出力することは可能でしょうか?
Debug.Printだとデバッグ中しか使えないので。
0180デフォルトの名無しさん2014/07/18(金) 20:16:35.55ID:LLU7aR/j
なんでDOS窓に出したいの?出すなら口とか膣とかアナルとか色々あるじゃん?
0181デフォルトの名無しさん2014/07/18(金) 20:31:15.80ID:j3nSRPn1
採取したいログなり文字列なりをテキスト出力するようにしてるけど、そういうのではダメなん?
0182デフォルトの名無しさん2014/07/18(金) 22:51:27.19ID:CjYs434G
「MS-DOSウィンドウ、通称DOS窓」と「コマンドプロンプト」は別物で、Win XP以降のOSにDOS窓は搭載されてないのに、
いまだにDOS窓と言うジジイが多くて困るわ

コマンドプロンプトにメッセージ表示は可能だけど、理由がわからん
メッセージ出力という目的で見れば、イミディエイトウィンドウと同じぐらい不便だと思うのだが
なんならダイアログボックスでいいじゃん
0183デフォルトの名無しさん2014/07/18(金) 23:20:40.54ID:dRZmRHWx
>>182
きしょい
0184デフォルトの名無しさん2014/07/18(金) 23:26:54.89ID:H4/dInHH
Dim msg As String
msg = "テストメッセージ"
Call shell("cmd.exe /K echo " & msg)

これに意味があるかどうかはしらん

ホントは標準出力なり標準エラー出力なりに出力したいんだろうけど
VBAに標準入出力の機能はないんだよ
0185デフォルトの名無しさん2014/07/18(金) 23:48:45.96ID:V7toNe43
>>184
サンプルプログラムありがとうございます。
でもそれだと、実行するたびにDOS窓が開くので困ります。
一つだけ開いて、そこに文字を書きたいのです。
要するに、VB.NETでConsoleアプリ実行するような感じにしたいのです。
0186デフォルトの名無しさん2014/07/19(土) 00:49:18.44ID:5mmZ/Q+l
VB使え
0187デフォルトの名無しさん2014/07/19(土) 07:34:15.28ID:nqTdhk25
列ってRangeだとABCDEFとアルファベットなんですけど、

これを1=A、2=Bと数値からアルファベットを取得する方法ないですか?
0188デフォルトの名無しさん2014/07/19(土) 07:54:05.53ID:KUKSKIve
http://www.happy2-island.com/excelsmile/smile03/capter00717.shtml
5.17 列番号から列名を求める
0189デフォルトの名無しさん2014/07/19(土) 09:34:41.86ID:5mmZ/Q+l
>>187
一発で求める方法はないので、ちょっとした数式を工夫する必要がある
変数cに列番号が入っているとして

Replace(Cells(, c).Address(, False), "$1", "")

とか

Right(Columns(c).Address, 1 - (c > 26) - (c > 676))

とか
後者はExcelのバージョンアップで使えなくなる可能性があるけど
0190デフォルトの名無しさん2014/07/19(土) 13:50:32.79ID:nqTdhk25
>>188-189
 sAddress = Split(oTarget.Address(False, False, xlA1),":")(0)
で行きたいと思います。ありがとうござました。

さて、
 セルにハードコーディングされまくった大量の関数
と
 ループや演算で位置を求めず、これまたハードコーディングしまくった大量のサブルーチンしかないVBA
でつくられた、エクセル方眼紙レポートを修正するか、2年で異動だからそれまで触らずに待つか考えよっと・・・(ToT)
0191デフォルトの名無しさん2014/07/19(土) 19:39:28.69ID:xzoFoPNv
>>190
それ完全に、手を入れる度にカオス化していくパターン。
後の担当者の為にも余計な事しない方がいいよ。
0192デフォルトの名無しさん2014/07/19(土) 21:50:48.13ID:xiMigv99
>>191
いや、直すなら完全にVBAオンリーにしてしまおうと思っています。

ただ問題は、
 素人は、サブルーチンは理解できるが、関数が理解できていない素人パソコン大先生が担当になるケースが多い
ということなんです。
うちの会社は、エロゲオンリーのパソコン大先生とソフトウェア開発オタクの差が人事的にないので・・・・。
下手にプログラマ的な組み方でやると、次に引き継ぐ人が読めなくて死ぬかな・・・と。
0193デフォルトの名無しさん2014/07/19(土) 22:34:36.30ID:LMuGU7qL
>>192
> 下手にプログラマ的な組み方でやると

列番号から列名への変換もできなかった奴が言うことじゃないわな (w
0194デフォルトの名無しさん2014/07/20(日) 00:16:58.19ID:Ir+so4Je
質問させていただきます。
OSは7でoffice2007です。

Activesheetに以下の順不同で規則性がない変換表(A1:B5)があります。
A,B
a,あ
aaa,い
ab,う
aa,え
aん,わ

変換表を用いて文字列を、変換表A列の値があれば以下のケースのようにB列の値へ置き換えるという関数を作成したいです。
ケースは以下の通りです。(文字列→変換後文字列)
ああa→あああ
aいういa→あいういあ
aaaああ→いああ
aaええ→えええ
abaa→うえ
bbbb→bbbb
aんん→わん

本来ならaという文字でほとんどの条件に当てはまり変換されてしまうのを、より当てはまる条件があればそれに変換できるようにしたいです。

何かアイデアだけでもご教授していただければ幸いです。
0195デフォルトの名無しさん2014/07/20(日) 00:49:01.93ID:mk57Kf21
>>194
変換表を降順ソートして上から適用
0196デフォルトの名無しさん2014/07/20(日) 00:50:00.95ID:mltsIski
>>194
「より当てはまる」というのが「合致する文字数が多い」だと考えるなら、
変換表を文字数の多い順に並べて、上から順に当て嵌めていけば良いんじゃないか?

ただし、例えば
「aaab」は「いb」もしくは「えう」のどちらにも変換可能なので、
「どちらがより当て嵌まっているのか」の評価方法が分からなければ
一意の結果を求められない。

つまりこの質問は不十分な条件しか提示していないといえる。
0197デフォルトの名無しさん2014/07/20(日) 01:17:00.67ID:mk57Kf21
文字列の包含関係を調べて優先順位を付ける
0198デフォルトの名無しさん2014/07/20(日) 01:45:27.82ID:Ir+so4Je
>>195,>>196
ありがとうございます。

なるほど…文字数の多い順に並び変える、または優先度を設定すれば済む問題でしたね。
セル上では順不同で規則性がない変換表…という思い込みがありました。内部で並び替えを行った配列等に変換すれば問題ないですね。

ケースはある程度考えてから書いてはみたもののやはり抜けがありましたね…>>196さんごめんなさい
あと「より当てはまる条件」は不十分な日本語の説明でしたね、「合致する文字数が多い」が正しい表現です。

助かりました、後は考えてみます。
0199デフォルトの名無しさん2014/07/20(日) 03:03:53.52ID:BmGivsLr
教えてください。
「Sheet1」でエンターキーを押すたびにB1→D1→B2→D2→B3…と
セルを移動したいので、標準モジュールに

Sub Auto_Open()
Application.OnKey "~", "OnEnter"
End Sub
Sub Auto_Close()
Application.OnKey "~", "OnEnter"
End Sub
Private Sub OnEnter()
If (2 = ActiveCell.Column) Then
ActiveCell.Offset(0, 2).Select
ElseIf (ActiveCell.Column = 4) Then
ActiveCell.Offset(1, -2).Select
Else
ActiveCell.Offset(0, 0).Select
End If
End Sub

と打ち込んだのですが、「Sheet1」のシートだけにこのマクロを実行させたい
(他のSheet2やSheet3はエンターを押しても下に移動してほしい)
のですが、何か、方法はありますか?ちなみにExcel2003です。
0200デフォルトの名無しさん2014/07/20(日) 03:25:33.69ID:mk57Kf21
>>199
If ActiveSheet.Name = "Sheet1" Then
0201デフォルトの名無しさん2014/07/20(日) 03:28:24.54ID:+YOkQ4ve
ActiveSheetで判定すればいいじゃん
0202デフォルトの名無しさん2014/07/20(日) 04:18:30.13ID:BmGivsLr
>>200,201さんありがとうございます

しかし、どうやっても変わらず、Sheet1〜Sheet3までマクロが実行されます。
「 If ActiveSheet.Name = "Sheet1" Then 」は、
どこに記述したらよいのでしょうか?
0203デフォルトの名無しさん2014/07/20(日) 14:09:27.23ID:h/Hq+1to
助言をお願いします。
WEBのテキストを文字列変数に格納し、正規表現にマッチする情報のみワークシートに取り込むエクセルファイルがあります。
このファイルの調子が最近良くないのです。ファイルを開いて数分すると何かの処理が始まりキー操作など一切受け付けなくなります。
こうなるとエクセルを強制終了するしかなく大変困っています。
ググっていろいろ試してみました。すると、以下のコードを実行したところ、コネクションの数が約600ありました。
With ActiveWorkbook
For i = 1 To .Connections.Count
.Connections(i).Delete
Next i
End With
全てのコネクションを削除しましたが、症状は改善されません。
質問は以下の2つです。

1. コネクションが大量にあった理由と今後コネクション増加を防ぐ方法
(ネットで拾ったと思われる以下のコードでWEB情報を入手しています)
Private Function getHTMLbyURL(TargetURL As String) As String
Dim http As MSXML2.XMLHTTP
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", TargetURL, False
http.send (Null)
Do While http.readyState <> 4
Loop
getHTMLbyURL = http.responseText
End Function

2. コネクションを削除しても症状が改善しない理由
(コネクションのように、webから情報を取り込む際に増加してしまうものはありますか?)
02042032014/07/20(日) 14:30:38.64ID:h/Hq+1to
>>203に情報を追加します。

WEBのテキスト情報以外にも楽天RSSを用いてリアルタイム株価情報を取得しているコードがあることを思い出しました。
0205デフォルトの名無しさん2014/07/20(日) 15:04:41.02ID:malHYamd
>>199
作ってみたよ まず
 Sub Auto_Open() ・・・削除
 Sub Auto_Close() ・・・削除
 Sub OnEnter()  ・・・このまま使用

それで以下を追加
★標準モジュールに
Sub OnKey_Set(sh As Worksheet)
 If sh.Name = "Sheet1" Then
   Application.OnKey "~", "OnEnter"
 End If
End Sub
Sub OnKey_ReSet(sh As Worksheet)
 If sh.Name = "Sheet1" Then
   Application.OnKey "~"
 End If
End Sub

★ThisWorkbookモジュールに
Private Sub Workbook_Activate()
  OnKey_Set ActiveSheet
End Sub
Private Sub Workbook_SheetActivate(ByVal sh As Object)
  OnKey_Set sh
End Sub
Private Sub Workbook_Deactivate()
  OnKey_ReSet ActiveSheet
End Sub
Private Sub Workbook_SheetDeactivate(ByVal sh As Object)
  OnKey_ReSet sh
End Sub
02062032014/07/20(日) 17:57:10.85ID:h/Hq+1to
自己解決しました。
原因はわかりませんが、Thisworkbook.Names.Countが2000以上ありました。
不要なNameをDeleteするプロシージャで応急処置は完了しました。
失礼します。
02072032014/07/20(日) 18:30:30.53ID:h/Hq+1to
何度もすみません。
Names.countが増えた原因は自力でもなんとかなりそうなのですが、
Connections.countについては皆様の助言を頂きたいのです。
どうかお願いします。
0208デフォルトの名無しさん2014/07/21(月) 17:28:38.92ID:ufWzAtLi
>>172
返答遅れましたが、該当のスレッドで再度、質問させていただきます。
ありがとうございます。
0209デフォルトの名無しさん2014/07/22(火) 01:01:06.71ID:91SFEMDE
関数名や変数名が昔自分がネットにあげたソースと全く同じで懐かしかった。
0210デフォルトの名無しさん2014/07/22(火) 20:56:42.75ID:B7CkAUjZ
A列に数字が書いてあるとします
B列にはa〜eのいずれかの文字が複数書いてあります

イメージとしては

100 a
250 b,c,d
-70 a,e
120 b
-10 a,b,d,e

このようになっているとき、例えばcが含まれている数字のみを抽出し、その和を求めたいのですが
抽出にはどんな関数を用いればよいのでしょうか?
0211デフォルトの名無しさん2014/07/22(火) 21:17:19.98ID:sFUEgbf6
抽出って何をどうすることを抽出って言ってるんだ?
A列が数字ならA列の内容読みだすだけだろ
0212デフォルトの名無しさん2014/07/22(火) 22:41:28.15ID:JAupmXZX
i=0
sum = 0
do
i =i +1
if instr(cells(i,2),"c") <> 0 then
sum = sum + cells(i,1)
end if
loop untill cells(i,1)=""
0213デフォルトの名無しさん2014/07/22(火) 22:54:08.59ID:PXxjV5qq
Range("A2:A3").Select
With Selection
.MergeCells = True
End With
Range("B2:B3").Select
With Selection
.MergeCells = True
End With
Range("C2:C3").Select
With Selection
.MergeCells = True
End With
Range("D2:D3").Select
With Selection
.MergeCells = True
End With
Range("E2:E3").Select
With Selection
.MergeCells = True

初心者です。
次はA4:E5までって感じでA60:E61までループさせたいです。どうやればいいのでしょうか
あと「選択範囲は複数のデータがあります〜」っていう警告が出ないようにしたいです
よろしくおねがいします
行の縦結合の繰り返しです
0214デフォルトの名無しさん2014/07/22(火) 22:57:46.44ID:JAupmXZX
>警告が出ないようにしたいです

Application.DisplayAlerts=False
0215デフォルトの名無しさん2014/07/22(火) 23:15:36.17ID:PXxjV5qq
>>214
警告出ないように出来ました! ありがとうございます
表のサンプルですが、こんな感じです
http://www.dotup.org/uploda/www.dotup.org5206553.jpg
A列〜E列までを行A2〜E61まで結合していきたいです
0216デフォルトの名無しさん2014/07/22(火) 23:25:34.37ID:sFUEgbf6
>>213

Dim i As Integer, j As Integer
With ActiveSheet
For i = 1 To 5
For j = 2 To 60 Step 2
.Cells(j, i).Resize(2).MergeCells = True
Next
Next
End With
0217デフォルトの名無しさん2014/07/22(火) 23:28:11.73ID:JAupmXZX
Sub test2()
Dim i As Integer
Dim j As Integer

For i = 2 To 61 Step 2
For j = 1 To 5
Range(Cells(i, j), Cells(i + 1, j)).MergeCells = True
Next
Next
End Sub

これでOK?
0218デフォルトの名無しさん2014/07/22(火) 23:31:58.74ID:JAupmXZX
あ、開始位置間違えたかw
0219デフォルトの名無しさん2014/07/22(火) 23:35:25.96ID:PXxjV5qq
>>216-218
できました!!
本当にありがとうございました
こんな数行のプログラムでできるなんて、みなさんの頭の中どうなってるのか知りたいです
本当にありがとうございました
0220デフォルトの名無しさん2014/07/23(水) 12:11:15.36ID:QYhPa3qH
なんか照れるわ
0221デフォルトの名無しさん2014/07/23(水) 18:48:03.32ID:RzG+h6fN
なんか勃起してきたわ
0222デフォルトの名無しさん2014/07/24(木) 00:13:41.86ID:eSDzc6pS
ここいらで自重してくれてよかった
流れ的に次はピュッが来ると思ったわ
0223デフォルトの名無しさん2014/07/24(木) 09:14:55.28ID:QG99+4AQ
>>221
抱いてっ
0224デフォルトの名無しさん2014/07/24(木) 11:09:17.24ID:y7iurEGE
http://or2.mobi/index.php?mode=image&;file=77628.jpg
こんな感じの表なんですが
MsgBoxに箱数を入力したら、その箱数が入ってる行がDELETEされるようにしたいです
たとえば、MsgBoxに40と入力したらD列を参照して6と7行目の文字と色、数字が消えるようにVBAで可能ですか?(数式は残したい)
0225デフォルトの名無しさん2014/07/24(木) 11:09:45.09ID:y7iurEGE
http://or2.mobi/data/img/77628.jpg
こっちのリンクの方がいいですね
よろしくおねがいします
0226デフォルトの名無しさん2014/07/24(木) 11:40:49.13ID:+XWbwIKp
Deleteだと行ごと削除になっちゃうよ。
ClearやClearContentsでも数式も消えちゃうし。

数式だけ残すとなると、
まず処理する領域(結合セルを含むので単純に求められない)を
確定し、その中の一セルずつの内容を判定して
数式以外の要素だけを消す、というコードを書く必要がありそうだ。
0227デフォルトの名無しさん2014/07/24(木) 11:49:53.52ID:y7iurEGE
>>226
すみません ClearかClearContentsでOKでした
数式じゃなくてリストボックスでした Clearで消えないのでOKですね
0228デフォルトの名無しさん2014/07/24(木) 21:52:09.93ID:y7iurEGE
データの入力規則と罫線は残したいです
0229デフォルトの名無しさん2014/07/24(木) 21:56:49.32ID:ANLv8C9o
とりあえずMsgBoxに何かを入力するのは無理
0230デフォルトの名無しさん2014/07/24(木) 22:15:18.74ID:y7iurEGE
InputBoxの間違いでした・・・
0231デフォルトの名無しさん2014/07/24(木) 23:05:21.51ID:OebyoGSI
>>228 あれ?解決したもんだと思ってた
>>224の説明と >>225のセル結合パタ−ンを元にコーディングしてますです
・6と7行目のどこかのセルが それ以外の行のセルと結合していない事が前提です
(D列の結合パタ−ンを元にしてる為、たとえぱ F7:F8が結合してるとかは 支障でるかもです)

Sub TEST()
 Dim FindCell As Range
 Dim HitCell As Range
 Dim WS As Worksheet
 Dim HAKOSU As Variant
 Set WS = Worksheets("Sheet1") '対象シート
 Set FindCell = WS.Range("D:D") '検索対象列
  Do
   HAKOSU = InputBox("箱数を入れてください")
   If HAKOSU = "" Then Exit Sub
  Loop Until IsNumeric(HAKOSU)
  '箱数の検索
  Set HitCell = FindCell.Find(What:=HAKOSU, LookIn:=xlValues , LookAt:=xlWhole , SearchOrder:=xlByRows)
  If HitCell Is Nothing Then
    MsgBox "入力した箱数 " & HAKOSU & " のデータはありません"
    Exit Sub
  End If
  '検索したセルの結合を基準に 消去範囲の行を決定
  With WS.Rows(HitCell.MergeArea.Row).Resize(HitCell.MergeArea.Rows.Count)
    '背景色・文字色の消去
    .Interior.ColorIndex = xlNone
    .Font.ColorIndex = 0
    '数式以外の消去
    .SpecialCells(xlCellTypeConstants).ClearContents
End With
End Sub
02321992014/07/26(土) 23:34:23.09ID:FjiCrpch
>>205さんありがとうございました。
おかげで思ったとおりに動いたのですが
ネットワークでつなげたデスクトップのパソコンで開いて動かすと、
BSキーの下のエンターキーでは思ったとおりに動きますがテンキー側のエンターキーでは
B1→D1→B2→D2→B3…と動かず、B1→B2→B3…と動きます。

2つのエンターキーともB1→D1→B2→D2→B3…と動かすことはできますか?
0233デフォルトの名無しさん2014/07/26(土) 23:56:46.66ID:jypj8fbM
出来る
テンキー側のエンターキーは
 Application.OnKey の
 Key値が違う
ヘルプに書いてあるとおもうよ
(もしくはぐぐって下さい)
0234デフォルトの名無しさん2014/07/27(日) 01:34:26.91ID:oU83TrYG
これですな
http://msdn.microsoft.com/ja-jp/library/office/ff197461.aspx

テンキー側のエンターキーは "{ENTER}" って書けば良いのか
0235デフォルトの名無しさん2014/07/29(火) 19:32:22.37ID:Q4BDSM86
10個くらいキーワードがあって
それがExcelのシートs(複数形のs)に存在するかどうかを調べるには
どういうコードを書きますか?
0236デフォルトの名無しさん2014/07/29(火) 19:36:25.47ID:mnxPVg+2
キーワードを配列に入れて
検索対象をブックにしてFindして回す
終わり
0237デフォルトの名無しさん2014/07/30(水) 13:46:45.96ID:Z0Vu5FUe
たくさんのセルの値を1つの配列変数に入れ
そのあと重複している値は1つだけ残してあとは削除し要素数もそれと連動して減らし
さらに配列の値を昇順でソートして並べるにはどういうコードを書きますか?
0238デフォルトの名無しさん2014/07/30(水) 15:09:03.64ID:aI8uJF/z
書いてあることを1つづつ組み立てていけばいい
0239デフォルトの名無しさん2014/07/30(水) 16:38:16.28ID:Z0Vu5FUe
わたしは真剣なのだ
0240デフォルトの名無しさん2014/07/30(水) 19:05:16.64ID:W5ylXrvA
知ってる
0241デフォルトの名無しさん2014/07/30(水) 19:19:26.56ID:8DFz/FdQ
まじれす しとくよ

重複削除 と そーと は Excelでやってから配列に入れる
0242デフォルトの名無しさん2014/07/30(水) 19:20:44.05ID:DLJkd0ah
javaではsetに入れてsortすれば終了なんだよね
VBAもそういうのあるのかな?
0243デフォルトの名無しさん2014/07/30(水) 19:22:17.25ID:DLJkd0ah
sortすらいらないのか
treessetに入れるだけで終了
0244デフォルトの名無しさん2014/07/30(水) 19:30:30.69ID:8DFz/FdQ
>>242
VBAの標準ではソートはないんだよね
Excelのシートでソートしろって事なんだろうけど

で配列でソートしようとするとソート組まないといけない

そんな事出来るオブジェクトだれか知らない?
0245デフォルトの名無しさん2014/07/30(水) 19:32:53.44ID:DLJkd0ah
>>237
collectionてのがあるらしいぞ
これで一番目は解決だな

http://www.moug.net/tech/exvba/0030003.html

ソートはVBAにはメソッドないらしいな
作るの超めんどくせえから上の言うようにセルに書き出してソートした方が早そうだぞ
0246デフォルトの名無しさん2014/07/30(水) 19:33:43.49ID:aI8uJF/z
>たくさんのセルの値を1つの配列変数に入れ
>そのあと重複している値は1つだけ残してあとは削除し


別に配列に入れる必要なんかないだろ、これ。
シートに1列に並べてソート、重複の削除をすれば良いだけだろ?
0247デフォルトの名無しさん2014/07/30(水) 19:42:11.14ID:8DFz/FdQ
>>245
配列の構成にもよるけど
データ量が数百件程度ならバブルソート(?)組めば
なんとか使えるけどもね(数行で作れる)
0248デフォルトの名無しさん2014/07/30(水) 19:52:45.47ID:DLJkd0ah
てか最初からセルに入ってんのかよ
ならセルでソートして上のコレクションにぶちこめば終わりじゃねーか
0249デフォルトの名無しさん2014/07/30(水) 20:31:41.07ID:ROGffPQs
>>242
Javaなんて最近になってラムダ式付いたくせに偉そうに
0250デフォルトの名無しさん2014/07/30(水) 22:19:03.95ID:Z0Vu5FUe
みんな困っているようじゃないか。
ここは誰か一人がコードを書いてくれたら
他のみんながそれを使いまわせばみんながハッピーになれるんじゃないか?
0251デフォルトの名無しさん2014/07/30(水) 22:31:29.89ID:Eswcz3fC
Recordsetオブジェクト
0252デフォルトの名無しさん2014/07/30(水) 22:34:50.45ID:Z0Vu5FUe
>>251
それはなに?
Accessかなにかのデータベース使うの?
0253デフォルトの名無しさん2014/07/30(水) 23:09:24.47ID:aI8uJF/z
重複削除 A列を見て

For j = .CurrentRegion.Rows.Count To 1 Step -1
If .Offset(j, 1) = .Offset(j - 1, 1) Then
.Offset(j, 1).EntireRow.Delete
End If
Next j

※事前に並べ替えられていること
0254デフォルトの名無しさん2014/07/30(水) 23:13:12.97ID:WA0kT7am
cellの削除なんて時間かかるじゃん
上にサンプルのせたのに

Dim MyData As New Collection
Dim i As Long

On Error Resume Next 'データを登録する間、エラーを無視する
For i = 1 To 10
MyData.Add Cells(i, 1).Value, Cells(i, 1).Value
Next i
On Error GoTo 0

で終わり
0255デフォルトの名無しさん2014/07/30(水) 23:32:36.49ID:8DFz/FdQ
重複削除なら
作業列とか作業用シートが使えるなら
Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True

但しA1 はデータでは無く列名(適当に "ああああ"とかでいいと思う)を入れる事
(じゃないとエラーになる)
0256デフォルトの名無しさん2014/07/31(木) 00:38:48.83ID:zBkjzOCI
コレクションも罠があってキーの大文字小文字を区別しないので注意
0257デフォルトの名無しさん2014/07/31(木) 01:09:02.16ID:kpP8LBS0
>>254
時間かかる事を気にするなら
一回一回 セル アクセス するより
一度で配列に入れてからの Collection追加の方が早いとおもうぜ
0258デフォルトの名無しさん2014/08/02(土) 16:08:36.44ID:fbt+8TPU
列挙型を文字列で実現するためにはどうすればいいですか?
0259デフォルトの名無しさん2014/08/02(土) 16:29:24.99ID:/6ki1F6Z
エクセルのデータ内の (〜) 「カッコ内に削除したいデータがあって
そのデータを()ごと削除する方法があったらを教えてください
0260デフォルトの名無しさん2014/08/02(土) 16:48:17.89ID:fbt+8TPU
>>259
Sub test()
Dim a As Range
For Each a In ActiveSheet.UsedRange
If InStr(a, "(〜)") > 0 Then
a = Left(a, InStr(a, "(〜)") - 1) & Right(a, Len(a) - InStr(a, "(〜)") - Len("(〜)") + 1)
End If
Next a
End Sub
0261デフォルトの名無しさん2014/08/02(土) 16:50:14.14ID:/6ki1F6Z
「 ああああ 」 いいいいいいいい 「 うううううう 」の場合
「」内と「」が削除されるので
いいいいいいいい、となるようにしたいのです
0262デフォルトの名無しさん2014/08/02(土) 17:07:00.56ID:Ef/k9dKo
正規表現で"「.*」"を""に置換
0263デフォルトの名無しさん2014/08/02(土) 17:50:48.49ID:/6ki1F6Z
アドバイスありがとうございます。
ですが私の力不足のためかうまく動いてくれませんでした。
【@@】や【0123】←と同じ様になっている箇所を削除するソースコードをお願いできたらと思います。
やり方としてはIfを使い 【 という文字が来たらその後 】 が現れるまで文字を確認しながら削除し続けるというものになると考えますが、
VBAを初めて日が私には記述方法がまだよくわかりません。
もしお時間がりましたらどうぞよろしくお願いします。
0264デフォルトの名無しさん2014/08/02(土) 17:55:39.79ID:/6ki1F6Z
できました。
少し書きなおして調整したらうまくいきました。
>>262様ありがとうございました。
0265デフォルトの名無しさん2014/08/02(土) 19:45:35.90ID:UP+XFeb4
>>258
.Netであれば属性クラスを利用する手段があるけど、
残念ながらVBAにはそんな機能はない。
なので、クラスを列挙体に見立てて各アイテムに当るものをString型の定数として定義する。
ただ、VBAは一つのファイルに複数のクラスを定義することは出来ないので、
その都度クラスを作らなければならないのが難点。
0266デフォルトの名無しさん2014/08/02(土) 23:01:19.37ID:q/4scjvi
>>258
列挙体のどの機能が必要?
単純には

Const Apple As String = "Apple"
Const Orange As String = "Orange"
...
Dim X As String
X = Apple
Select Case X
Case Apple
...
Case Orange
...

で、いいと思うが。
0267デフォルトの名無しさん2014/08/02(土) 23:30:15.95ID:UP+XFeb4
>>266
多分だけど、効率化とコーディングミスを減らせるように
インテリセンスが効くようにしたいんだと思う。
Enum使う醍醐味って言ったらまずそこだろうから。
0268デフォルトの名無しさん2014/08/02(土) 23:38:10.39ID:UP+XFeb4
ああ、ここで言っているインテリセンスと言うのはもちろんそれを指定したら
文字列が取れるものと言うことね。
いくらインテリセンスが効いてもそれを指定して数値がとれて、
それに対応した文字列プログラムであとで設定するのであれば
Constで定義するのとあまり変わらないだろうし、その分プログラムミスする可能性が増えるだろうから。
0269デフォルトの名無しさん2014/08/03(日) 01:36:50.37ID:wPxoYZY8
スニペット
0270デフォルトの名無しさん2014/08/03(日) 17:42:20.75ID:6cN1FsJP
みなさんシートを特定するのに
Sheets("DATA1")とか、Sheets("Sheet" & i)みたいにやっていますよね?
これはまるでSheetsが配列変数名で、要素数が文字列、のようになっています。

このように配列変数のカッコ( )の中が整数じゃなくて文字列にしたいときはどうやって実現させますか?
0271デフォルトの名無しさん2014/08/03(日) 17:59:12.22ID:4XbJJHdT
>>270
CollectionかScripting.Dictionary
0272デフォルトの名無しさん2014/08/03(日) 18:00:11.98ID:wVcpRmRy
Variant で受けて、VarType で型を判断して、型に従った処理すればいいかと
0273デフォルトの名無しさん2014/08/03(日) 18:18:34.55ID:wPxoYZY8
>>270
連想配列というのがちゃんとある
0274デフォルトの名無しさん2014/08/03(日) 19:12:57.74ID:RYNd/+Rv
>>270
それ用のエンティティクラスを作成する。
0275デフォルトの名無しさん2014/08/04(月) 14:57:23.18ID:NziPb5SI
質問です。
使用OSはWindows7でExcelは2010を使用しています。

wwww ああああああ
wwww いい
yyyy ううううう
yyyy えええ
yyyy おおおおお

を

wwww ああああああ いい
yyyy ううううう えええ おおおおお

というようにしたいのですが、なにかよい方法はないでしょうか?
VBAでなく正攻法の様な方法もあればお教え下さい。
0276デフォルトの名無しさん2014/08/04(月) 15:22:23.11ID:nTN+njNA
VBAだと正攻法ではないと。
ここ、VBA質問スレなんだけど。
0277デフォルトの名無しさん2014/08/04(月) 15:26:11.92ID:nxovB/WP
関数で何とかしたいって事か?
0278デフォルトの名無しさん2014/08/04(月) 16:04:37.51ID:skJd4XQH
正攻法はクロス集計できる統計解析ツールかアドイン使え

VBAなら素直にコーディングしていくのが良いかねぇ
元データ変形させて良いのかとか、1列目でソートされてるのかとか
仕様に不明な点はあるけど
0279デフォルトの名無しさん2014/08/04(月) 16:11:27.81ID:NziPb5SI
>>277
はい、その通りです。
0280デフォルトの名無しさん2014/08/04(月) 16:52:16.67ID:NziPb5SI
置換と重複の削除を併用してもう少し簡略化させてから再挑戦してみます。
0281デフォルトの名無しさん2014/08/04(月) 17:43:10.08ID:Niv8kaxM
アルファベットをキーにして
同じキーなら文字列を繋げたいってことか?
ならコレクションに入れつつ
キーが被ったら(エラーになったら)そのキーの文字列につないで
また入れればいいんでね?
0282デフォルトの名無しさん2014/08/04(月) 18:05:23.49ID:skJd4XQH
連結じゃなくて縦横変換やりたいだけだと
0283デフォルトの名無しさん2014/08/07(木) 23:37:49.69ID:TSahGoL1
ユーザーフォームに入力した値を指定セルから順に一文字ずつ入力させたいのですが、つまってます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$A$1" Then
UserForm1.Show vbModeless
End If
Cancel = True
End Sub

で指定セルからユーザーフォームを呼び出し、テキストボックスの値を、後ろから順に入力したい場合どのようにすれば良いのでしょうか?

例えば、↓のうちE1を指定セルとして「1234」を入力した場合、E1=4、D1=3、C1=2、B1=1としたいのです

 A B C D E
1
2
0284デフォルトの名無しさん2014/08/08(金) 00:48:04.01ID:SLBInlPK
>>283
指定セルってなんぞや?
Targetのことならコード中では$A$1になってるし、
説明文中ではE1だし、この質問からでは理解できん。

仮に指定セル=E1がターゲットのことだとして、
ユーザーフォームからテキストボックスに入力した文字数が
もしも6文字以上だった場合どうするのか
(どういう挙動をさせたらいいのか)もわからん。
もう一度質問内容を整理して書き直したほうが良いと思うよ
0285デフォルトの名無しさん2014/08/08(金) 01:08:03.18ID:ZZsJf1aL
まあ、こんな感じか
Dim i As Long
Dim targetCol As Long
targetCol = Sheet1.Range("E1").Column
For i = Len(TextBox1.Text) To 1 Step -1
Sheet1.Cells(1, targetCol).Value = Mid(TextBox1.Text, i, 1)
targetCol = targetCol - 1
If targetCol <= 0 Then Exit For
Next
随所に手抜きがあるが
0286デフォルトの名無しさん2014/08/09(土) 21:32:54.88ID:ZP+8lncr
>>284
すまん、説明が下手だった
やりたいこととしては、
1 セルをダブルクリックで選択(セルは複数指定できるようにしたい)
2 ユーザーフォーム表示
3 ユーザーフォームのテキストボックスに数値を入力
4 OKボタンを押す
5 OKボタンを押すと、テキストボックス値をダブルクリックしたセルから左のセルへ順に入力(1234なら、4から順に左のセルへ)
 
0287デフォルトの名無しさん2014/08/09(土) 21:41:06.52ID:eBEiJfpc
もう少し詳しく
0288デフォルトの名無しさん2014/08/09(土) 22:42:56.97ID:5kOrjYhv
>>286
「UI」と「処理」を分けて説明しる

UI:
「指定セル」をダブルクリック?で選択(複数可?)
「値」をユーザーフォームで入力

処理例1(E1に「1234」)
 E1 = 4
 D1 = 3
 C1 = 2
 B1 = 1

処理例2(C3に「3.14」)
 C3 = "4"
 B3 = "1"
 A3 = "."
 〓3 = "3" 'エラー

ということでOK?
0289デフォルトの名無しさん2014/08/09(土) 22:53:03.45ID:r75duSxH
>>286
やりたい事はこうゆう事?
>5 OKボタンを押すと、テキストボックス値をダブルクリックしたセルから左のセルへ順に入力
下は ユーザフォームに書く

Private Sub CommandButton1_Click()
Dim Target As Range
Dim Cel As Range
Dim Text As String
Dim OffsetNum As Long
Dim TextPtr As Long
Text = Me.TextBox1.Value
Set Target = ActiveCell
If Text = "" Then
  Unload Me
  Exit Sub
End If
If Target.Column < Len(Text) Then
  OffsetNum = Target.Column - 1
  Else
  OffsetNum = Len(Text) - 1
End If
TextPtr = Len(Text) - OffsetNum
For Each Cel In Target.Offset(, OffsetNum * -1).Resize(, OffsetNum + 1)
  Cel.Value = Mid(Text, TextPtr, 1)
  TextPtr = TextPtr + 1
Next
Unload Me
End Sub
0290デフォルトの名無しさん2014/08/09(土) 23:44:47.65ID:ZP+8lncr
>>288
すまん、その通りにしたいんだ
0291デフォルトの名無しさん2014/08/10(日) 01:48:01.15ID:efFeBW9z
>>286
>>285のコードで不満なのか?
02922842014/08/10(日) 03:37:19.81ID:MFQAEfCR
>>290 
>>288の例2ではエラーが発生してるけど本当にそれでおkなの?
エラーってことはそこで処理が止まっちゃうけど。
要するに指定セルの左側にあるセルの数よりも
入力した文字の文字数が大きいと全部エラーが出るって事で良いの?

あと、複数のセルを選択した場合に
ユーザーフォームで得た値の出力がどうなるのか
全くイメージ出来ないんだけど、もうちょっと詳しく説明できる?

例えばE1とF11を選択した場合にどういう風に出力されるの?
あるいは、C1とD1を選択して入力文字数が2文字以上だと、D1からの出力分とC1からの出力分がダブるけどどうするの?

多分君はこういう事態は全く想定していないんじゃないだろうか?
それが悪いとは言わないけれど、仕様が曖昧なままでコードを書くことは出来ない(あるいはバグを内包したコードになる)よ。
まして自力で無く他人にコード書かせるなら、そういうあやふやな点はきちんと説明できるようにしないとダメだよ。
0293デフォルトの名無しさん2014/08/10(日) 08:25:15.86ID:aTEKyeJh
http://www.buzzword.jp/img/face10.png
0294桃白白 ◆9Jro6YFwm650 2014/08/10(日) 08:33:25.52ID:ogxmV0hN
http://img.yaplog.jp/img/07/pc/h/a/k/hakkinn/9/9390.jpg
0295桃白白 ◆9Jro6YFwm650 2014/08/10(日) 08:36:18.15ID:ogxmV0hN
http://www.webdice.jp/diary_images/20101021/4868_1287620504_l.jpg
0296デフォルトの名無しさん2014/08/10(日) 08:52:02.59ID:61oc51cO
どうせならエロ画像貼ってくれよ
0297デフォルトの名無しさん2014/08/10(日) 08:53:07.94ID:uVSascdB
了解しました。

http://sagisyouzai-bokumetu.jp/wp-content/uploads/2014/07/fad93cc5.jpg
0298デフォルトの名無しさん2014/08/10(日) 10:15:21.62ID:zo9IFsz+
>>297
納得
0299デフォルトの名無しさん2014/08/14(木) 01:14:57.69ID:vugbCcGA
今生年月日が書いてあるシートから月の数をカウントして
1月誕生日の誕生日?人みたいなプログラム作っているんだけど
1 |月   2|月
3 | 人 1|人      みたいな
Sub Sample1()
Dim i As Integer, a As Range, b As Integer, c As Integer
Dim r As Variant

''i 有給使用日カウント
''r 入力のカーソル
''k 誕生日月のカーソル
''a 誕生日があったら1を置く


''初期設定
ActiveWorkbook.Worksheets("入力").Activate
Set r = Worksheets("入力").Cells(1, 1 + i)
Set k = Worksheets("sheet2 ").Cells(2, 1)
Set a = Worksheets("sheet2 ").Cells(1, 1)

For b = 0 To 11
Call abc誕生日カウント(a, r, i, k)
k = k.Offset(0, 1) ''月を来月に
r = r.Offset(0, 1)
If r.Columns = 4 Then Exit For
Next b
End Sub
確かこんな具合で作ったんだが If r.Columns = 4 の所で「オブジェクトが必要です。」って言われるんだ
line制限で書けなかったがcallで読んだ先には「もしAさんの誕生月とkが指す数字が一緒だったら+1しろ」ってことが書いてある。
この場合 r がオブジェクトに指定されてないってことなのかな?
分かる人おしえてくれないか
0300デフォルトの名無しさん2014/08/14(木) 01:31:14.73ID:vugbCcGA
iの有給使用日は気にしないでくれ
新しく入った会社が夏季休暇がなくて
有給使わないと夏休みが取れないと言われたことを考えてただけだ…
0301デフォルトの名無しさん2014/08/14(木) 02:01:27.12ID:sRN+xfnp
やってる事の説明がまったく理解できんが
r = r.Offset(0, 1)
これ、Set使わんとrはオブジェクト(Range型)じゃなくなってるぞ
r.Offset(0, 1) のデフォルトプロパティが入ってる
0302デフォルトの名無しさん2014/08/14(木) 02:13:07.14ID:EkQtydyG
デフォルトプロパティで質問なのですが
あるオブジェクトがあって、そのデフォルトプロパティが何なのかはどうやって調べますか?

たとえばRangeオブジェクトが1つのセルならデフォルトプロパティはそのセルの表示されてる値であろうということは予測できますが、それはどうやって予想を確信に変える?
0303デフォルトの名無しさん2014/08/14(木) 03:01:42.47ID:sRN+xfnp
ドキュメント読めや
まあ、イマイチ正確じゃないドキュメントもあるがな
Rangeのデフォルトプロパティとかその代表だがw
わからなければ使わなければ(省略しなければ)良いだけの話
0304デフォルトの名無しさん2014/08/14(木) 03:10:36.61ID:sRN+xfnp
正確なデフォルトプロパティ知りたければオブジェクトブラウザ使え
ただそのプロパティが何をしてるかは結局ドキュメント見ないとわからん
ドキュメントに書いてない事もあるけどな
0305デフォルトの名無しさん2014/08/14(木) 08:54:16.00ID:EkQtydyG
オブジェクトブラウザ見ても
デフォルトプロパティがとれか印が書いてないのですが・・・
0306デフォルトの名無しさん2014/08/14(木) 12:40:44.77ID:EkQtydyG
配列の文字列の中に特定の語句が含まれているかを知るには
どういうコードが一番シンプルですか?
0307デフォルトの名無しさん2014/08/14(木) 13:04:50.98ID:OT/l+QiD
>>306
こんなん
Sub macro1()
 Dim a(2) '配列の準備
 a(1) = "aaaa"
 a(2) = "bbbb"
 
 If InStr(Join(a, vbNullChar), "語句") Then
  MsgBox ("入ってます")
 End If
End Sub
0308デフォルトの名無しさん2014/08/14(木) 13:43:42.84ID:EkQtydyG
>>307
ありがとうございます。
うまく動きますね。

ところで、<続>
0309デフォルトの名無しさん2014/08/14(木) 13:45:57.96ID:EkQtydyG
わたしが考えた次のコードがうまく動かない「理由」を、今後のVBAマスターへの道として熟知しておきたいのですが
その理由はなんでしょうか?

■macro2の例→全く動かない
Sub macro2()
Dim a(2) As String '配列の準備
a(1) = "aaaa"
a(2) = "bbbb"

If WorksheetFunction.CountIf(a, "aaaa") Then
MsgBox ("トイレ入ってます")
End If
End Sub

■macro3の例→入っていない語句のときのみエラーが出る。
Sub macro3()
Dim a(2) As String '配列の準備
a(1) = "aaaa"
a(2) = "bbbb"

If WorksheetFunction.Match("aaaa", a, 0) Then
MsgBox ("トイレ入ってます")
End If
End Sub
0310デフォルトの名無しさん2014/08/14(木) 14:46:46.30ID:Q87dIpVv
>>309
トイレに入ってないから
0311デフォルトの名無しさん2014/08/14(木) 21:16:38.99ID:JYipffjU
A1、A3、B2に、ダブルクリックでユーザーフォームを呼び出し
C2、D1、F5に、ダブルクリックでセルの大きさに対応した楕円を描き、またダブルクリックで描いた楕円を消す
といった、処理をさせたいのですが、どのようなコードとなるのか教えて頂けないでしょうか?
0312デフォルトの名無しさん2014/08/14(木) 22:35:34.52ID:vugbCcGA
ユーザーフォームにスイッチ作って
それにプログラム挿入したほうが見やすくね?
0313デフォルトの名無しさん2014/08/15(金) 00:31:11.29ID:pQdhaImp
>>312
なるほど、ユーザーフォームを複数つくって呼び出したほうがコードも簡素化できそうですね
ユーザーフォーム1、ユーザーフォーム2をつくるとして

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Range("A1, A3, B2") = "" Then
UserForm1.Show vbModeless
End If
End Sub

ユーザーフォーム1は↑で呼び出せるのですが、C2、D1、F5セルをダブルクリックした場合にユーザーフォーム2を呼び出すには、どのようにしたら良いのでしょうか?
0314デフォルトの名無しさん2014/08/15(金) 01:15:50.11ID:Vn0qGMis
>>311
書いてみた。

https://friendpaste.com/6XXDDkcruUEuOAAVs7jVMp

ただし、楕円を表示しちゃうと
その下にあるセル部分をダブルクリックするのが非常に難しいので
実質的には楕円を消すことが出来ない。
セルの大きさを凄くでかくしとけば
楕円の外側にあるセル部分をクリックして楕円を消すことが出来る。
03153142014/08/15(金) 01:22:03.00ID:Vn0qGMis
>>313
コード書いててリロードしてなかった……orz

もう問題は解決してるのかもしれないけど、
その>>313のコード正常に動く?

なんだか、
「A1が空白のときにダブルクリックでユーザーフォーム1を表示する」
っていうコードに見えるけど。
0316デフォルトの名無しさん2014/08/15(金) 01:32:08.18ID:uZUnulqt
>>313
ユーザーフォームで処理する方針に変えたみたいだけど
ダブル・クリック版 折角作ったからさらしてみる(動かんかったらゴメン)

ダブル・クリックで消すときは"楕円の線の上" 以外で やる事

'Worksheet_BeforeDoubleClickの中へ書く

Dim Shape_Name As String
If Not Intersect(Target, Range("C2,D1,F5")) Is Nothing Then
 Shape_Name = "楕円_" & Target.Address(False, False)
 On Error Resume Next
 Shapes(Shape_Name).Delete
 If Err.Number = 0 Then
   Cancel = True
   Exit Sub
 End If
 On Error GoTo 0
 With Shapes.AddShape(msoShapeOval, Target.Left, Target.Top, Target.Width, Target.Height)
    .Name = Shape_Name
    .Fill.Visible = msoFalse 'これ必須
 End With
 Cancel = True
 Exit Sub
End If
0317デフォルトの名無しさん2014/08/15(金) 07:07:55.68ID:obNCpe85
作成依頼です。よろしくお願いします。
webデータを取得したいですが参考になる物がなかったです。
複数のサイトから<h1>タグで囲ってあるデータを取得するマクロと言うものは作れないのでしょか?
0318デフォルトの名無しさん2014/08/15(金) 08:29:35.96ID:Ue/3fnvo
>>317
作れます
0319デフォルトの名無しさん2014/08/15(金) 09:24:45.75ID:/EWeksvr
>>318
スルーか作るかどっちかにして
0320デフォルトの名無しさん2014/08/15(金) 11:53:10.30ID:ZPM3JqGz
>>319
作りました
03213112014/08/15(金) 12:51:06.09ID:pQdhaImp
>>315
ご指摘の通り、こちらの意図したように動きませんでした。

A1、A3、B2をダブルクリックでユーザーフォーム1を呼び出し、
C2、D1、F5をダブルクリックでユーザーフォーム2を呼び出す

という処理をさせるにはどのようにしたら良いのか教えて頂けないでしょうか?
03223142014/08/15(金) 13:26:23.92ID:Vn0qGMis
>>321
普通は>>314のコードとか>>316さんのコードみたいに
Intersectメソッドを使って判定します。
ダブルクリック時にクリックしたセルの情報は
引数Targetで得られますから、判別したいレンジと照合して
結果がNothingならば重複していない、Nothingでなければ重複している、
と言うことですから、重複していたら

UserForm1.Show

とか

UserForm2.Show

とかすれば良いだけです。
特に難しい事ではないと思いますよ。
0323デフォルトの名無しさん2014/08/15(金) 21:56:55.82ID:43WXST3+
"あああ"という名前のシートがあればそのシートをアクティブに
無ければ"元"というシートをコピーして新たに作りたいです。

どちらの場合も継続処理なのですが
ネットでも本でも分岐したまま終わる例しかありません(on error goto)
どうしたら継続処理できますか?

--------------------------------------
On Error GoTo シート作成
Sheets("あああ").Select

 〜いろいろする〜

 exit sub

シート作成:
Sheets("元").Select
ActiveSheet.Copy After:=ActiveSheet
ActiveSheet.Name = "あああ"

 〜いろいろする〜

exit sub
--------------------------------------
このように同じ記述を複数書くのはちょっと…
0324デフォルトの名無しさん2014/08/15(金) 22:17:32.66ID:a/xxvuaU
>>323
Resume Next

まずちゃんと指定シートがあるかどうかチェックして、エラーが出ないようなコードを書くべきだと思うが
0325デフォルトの名無しさん2014/08/15(金) 22:20:58.95ID:43WXST3+
>>324
ごめんなさいまだまだ初級なものでして
resume next
だと、単にエラーを無視するだけなので場合分けにならないのではありませんか?
どこまでを無視してくれるのかも、よく分かりません
0326デフォルトの名無しさん2014/08/15(金) 23:09:49.53ID:Vn0qGMis
>>325
On Error を使わなくとも、シートの存在を確認して
あればそのままSelect、無ければ作成してからSelectするってやり方もありますね。

シートの存在確認のやり方についてはここに書いてありました。
http://officetanaka.net/excel/vba/tips/tips10.htm
0327デフォルトの名無しさん2014/08/15(金) 23:31:00.51ID:DQu/8q+y
シートを名前じゃなくて番号で選択して名前が一致すれば存在
シートの最大数まで探してなければ、新規に作成
では、ダメですか?
0328デフォルトの名無しさん2014/08/15(金) 23:31:04.41ID:43WXST3+
>>326
そのサイトのやり方を試してみたら
For Each ws In Worksheets
の行で「型が一致しません」というエラーが出ました
エクセル2007でもできますか?
0329デフォルトの名無しさん2014/08/15(金) 23:42:39.54ID:Vn0qGMis
>>327
それでも良いんじゃないですか?

>>328
私は2000ですけど2007でも出来るはずですよ。
エラーが出たとしたら
変数wsの型を間違えてるとかじゃないでしょうか。
0330デフォルトの名無しさん2014/08/16(土) 00:20:38.57ID:Nmd3LyWL
>>329
変数の宣言の仕方を事例どおりにしたらうまくいきました
カンマで区切って2つ同時に、
しかもsubの中というのは始めてです

ありがとうございました
0331デフォルトの名無しさん2014/08/16(土) 00:33:45.00ID:3d9Onywu
>>330
カンマ区切りは関係ないと思います。
Dim ws As Worksheet
Dim flag As Boolean
と書いても動くはずですよ。

あと、宣言の位置の違いは
その変数のスコープ(有効範囲)に関わるものですので
これまた型が違うというエラーとは関係ないと思われます。

Sub(Functionも同様、以下同じ)のなかで宣言したものはSubの中だけで有効になり
Subの外で宣言したものはそのモジュール内(またはもっと広い範囲)で有効です。

ちなみに、変数のスコープは可能な限り狭いほうが望ましいとされていますので
なるべくSubのなかで宣言したほうがよろしいですよ。
0332デフォルトの名無しさん2014/08/16(土) 02:29:56.42ID:KZ6YPwzC
>>325
エラーを無視するのはOn Error Resume Next
そうじゃなくて、エラー処理部分でResume Nextする
0333デフォルトの名無しさん2014/08/16(土) 10:54:07.50ID:3d9Onywu
On Error Resume Next と On Error Goto 〜 Resume Next の2パターンで書いてみた

Sub test1()
Dim ShName As String 'シート名を指定するための変数
ShName = "a" 'シート名の指定
With ThisWorkbook
 On Error Resume Next 'エラーを無視するように指定
 Sheets(ShName).Select '指定されたシートを選択、この時点でシートが存在すればそれがアクティブになるが、存在していなければ別のシートがアクティブのまま
 On Error GoTo 0 'エラー無視の状態を解除
 If ActiveSheet.Name <> ShName Then 'アクティブなシート名の確認
  Worksheets.Add after:=Sheets(Sheets.Count) '新たなシートを既存シートの末尾に追加
  ActiveSheet.Name = ShName 'アクティブシートの名前を変更
 End If '
'この時点で目的の名前のシートが選択されているので、好きなように処理をする
End With
End Sub
Sub test2()
Dim ShName As String
ShName = "b"
With ThisWorkbook
 On Error GoTo Err: 'エラーが出たらエラー処理に飛ぶ
 Sheets(ShName).Select
 On Error GoTo 0
'この時点で目的の名前のシートが選択されているので、好きなように処理をする
End With
Exit Sub
Err: 'エラー処理
 Worksheets.Add after:=Sheets(Sheets.Count)
 ActiveSheet.Name = ShName
 Resume Next 'エラー発生の次の行に戻る
End Sub
0334デフォルトの名無しさん2014/08/16(土) 11:18:25.40ID:hxl4RJQ8
オブジェクト変数を上部の定義部分で定数(Const)として宣言したいのですができません。
どうやるのですか?
0335デフォルトの名無しさん2014/08/16(土) 11:20:03.07ID:hxl4RJQ8
Sub Test()
Dim a As Range
Set a = Sheets(1).Range(Cells(1, 1), Cells(2, 2))
End Sub

この単純なコードが、もしSheets(1)をアクティブにしてる状態で実行するとエラーは出ないのに、他のシートをアクティブにしてるとエラーが出るのはなぜですか?
0336デフォルトの名無しさん2014/08/16(土) 11:44:20.89ID:axhzvrnk
テストってどうしてます?
0337デフォルトの名無しさん2014/08/16(土) 11:47:23.11ID:jCALR/yC
どっかのプログラムと変数かぶってんじゃね?
0338デフォルトの名無しさん2014/08/16(土) 12:15:35.99ID:hxl4RJQ8
>>337
いえかぶってございません。
一番シンプルにした上のコードでやってもエラーがでるのです。
0339デフォルトの名無しさん2014/08/16(土) 12:21:30.97ID:3d9Onywu
>>338
Sheets(1)以外がアクティブな状態で、

Set a = Sheets(1).Range(Cells(1, 1), Cells(2, 2))

だとエラーになるけど、

Set a = Sheets(1).Cells(1, 1).Resize(2, 2)

ならエラーにならない。

なぜそうなのかの理由は分からない。
03403392014/08/16(土) 12:26:32.73ID:3d9Onywu
と、>>339を書いてから理由が分かった。
Sheets(1)がアクティブな状態では

Set a = Sheets(1).Range(Cells(1, 1), Cells(2, 2))

と書けば

Set a = Sheets(1).Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))

の意味になるが、

Sheets(1)以外がアクティブだと(たとえばSheets(2) がアクティブなら)

Set a = Sheets(1).Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))

と言う風になっちゃうからエラーが出るんだ。
03413392014/08/16(土) 12:47:19.68ID:3d9Onywu
つまり、
Cells()の部分がポイントで、

Cells(1, 1)

とはすなわち

ActiveSheet.Cells(1, 1)

を意味している訳だ。

だから、Sheets(1)の "A1:B2" をRange型のオブジェクト変数 "a" に入れたいなら

Dim a As Range
Set a = Range(Sheets(1).Cells(1, 1),Sheets(1).Cells(2, 2))

とするべきで(もちろん>>339にも書いたように他のやり方も有るけど)、
Rangeの前のSheets(1)は不要だし、無意味ってことになる。
0342デフォルトの名無しさん2014/08/16(土) 13:08:43.81ID:qDOV6aef
(そんな事みんな分かってるよ・・・)
03433392014/08/16(土) 13:29:52.22ID:3d9Onywu
まぁ、答えが分かった後からならなんとでも言えますし・・・
0344桃白白 ◆9Jro6YFwm650 2014/08/16(土) 13:34:23.26ID:bhW99ao7
じゃあ桃白白がこのスレで一番お姫様!
0345デフォルトの名無しさん2014/08/16(土) 13:35:21.31ID:3d9Onywu
(そんな事みんな分かってるよ・・・)
0346デフォルトの名無しさん2014/08/16(土) 13:52:06.56ID:qDOV6aef
ム板だよ?さすがにこのレベルは誰でも分かるよ
03473392014/08/16(土) 14:01:12.31ID:3d9Onywu
>>346
それは違うでしょう、現に質問があったわけですから。
私もこの質問が出るまでそんなこと意識して無かったですし。

私や質問者のレベルが貴方もしくは貴方の想定レベルよりも
低いと仰りたいならそれは構いませんが、
それをここに書き込むことに意義があるとも思えないです。
0348デフォルトの名無しさん2014/08/16(土) 14:33:26.47ID:nQiWsyll
ゴミはゴミなりにゴミコードを提示してください
0349デフォルトの名無しさん2014/08/16(土) 19:53:42.11ID:KZ6YPwzC
>>341
>Cells(1, 1)
>とはすなわち
>ActiveSheet.Cells(1, 1)
>を意味している訳だ。
そうとも限らんがな
Sheet1のモジュールに書いたCellsはアクティブ関係なくSheet1.Cellsの意味だ
0350デフォルトの名無しさん2014/08/16(土) 20:33:56.39ID:3d9Onywu
>>349
あぁ、そういえばそうですね。
標準モジュールのことしか想定してませんでした。
ご指摘ありがとうございます。
0351デフォルトの名無しさん2014/08/16(土) 22:58:41.93ID:hxl4RJQ8
>>341
すばらしい!
頭がさえていますね。
0352デフォルトの名無しさん2014/08/16(土) 23:16:12.48ID:nQiWsyll
凄い清々しい自演だ
0353デフォルトの名無しさん2014/08/16(土) 23:29:50.98ID:hxl4RJQ8
次のお題です。

オブジェクト変数を上部の定義部分で定数(Const)として宣言したいのですができません。
どうやるのですか?
0354デフォルトの名無しさん2014/08/16(土) 23:41:01.27ID:3d9Onywu
>>353
ググッたけどオブジェクト型は定数に出来ないらしいです。

http://www.tipsfound.com/VBA/02006.vbhtml

ここに

>定数は数値や日付、文字列などの値型を設定できます。Object 型は定数にできません。

と書いてありました。
0355デフォルトの名無しさん2014/08/17(日) 21:16:46.02ID:rFyPTDFj
エクセルからエクセルの差し込み印刷の方法がわかりません。
名前だけ変えて印刷を100枚くらいしたい
エクセルからワードは簡単に行けるのになんでエクセルからエクセルだと難しいんだよ!
0356デフォルトの名無しさん2014/08/17(日) 21:18:46.49ID:sI1u/7Zz
はい次の方
0357デフォルトの名無しさん2014/08/17(日) 22:55:02.54ID:Z18r2/7O
エクセルからエクセルの差し込み印刷の方法がわかりません。
名前だけ変えて印刷を100枚くらいしたい
エクセルからワードは簡単に行けるのになんでエクセルからエクセルだと難しいんだよ!
0358デフォルトの名無しさん2014/08/17(日) 23:19:56.89ID:goK70HR7
>>357
素直にワード使ったら良い気がするけど、エクセルでやりたい人もいるみたいね
http://oshiete.goo.ne.jp/qa/3597313.html
0359デフォルトの名無しさん2014/08/17(日) 23:25:16.16ID:sI1u/7Zz
はい次の方
0360デフォルトの名無しさん2014/08/18(月) 20:34:57.70ID:dWD6IcGe
質問があります。

Dim t as Range, a As Integer,b as Integer

Set t = Cells(1,1)

For a = 0 to 20
t =Cells(1 + b ,1 +a)

Next a
こんな式があるとして
もし列が10行目に来たらb = b+1 をしたいんだがどう書けばいんですかね?
0361デフォルトの名無しさん2014/08/18(月) 21:54:37.38ID:1WOkYmL9
if 1 + a = 10 then
b = b + 1
end if

とか?
0362デフォルトの名無しさん2014/08/18(月) 23:42:48.49ID:BUu0R5S/
VBAで長々と自動計算している途中で、
対数グラフを書き続けるのですが
計算値によってはエラーのダイアログが出ることが1000回に1回くらいあります。
OKボタンを押せばそのまま継続されるのですが
外出している間に作業させているとそこで止まってしまいます。

グラフの描写はVBAによるものではなく、
VBAの計算によってオマケで描かれるものなので
どうやって制御していいかわかりません。

�@エラーダイアログを出さない方法
�Aダイアログが出ても自動でOKボタンを押してくれる方法

いずれかをご教授いただきたくよろしくお願いします。
0363デフォルトの名無しさん2014/08/19(火) 01:17:29.19ID:byB5OjGw
>>362
どこから何のエラーが出てるのかわからんのに何とも言えんわ
とりあえずOn Error Resume Nextでも使っとけ
0364デフォルトの名無しさん2014/08/19(火) 07:53:42.55ID:Oggs/IzO
>>362
エラーが出てから対処するのはあくまでも次善の策であって、
本質的にはエラーを出さないようにするべきです。
エラーの出る理由や場所が分かっているならその部分の改善を目指しましょう。

なんにせよ、もっと具体的に情報(実際に使用しているコードなど)を開示しなければ
こういう通り一遍のアドバイスしか回答出来ないですね。
0365デフォルトの名無しさん2014/08/19(火) 10:21:01.79ID:d+6xgAf5
>>362
VBAのエラーでは使ったことないけど、uwscっていうフリーウェアで
「いつ出るかわからないダイアログを監視してOKボタンを押す」ってのをやったことならある
0366デフォルトの名無しさん2014/08/19(火) 11:04:04.78ID:PkLqxymb
初心者です。
OSはwondows8.1 で、excel2013です。
エクセルからIEに繋いで下記サイトへの自動ログインを考えています。
フォーム入力はできたのですが、ログインボタンのクリックができません。
参考書や検索をしてみたのですが、分からなかったのでよろしくお願いします。
https://espc.jip-jet.ne.jp/login.con?code=063
03673622014/08/19(火) 17:11:31.35ID:eQam0mns
>>363-364
エラー内容は
「負の数値またはゼロは、対数グラフに正しくプロット されません。
 対数目盛では、正の数値だけが有効です。」

計算上、ゼロが出てくるパターンは避けられないのです。

for nextで
パラメータを変えながらある計算ルーチンを3000回くらいします
その過程でグラフを作成するのですが
パラメータによってゼロ計算が出てしまうのです。

ルーチンからグラフ作成を外せば?という意見があると思いますが
パラメータをVBAじゃなくて手入力で入れてみて
結果を見てみたいときもあるので、
グラフはそのまま残したいのです。

VBAと手入力は別ファイルでやれば?という意見もあると思います。
だけど、カスタマイズするときに、そのたびに
両方のファイルを同じようにいじらなければいけなくなります。

そのため、VBAを動かしているときは、このエラーを出ないようにさせたいのです。
エラーが出るのは、3000回のうち、数回程度。
よろしくお願いします。
0368デフォルトの名無しさん2014/08/19(火) 17:39:28.42ID:Sw28RQP5
対数グラフやめればいい。
03693642014/08/19(火) 18:17:45.47ID:Oggs/IzO
>>367
計算とグラフの表示をともにVBAでやらせているのならば、
グラフプロット前にデータをチェックして、
不正な値が含まれている場合にグラフの表示をキャンセルすれば
良いのではないですか?

グラフを表示させる前にグラフにする範囲(Range)に含まれるデータが
正の値かどうかをチェックするだけですから、それほど難しくなさそうですが。
0370デフォルトの名無しさん2014/08/19(火) 18:37:42.08ID:Sw28RQP5
0が含まれるデータを対数グラフで表すの無理に決まってるだろうが。
俺の過去の案件では、予めリニアと対数の切替機能があって、0が含まれたデータを読み込んだ場合は、ダイアログで通知するとともにリニアグラフとして対応させてたわ。
0371デフォルトの名無しさん2014/08/19(火) 19:51:04.91ID:eQam0mns
>>369
どうやってキャンセルできるのでしょうか?

VBAが、あるセルにパラメータを入れることで
他のシートやセルのデータを読み込んで計算をします
その結果、すでに作られているグラフの
元データの範囲のデータが入れ替わります
そのため、自動的にグラフが描かれます

つまり、グラフを描いているのはVBAではなく、
パラメータを入れた後の計算式です
なので、エクセル側?が計算するまでは
入力値ゼロになるかどうかは分かりません
VBA側で判断することはできません
(あるセルの範囲がゼロだったら…という読み込みをやる前に
 エラーダイアログは出てきてしまうのですから)
0372デフォルトの名無しさん2014/08/19(火) 20:05:41.34ID:byB5OjGw
グダグダ言うならソース出せ
0373デフォルトの名無しさん2014/08/19(火) 20:23:51.96ID:eQam0mns
For h = 計算開始 To 計算終了
Sheets("記録").Select
a = Cells(h, 3)
b = Cells(h, 4)
c = Cells(h, 5)

Sheets("計算").Select
Cells(4, 40) = a
Cells(5, 40) = b
Cells(6, 40) = c
Calculate
最終値 = Cells(7, 30)
最大値 = Cells(8, 30)
合計値 = Cells(9, 30)

Sheets("記録").Select
Cells(h, 7) = 最終値
Cells(h, 8) = 最大値
Cells(h, 9) = 合計値
Next h

おもいきり簡略化してます。
記録シートのh行からパラメータabcを読み込んで計算シートに代入すると、
エクセルが自動計算するので最終値などの結果を読み込み、それを記録シートのh行に記録
これを計算開始行から計算終了行まで数千回繰り返して
パラメータの変化に対する最大値等の変化の一覧表ができます

calculateで計算した時に、数千個のアウトプットを計算シートの11行以降に吐き出します
最大値・合計値というのはそれらの最大値、合計値です
それら数千個のアウトプットとした元データであらかじめセットされているグラフシートにグラフが描かれます。
0374デフォルトの名無しさん2014/08/19(火) 20:44:49.64ID:byB5OjGw
肝心のグラフ書いてるデータはどこで、それはどうやってセットしてるのかと
どうやってグラフ書いてるのかわからんのだが

ゼロが書けないグラフなのに、データがゼロになったときはグラフはどうしたいんだよ
0375デフォルトの名無しさん2014/08/19(火) 20:49:30.17ID:v2QnjHZ2
ScreenUpdatingで描画抑制して値チェックできなかったっけ
0376デフォルトの名無しさん2014/08/19(火) 20:52:46.50ID:eQam0mns
>>374
これまで記載したとおり、
・グラフの元データは、計算シートの11行〜5000行に計算されたデータが元になります
 パラメータが変わるたびに、グラフの形が変わります

・VBAでグラフを描くのではなく、エクセル側?で既にグラフはセットされていて、その元データが書き換わるだけです

・パラメータによってはデータにゼロが含まれることがあるので仕方がありません
 グラフはそのゼロの部分は記載されませんが、それで構いません

・forループでグラフはころころ書き換わるのですが、グラフが目的ではないのでスルーでいいのです
 だからエラーダイアログなど出なければ問題ないのです
 エラーダイアログでVBAが中断することが問題なのです

・グラフを外せば、という意見もありますが、パラメータ入力を手入力してグラフの様子を見てみたいときがあるので避けたいのです

・手入力とVBA用に分ければ、という意見もあるでしょうが、両方のファイルを同じように修正を加えるのは大変なので
 そのまま保持したいのです

・VBAの時だけデータ範囲から外せば、という意見もあるでしょうが、要は何回もやることなので、その手間を簡略化したいのです
 そのためのVBAだと思っています
03773622014/08/19(火) 21:07:40.90ID:eQam0mns
期待したいところは、下記のいずれかです。
�@VBAで、ダイアログを出さないようにする
 エクセル側のエラーでもOn Error Resume Nextは有効なのでしょうか
 On Error Resume Nextは使い方がいまひとつ理解できないので
 具体例を記載していただけると助かります。

�AVBAで、エラーが出ても自動でOKを押すようにする

�Bそもそもエクセル側のオプションなどでエラーが出ないようにする
0378デフォルトの名無しさん2014/08/19(火) 21:16:51.60ID:byB5OjGw
計算シートの11行〜5000行は、誰がどうやって数字をセットしてるのかって聞いてるんだが
>グラフはそのゼロの部分は記載されませんが、それで構いません
ゼロじゃなくてブランクセットすれば良いだけじゃないのか
0379デフォルトの名無しさん2014/08/19(火) 21:27:10.37ID:byB5OjGw
軽く試したけど
VBAでセットしてるなら
Range(場所).Value = ""
計算式いれてるならブランクはダメっぽいからNAで
=IF(式>0,式,NA())

これ以上はもう知らん
0380デフォルトの名無しさん2014/08/19(火) 21:30:34.34ID:08bxuLe5
多分セルに値を設定するところでエラーになるから、その前の行に
On Error Resume Next
を入れまくれよ
0381デフォルトの名無しさん2014/08/19(火) 21:37:05.91ID:byB5OjGw
>>380
試した範囲では、1回出ると、ブック開きなおすまで出ないから、単なるエラーじゃなさげ
どっかに制御するプロパティ有るかもしれんが見つけられんしどうでもいい
0382デフォルトの名無しさん2014/08/19(火) 21:48:07.44ID:eQam0mns
>>378>>379
わかりづらかったようですみません
エクセルの関数が入っています
なので、パラメータが入力された時点で自動計算されます
あちこちからデータを読み込で、順次計算されていくので
簡単に標記できるものではありませんが…

マイナス値になることもあって、そのデータがその後も使われるので
(n行目のデータと別途シートにあるデータベースとパラメータから
 n+1行目のデータを求める)
ゼロをブランクにするわけにはいきません

数値は厳然たる結果なのでいじりたくないのです
他への影響が甚大ですから
ダイアログさえ出なければいいのです

対数グラフを使うな、というのも、目的が果たせないので申し訳ないですが受け入れられません

>>381
そういうことです
VBA側のエラーじゃないようなので、VBAで制御できるものなのか?
0383デフォルトの名無しさん2014/08/19(火) 21:51:27.92ID:sAVp/1/i
エラーメッセージにOK押せば結局そのデータは無視されるんだろ
だったらデータいじっても変わらんだろが
お前バカだろ?
0384デフォルトの名無しさん2014/08/19(火) 21:52:57.35ID:eQam0mns
>>383
>>376を読んでください わかりづらい文章で申し訳ないですが
無視でいいんですよ
ダイアログでプログラムが中断されることが問題なのです
0385デフォルトの名無しさん2014/08/19(火) 21:56:49.56ID:i6BfdF31
途中で出ると困るなら、最初にわざと出しとけば。
0386デフォルトの名無しさん2014/08/19(火) 21:57:37.66ID:zpP/a0kx
Application.DisplayAlerts = False
0387デフォルトの名無しさん2014/08/19(火) 21:58:48.96ID:byB5OjGw
>>382
>そのデータがその後も使われるので
計算に使うセル(列)と別に、グラフ表示に使うセル(列)を用意して>>379の計算式入れるだけ
0388デフォルトの名無しさん2014/08/19(火) 22:04:16.83ID:byB5OjGw
>>386
俺が試した範囲ではDisplayAlerts は効いてなかった
つかあれ、グラフ側で出してるメッセージじゃないかと思うんだが確証はない
0389デフォルトの名無しさん2014/08/19(火) 22:09:01.75ID:eQam0mns
とりあえずOn Error Resume Nextで試し中…

Cells(2,2)=Err.Numberがずっと0のままなので、まだ出てきてないようです
0390デフォルトの名無しさん2014/08/19(火) 22:10:11.54ID:eQam0mns
>>387
soreda!
0391デフォルトの名無しさん2014/08/19(火) 23:38:55.49ID:eQam0mns
On Error Resume Nextは効果なしでした
>>387でしのごうと思います
ありがとうございました
0392デフォルトの名無しさん2014/08/20(水) 23:43:13.50ID:k3LytTVX
VBAでSiebelのデータを取得したり、コントロールした事ある方いますか?
検索しても欲しい情報がなくて、とても困っています。
0393デフォルトの名無しさん2014/08/21(木) 10:31:58.13ID:j5D+Vhv3
>>392
俺はSiebelって何の事だかすら知らないけど、
Siebel VBA でぐぐったら英語のページが結構あった。

例えばこんなの
http://it.toolbox.com/blogs/siebel-answers/example-siebel-scripting-through-ms-excel-siebel-com-data-server-26861

VBAのコードには英語も日本語も関係ないので、多少なりとも参考に出来ると思う。
0394デフォルトの名無しさん2014/08/21(木) 21:55:37.19ID:787FWODn
>>392
Siebel知らないが、コントロールするってことはOLEオートメーション?
Siebel側が用意しているメソッド的なのを使用するんなら
頑張って調べるしかないかも
0395デフォルトの名無しさん2014/08/21(木) 22:49:37.71ID:j8w9O0B2
>>393
ありがとう。そう英語のページではありますね。ただ英語の理解力が高くないので
正確な情報が得られず、時間がかかってしまっていて。
リンク先、参考になりそうです。

>>394
頑張って調べます!
THX
0396デフォルトの名無しさん2014/08/22(金) 15:37:07.44ID:cJuKMHCG
http://jobinjapan.jp/job-listing/keyword-vba.html
0397デフォルトの名無しさん2014/08/22(金) 23:24:39.41ID:i1hH/9ZV
VBAで使われる関数をすべて一覧で見たくなったときその方法はありませんか?
インターネットにはつながっていないときを想定してください。
0398デフォルトの名無しさん2014/08/22(金) 23:25:32.20ID:i1hH/9ZV
LEFTとかINSTRとかその他いろいろもろもろね。
0399デフォルトの名無しさん2014/08/22(金) 23:28:35.14ID:i1hH/9ZV
MSGBOXとかINPUTBOXもです。あとAdvancedFilterとかFindもです。これらの使い方を忘れたときに簡単に調べられたら便利だなと思って。
0400デフォルトの名無しさん2014/08/22(金) 23:34:33.47ID:PDdg7gyz
インターネットをお前のPCに保存すればいいだろ
0401デフォルトの名無しさん2014/08/22(金) 23:36:24.85ID:i1hH/9ZV
↑それは無理な現実です。
0402デフォルトの名無しさん2014/08/22(金) 23:39:50.40ID:vApx1yi7
>>397-399
ヘルプでしょ(使い方のってるし)

後は
VBE のオブジェクトブラウザ
0403デフォルトの名無しさん2014/08/22(金) 23:42:59.51ID:i1hH/9ZV
>>402
すばらしい!

そのオブジェクトブラウザをいろいろ探してたのですが
そのどこに載っているのでしょうか?
0404デフォルトの名無しさん2014/08/22(金) 23:45:07.66ID:i1hH/9ZV
ヘルプって常にインターネットへつなぎにいくんじゃ?
0405デフォルトの名無しさん2014/08/22(金) 23:53:15.53ID:i1hH/9ZV
調べ方の質問です。(方法の質問ではございません)
Findという関数を使いたくなったとき、その引数の種類や引数になにを代入するかはどうやって調べますか?
xlWholeやxlPartという定数の文字列を忘れたときどう思い出す(どう調べる)か、とかそういうことって頻繁にありますよね?
この答じゃなくどうやって調べるかを知りたいのです。(そうじゃなきゃ毎回ここ2chで質問することになりますしね)
0406デフォルトの名無しさん2014/08/22(金) 23:57:01.07ID:i1hH/9ZV
ヘルプでFindを調べると
なんと「XlLookAtはクラス」であることがわかりました。

それでオブジェクトブラウザで検索するとXlLookAtというクラスがでてきたのですが
クラス名がたくさんリストで出ているその左側に小さなクラスをあらわしているように思われるアイコンが3種類あるのですが
この3種類のそれぞれの違いってなんでしょうか?
0407デフォルトの名無しさん2014/08/22(金) 23:58:13.42ID:i1hH/9ZV
Class
Module
Enum
の3つのような気がしてきましたが・・・
0408デフォルトの名無しさん2014/08/23(土) 00:01:22.74ID:i1hH/9ZV
RangeのプロパティのAddressをオブジェクトブラウザでみると次のように書いてあります。

====================================================================================================================
Property Address([RowAbsolute], [ColumnAbsolute], [ReferenceStyle As XlReferenceStyle = xlA1], [External], [RelativeTo]) As String

読み取り専用

Excel.Range のメンバ

====================================================================================================================

このAddressはなぜプロパティなのに引数があるのですか?
引数になにを代入してやればいいかはどうやって調べますか?
0409デフォルトの名無しさん2014/08/23(土) 00:04:19.93ID:MQkGQoaj
>>405

>>397 >インターネットにはつながっていないときを想定してください。
この想定だと

>>405 >そうじゃなきゃ毎回ここ2chで質問することになりますしね
これも無理じゃね
2chで質問する=インターネットにはつながっている(携帯であれなんであれ)
0410デフォルトの名無しさん2014/08/23(土) 00:19:17.52ID:Lda5wpha
昔、会社でExcelのヘルプを片っ端から印刷しまくってバインダーに閉じておいたけど
そうじゃなきゃリファレンス的な本を買っとけとしか
0411デフォルトの名無しさん2014/08/23(土) 01:08:52.84ID:atKdjfd4
表があって1列の複数のエントリーの別の列の出現頻度が一番多いものの文字列を取得するにはどうしますか?
もし同数ならその旨のメッセージを表示させます。
0412デフォルトの名無しさん2014/08/23(土) 01:12:26.98ID:atKdjfd4
>>411補足

ちょっと違うけど
例えばSheet1に巨大な名簿があって、そこに名前や出身県や血液型などが書いてあって
任意の県、例えば「千葉県」「滋賀県」「佐賀県」で調べるとその出身の人々が抽出され、その人々の血液型を調べ、一番出現頻度が多い血液型はなにかを調べるコード。
もしA型とB型が同人数の10人だとすれば「同数のため最頻出のものは決まりません」とメッセージが出る。
0413デフォルトの名無しさん2014/08/23(土) 04:25:30.77ID:MQkGQoaj
>>412
その例でいうと
各県で 何度も Sheet1で調査すると 検索事態大変だから

1)ピポットテーブル(県名と血液型の人数)を 別シートに VBA(又は手作業)で作成
   行:県名
   列:血液型
   で 人数を集計したもの

2)その ピポットテーブルを VBAで検索する
  ピポットテーブル用のプロパティもあるけど
  普通のRANGE操作も 可能のハズ
0414デフォルトの名無しさん2014/08/23(土) 06:16:16.76ID:8RITjdqM
>>405
すくなくとも2007までのヘルプはインターネット繋がってなくても使える(ように設定できる)
それ以降のバージョンならしらね

>>406
XlLookAtはクラスじゃなくて列挙のはずだが
どうやって調べてそう言う結論に至ったのか

オブジェクトブラウザのアイコンは3種類じゃなくてもっとあるが
モジュールのアイコンってあったっけ?
良く見るのはクラス、プロパティ、メソッド、列挙、定数 ぐらいじゃね

>>408
プロパティは普通に引数とれる
引数の意味は普通はヘルプにかいてある


お前はオブジェクトブラウザよりヘルプのみかた覚えろ
0415デフォルトの名無しさん2014/08/23(土) 06:19:17.21ID:8RITjdqM
>>411-412
どうしてもVBAだけでやりたかったらベタに数えるしかないけど
なんとかIF系のワークシート関数でやれば良いんじゃないかな
0416デフォルトの名無しさん2014/08/23(土) 06:50:14.97ID:SD9EMvG3
>>397 >>414
2010もネット接続なくてもヘルプは表示できる
こんなふうに全関数の一覧とか出る
http://www.42ch.net/UploaderAnime/source/1408744163.png
0417デフォルトの名無しさん2014/08/23(土) 08:32:25.60ID:rRuNrHr1
au氷水ディレクター戦争指名タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり塩肉マンつばめの巣担々麺野菜炒めラーメン

au氷水ディレクター戦争指名タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン

au氷水ディレクター戦争指名タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン

ニンニクヤーフォー低額土地NHK名古屋遅延電池切れ福岡損保新規駐車近代ゲームフジワイプ転職提案ラーメン
abk公式漏洩安保険王なにあげてんだよ?「わー!ふーう?」↓↓★★↓↓宿題通調印鑑カウントダウン息子議員国会大学生
0418デフォルトの名無しさん2014/08/23(土) 22:22:11.08ID:Lda5wpha
Public Const folder_retu As Integer = 2
Public Const name_retu As Integer = 3
Public Const shubetu As Integer = 4

Sub test1()
Columns("B:C").ColumnWidth = 15
End Sub

Columns("B:C").ColumnWidth = 15
をConstで指定した名前を使って書き換えること出来ませんかね?
0419デフォルトの名無しさん2014/08/23(土) 22:42:51.95ID:atKdjfd4
Columns("B:C").ColumnWidth = folder_retu * 2 + name_retu + shubetu * 2

とすればいいじゃないか
0420デフォルトの名無しさん2014/08/23(土) 22:44:38.94ID:atKdjfd4
>>413
そのヒッポリト星人ってなんなの?

>>415
それは面倒だけどCountif関数を使うってこと?
本当にそんな面倒な方法しかないの?
0421デフォルトの名無しさん2014/08/23(土) 22:56:09.91ID:Lda5wpha
>>419
あ〜すいません、書き方が悪かったか。

Columns(folder_retu:name_retu ).ColumnWidth =15

見たいにB,Cと言った列名をConstで定義したものに置き換えることは出来ないか…ということ
なんですが。

これだと
アプリケーション定義またはオブジェクト定義のエラーです。
になってしまうんですけどね
0422デフォルトの名無しさん2014/08/23(土) 22:58:39.03ID:atKdjfd4
>>421
Cells(1,folder_retu:name_retu).Entirecolumn.ColumnWidth =15
とすればいいじゃないか。
0423デフォルトの名無しさん2014/08/23(土) 23:04:37.75ID:Lda5wpha
>>422
すんませんが、構文エラーになりますorz
0424デフォルトの名無しさん2014/08/23(土) 23:11:04.39ID:6csT3QKU
レトゥ
0425デフォルトの名無しさん2014/08/23(土) 23:20:46.87ID:atKdjfd4
>>421
Range(Cells(1, folder_retu:), Cells(1, name_retu)).ColumnWidth = 15
とすればいいじゃないか。
0426デフォルトの名無しさん2014/08/23(土) 23:21:52.18ID:atKdjfd4
Range(Cells(1, folder_retu), Cells(1, name_retu)).ColumnWidth = 15
0427デフォルトの名無しさん2014/08/23(土) 23:25:55.59ID:Lda5wpha
>>426
出来ました。ありがとう!です
0428デフォルトの名無しさん2014/08/23(土) 23:50:24.47ID:atKdjfd4
>>416
見れないですよ
0429デフォルトの名無しさん2014/08/24(日) 07:59:27.36ID:d+P1Wor6
しかしVBAにしろ他言語にしろもうちょっと公式書籍を充実して欲しいな
明確な仕様が知りたくても曖昧なことがちょろちょろある
0430デフォルトの名無しさん2014/08/24(日) 10:18:50.31ID:orIfuAvn
>>428
単なるヘルプ画面のスクショですよ
ここなら見られるかな
http://www.07ch.net/up2/src/lena12426.png
0431デフォルトの名無しさん2014/08/24(日) 17:04:39.21ID:UwvYeLgq
&
0432デフォルトの名無しさん2014/08/24(日) 17:05:45.84ID:UwvYeLgq
誤爆しました
&の文字が入った文字列を"&"& という形で連結するとエラーが出ます。
&も文字をうまく連結させる方法を教えて下さい。
0433デフォルトの名無しさん2014/08/24(日) 17:25:50.36ID:orIfuAvn
>>432
文字列と何を連結するとエラーになるんだ?うちじゃ再現できないぞ
よくある、&記号の前にスペースを入れ忘れてるだけの話じゃないの?
0434デフォルトの名無しさん2014/08/24(日) 20:47:40.01ID:sJkzEST8
仮にこんなコードがあったとします。

Type Person
Name As String
Age As Integer
End Type

Sub Test()
Dim Student(50) As Person
Dim i As Integer
For i = 1 To 50
Student(i).Name = Cells(i, 1)
Student(i).Age = Cells(i, 2)
Next i
End Sub

この配列変数StudentのメンバNameの文字列で昇順で配列として並べ替えるにはどうすればいいですか?
Student(1).Nameが「あ」ではじまる名前、Studemt(50).Nameが「渡辺」さんみたいに。
0435デフォルトの名無しさん2014/08/24(日) 20:55:23.10ID:8IMXYDXG
>>434
仮でも、Name As Stringはちょっと
0436デフォルトの名無しさん2014/08/24(日) 21:19:58.58ID:0LQb+wex
>>434
ワークシート上でソートしてから配列に入れるほうが簡単
どうしてもVBAで実現したいとなると自分でソートのコードを書かないといけない
0437デフォルトの名無しさん2014/08/24(日) 21:38:15.33ID:sJkzEST8
>>435
なぜ?普通だと思うけど。逆に他にありえなくない?

>>436
やはりそうなのですか。
でももしそうするとダミーのブックを開き、そこで作業して、さいごにダミーのブックを閉じることまでコードに書かないといけないということ?
0438デフォルトの名無しさん2014/08/24(日) 21:45:54.34ID:LyXUXpKW
別にブックでなくてもテンポラリのシートを作ってそこで作業すれば良いでしょ。
んで作業が終わればそれを消すと。

自前でソートするならそのコードを書かなければならないのは当然
マクロの記録を使ってそれを修正した方が楽だと思うけど
0439デフォルトの名無しさん2014/08/24(日) 23:10:58.25ID:d+P1Wor6
>>434
読みでソートするなら読みも格納しないと難しい気がする
0440デフォルトの名無しさん2014/08/24(日) 23:24:46.91ID:sJkzEST8
>>438
にゃるほど。
>>439
読みって?
0441デフォルトの名無しさん2014/08/24(日) 23:34:21.90ID:orIfuAvn
ふりがな
0442デフォルトの名無しさん2014/08/25(月) 02:19:07.38ID:rYG7E1wE
ソートってそんな面倒?
バブルソートでもクイックソートでもググったらコード転がってるのに
0443桃白白 ◆9Jro6YFwm650 2014/08/25(月) 07:48:25.99ID:S6btknby
>>440
辞書順じゃなくて字の読み順ってことでござろう
0444デフォルトの名無しさん2014/08/25(月) 16:44:31.10ID:COD1vbGg
まーたパイパイちゃんは冗談を
辞書順と読み順はおんなじだってば
それを言うなら文字コード順でしょ
0445デフォルトの名無しさん2014/08/25(月) 16:45:54.11ID:COD1vbGg
いちいちggってコード拾うのは面倒だろ
ソート機能ぐらい標準で用意しとけってことだよいわ
0446デフォルトの名無しさん2014/08/29(金) 09:24:49.50ID:QjLb8wHh
コードから
フォームに「ラベルとテキストボックス」のペアを好きな数だけ貼り付けるにはどうしますか?
そのいくつあるかわからない「ラベルとテキストボックス」の直下にボタンを配置もしたいんです。
0447デフォルトの名無しさん2014/08/29(金) 09:52:08.01ID:QjLb8wHh
なのでそのボタンの位置決めコードも。
0448デフォルトの名無しさん2014/08/29(金) 11:16:24.94ID:Wh8kLZnh
コードからは貼らない
位置決めとかフォーム自体のサイズ変更とか色々考えるのがメンドイから、
大きめのサイズでフォーム作っといて、
ラベルやテキストボックスも多めに作っといて、
使わない分はEnableとVisibleをFalseにしておく
0449デフォルトの名無しさん2014/08/29(金) 11:56:20.42ID:QjLb8wHh
>>448
お言葉だけはありがとうございます。感謝いたします。

しかし、使う数は1個から無限個まで考えられるので
あらかじめ作るというのは避けたいのです。

わたしのプログラミング哲学の観点からも
そういうのはダサいのでやりたくないですし。
0450デフォルトの名無しさん2014/08/29(金) 11:57:35.82ID:QjLb8wHh
位置のコードは中学生の数学「一次関数」くらいのレベルだし簡単でしょ。
0451デフォルトの名無しさん2014/08/29(金) 12:17:31.93ID:/kCif9fN
そういうコードを作るだけだね。
0452デフォルトの名無しさん2014/08/29(金) 13:02:35.63ID:QjLb8wHh
どういうコード?
0453デフォルトの名無しさん2014/08/29(金) 13:26:14.05ID:/kCif9fN
『フォームに「ラベルとテキストボックス」のペアを好きな数だけ貼り付ける』コード。
0454デフォルトの名無しさん2014/08/29(金) 14:47:36.87ID:YpEKIFZT
コードで追加したコントロールってファイル閉じた時点で削除されない?
永続的に残るんだっけ?
0455デフォルトの名無しさん2014/08/29(金) 15:23:13.94ID:QjLb8wHh
>>453
こら、まじめにしろ。
0456デフォルトの名無しさん2014/08/29(金) 15:38:15.25ID:DFGfbiHv
プログラミング哲学(笑)
0457デフォルトの名無しさん2014/08/29(金) 15:53:03.64ID:QjLb8wHh
時間だ。答を聞こう。
0458デフォルトの名無しさん2014/08/29(金) 22:15:55.57ID:A4wUco5H
>>449
質問するレベルで何が私のプログラミング哲学だこのやろー(笑)
0459桃白白 ◆9Jro6YFwm650 2014/08/29(金) 22:50:57.59ID:ppLa6QHv
>>458
質問するからってレベル低いわけじゃないよ。
質問することって答えることより難しいんだよ。
答える方は殿下の宝刀ググレカスが使えるし。
ところで殿下の宝刀って間違いなく股間の一物のことです。
以上よろしくお願いいたします。
0460デフォルトの名無しさん2014/08/30(土) 09:36:59.40ID:jOCOz69P
とりあえず>>446-447はググレカスで解決するから低レベルの質問だな
0461デフォルトの名無しさん2014/08/30(土) 10:41:47.87ID:WQwTEzR3
作ってくださいという丸投げですが・・・。
A B C (上のABCが列で左の123が行です)
1 木 草 花
2 1 2 3
3 2 3 4
こんな感じで列毎で銘柄があり、行には1〜5までの数字が入っていきます。
この前提で、各銘柄毎に1〜5がそれぞれいくつあるかがわかるVBAが組みたいです。
やさしいかた、作ってもらえないでしょうか?

ちなみに今は、1行目をオートフィルタして、最後の行にサブトータル関数を使い
各列毎に1〜5のフィルタするというめんどいことしてます。
0462桃白白 ◆9Jro6YFwm650 2014/08/30(土) 10:53:15.74ID:CGzN53tJ
>>461
ナイスクエッション!
桃白白も挑戦しちゃう
0463デフォルトの名無しさん2014/08/30(土) 10:55:24.39ID:mX0xam8l
>>461
わざわざVBA使わんでもcountifでいいじゃん
04644612014/08/30(土) 12:17:33.61ID:WQwTEzR3
>>463
countif関数を知らなくて、調べてみました。
これは便利ですね。これを使えば、オートフィルタがいらないですね。
ただ、銘柄が実際はもっと複数あり、定期的に集計がいるので
VBAを作りたいと思っています。

>>462
桃白白さんありがとうございます。挑戦お願いします!
0465デフォルトの名無しさん2014/08/30(土) 12:57:18.19ID:YUBmgqqm
編集の都度マクロ起動する必要があるし、マクロでUndoが飛ぶデメリットも
0466デフォルトの名無しさん2014/08/30(土) 13:17:09.52ID:wlhWYKB3
>>460
あほ。
それならすべてグーグルで解決するわ。
0467デフォルトの名無しさん2014/08/30(土) 13:22:38.28ID:vWLdYDcC
>>466
だな。ここで質問するのはググるのさえ面倒な時だけだし
0468デフォルトの名無しさん2014/08/30(土) 15:09:19.48ID:jOCOz69P
>>466-467
ならググレよ
面倒とかそっちの都合なんか知るか
ボケ
0469デフォルトの名無しさん2014/08/30(土) 15:54:22.31ID:YUBmgqqm
>>467
>ここで質問するのはググるのさえ面倒な時だけだし
迷惑極まりないし、ググるのが面倒??
全く理解出来ないね
0470デフォルトの名無しさん2014/08/30(土) 17:23:16.94ID:BrsM5WtF
>>461
どういう風に結果表示させたいんだ?
シートに結果表示するならそれこそCountIfだけでいいぞ

まあ暇なんでちょっと作ってみた

Dim c As Long
Dim i As Long
Dim msg As String

For c = 1 To 3 '銘柄最終まで
 msg = Cells(1, c).Value & vbCrLf
 For i = 1 To 5
  msg = msg & CStr(i) & "の個数:" & WorksheetFunction.CountIf(Cells(1, c).EntireColumn, "=" & CStr(i)) & vbCrLf
 Next
 MsgBox msg
Next

たんにCountIfしてるだけw
0471デフォルトの名無しさん2014/08/30(土) 17:31:36.53ID:BrsM5WtF
>>468-469
×ググるのさえ面倒
○ググっても理解できない
0472デフォルトの名無しさん2014/08/30(土) 18:57:14.07ID:vli3pwEW
型宣言しなくてもVBAは変数認識するけど、型宣言するメリットはなんですか?
0473デフォルトの名無しさん2014/08/30(土) 18:59:43.83ID:zHnP+BOD
速度だよ
バリアントだと遅い
0474デフォルトの名無しさん2014/08/30(土) 19:13:54.46ID:cvlIMipg
>>472
暗黙の型変換が行われるから型が結構いい加減だし、遅延バインド(実行してる最中に何の型だったっけかななぁ?って考える)分だけ時間が遅くなる。
0475デフォルトの名無しさん2014/08/30(土) 19:33:59.41ID:BrsM5WtF
開発環境での入力支援ってのもあるな
0476デフォルトの名無しさん2014/08/30(土) 22:37:01.83ID:vWLdYDcC
>>468>>469
ぶっちゃけここで質問されてることの9割以上はググったらわかるだろってレベルだから仕方ない。
ぐぐるのが面倒かググっても分からないバカの質問に対して、自分の知識をひけらかしたいアホが答えてるのがこーいう質問系スレの実態だろ。
0477桃白白 ◆9Jro6YFwm650 2014/08/30(土) 22:46:46.57ID:CGzN53tJ
>>476
WinWinの関係ですね(前向き)
0478デフォルトの名無しさん2014/08/30(土) 23:04:18.52ID:YUBmgqqm
>>477
たまにはいい事言うじゃん
0479デフォルトの名無しさん2014/08/30(土) 23:21:04.78ID:nnVjx8jb
>>473
>>474
なる程、勉強になります!
0480デフォルトの名無しさん2014/08/31(日) 04:44:17.25ID:Tf3p4Sma
ちゃんと質問だったなら気が向いたときに答えなくもないけど
作ってくれは違うくねぇ?
宿題スレがないからココに来るしかないんだろうけど
0481デフォルトの名無しさん2014/08/31(日) 08:28:58.90ID:rhIgfBaF
子供作るよ
0482デフォルトの名無しさん2014/08/31(日) 11:37:06.47ID:Uv1n/GEh
俺は宿題レベルのコード書くの嫌いじゃないけどタイミングが悪い
今から出かけなきゃならないんで
0483デフォルトの名無しさん2014/08/31(日) 19:24:18.31ID:AF7Lg2eh
セルに”1”、”2”、”町”、”区”、”市”、”郡”、”村”、”当”、”普”、とあるものは、ダブルクリックでセルの大きさに合わせた内円で囲み、また○がある場合はダブルクリックで○を消し、
さらに、
Target.Address = "$IF$10" Or Target.Address = "$AG$69" Or Target.Address = "$AG$77" Or Target.Address = "$AG$85" Or Target.Address = "$AG$93" Or
Target.Address = "$AG$101" Or Target.Address = "$AG$109" Or Target.Address = "$AG$117" Or
Target.Address = "$AG$125" Or Target.Address = "$AG$133" Or Target.Address = "$AG$141" Or Target.Address = "$AG$149" Or Target.Address = "$AG$157" Or
Target.Address = "$CN$72" Or Target.Address = "$CN$80" Or Target.Address = "$CN$88" Or
Target.Address = "$CN$96" Or Target.Address = "$CN$104" Or Target.Address = "$CN$112" Or Target.Address = "$CN$120" Or Target.Address = "$CN$128" Or
Target.Address = "$CN$136" Or Target.Address = "$CN$144" Or Target.Address = "$CN$152" Or Target.Address = "$CN$160"
は、ユーザーフォーム1を呼び出すようにし、
上記以外のセルは何もしない
というようにしたいのですが、どのようなコードになるのか教えて頂けないでしょうか?
0484デフォルトの名無しさん2014/08/31(日) 23:12:30.70ID:LiJXg7k/
>>483
丸投げしたいならサンプルのブックをどっかにアップしろ
0485デフォルトの名無しさん2014/09/01(月) 00:08:36.81ID:y5S85mVs
>>483

>>311 と同じような質問で 書き方も似てるけど
同じ人?
解決しなかったの? どっかの宿題なの?
0486デフォルトの名無しさん2014/09/01(月) 14:37:49.12ID:kGtdU4bT
すいません、withステートメントの使用で質問です。
Webクエリのシートをアクティベイトしないで処理したいのですが、
.TextToColumnsのところでエラーが出ます。Replaceも処理されません。
Webクエリのシートを事前にアクティベイトすれば処理できます。
お知恵を拝借させていただきたいです。。

With Sheets("Webクエリ")
 With Range(Cells(1,1), Cells(lastRow,1))
  .Replace What:="万", Replacement:="0000"
  '円でデータ区切り
  .TextToColumns Destination:=Range("J1"), _
    DataType:=xlDelimited, _
   Other:=True, _
   OtherChar:="円", _
    FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
    TrailingMinusNumbers:=True
 End With
End With
0487デフォルトの名無しさん2014/09/01(月) 15:03:15.22ID:Ghq6ppWn
>>486
似たようなのが>>335-350に有った。

With Range(Cells(1,1), Cells(lastRow,1))

を

With Range(.Cells(1,1), .Cells(lastRow,1))

にしたらどうだろう?
0488デフォルトの名無しさん2014/09/01(月) 15:09:53.09ID:y5S85mVs
>>486
全ての RangeとCellsの前に .(ドット)を付ける
0489デフォルトの名無しさん2014/09/01(月) 17:16:20.62ID:qyPBYm3N
Withを使っている時に .(ドット)を付けるのを忘れるというミスをよくやらかして
焦る w
04904882014/09/01(月) 19:08:16.67ID:y5S85mVs
>>486

>>488を 訂正します。

.Range("J1") は With .Range(.Cells(1,1), .Cells(lastRow,1))
に かかってしまうから ちょっとまずい

※不具合パターン
 With Sheets("Webクエリ")
 With .Range(.Cells(2,1), .Cells(lastRow,1))
 Debug.Print .Range("J1").Address '<---これ $J$2になる
 End With
 End With


※外の Withを止めて下にした方がよいかも

Set Ws = Sheets("Webクエリ")
With Ws.Range(Ws.Cells(1, 1), Ws.Cells(lastRow, 1))
  .Replace What:="万", Replacement:="0000"
  '円でデータ区切り
  .TextToColumns Destination:=Ws.Range("J1"), _
   DataType:=xlDelimited, _
   Other:=True, _
   OtherChar:="円", _
   FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
   TrailingMinusNumbers:=True
End With
0491デフォルトの名無しさん2014/09/01(月) 19:46:10.68ID:fU5MWgy3
タイで入出庫を管理するプログラムを作ってくれと言われた。
プログラムは日本で、日本語PCで作成するんですが、実際に使用するのはタイって事です。
で、ポチポチと作ってたんですが、日付の扱いで詰まったので助けてください。

タイで日付はセルにdd/MM/yyyyの形式で表記するそうです。
で、そのセル(01/09/2014)と今日2014年9月1日を条件式で表そうとして、

If Date()=CDate(Cells(1,1)) Then

としたんですが、イコールになりませんでした。
01/09/2014をcdateで認識させても、2014年1月9日になっちゃいます。

どういうふに、グローバルな日付に変換すればいいでしょうか?

If Format(Date(),"dd/MM,yyyy")=CDate(Cells(1,1)) Then
で、とりあえず等式の対処は出来るんですが、
CDate(Cells(1,1))が根本的に間違ってるので、等式はよくても不等式の条件が作れません。

何かいい方法はありますでしょうか?
0492デフォルトの名無しさん2014/09/01(月) 19:55:02.63ID:Zwwv00Rf
Cells(1.1).Value2でいいんじゃね?
0493デフォルトの名無しさん2014/09/01(月) 20:13:13.60ID:A5iVvMsi
>>491
セルの書式設定をしといて、セルに日付型として入れておけ
それだと If Date = Cells(1, 1) Then でいける
0494デフォルトの名無しさん2014/09/01(月) 21:00:46.57ID:N/G4pgmf
印刷設定の2up、両面、カラーとかの印刷設定をvbaから指定する方法はありますか?
リボンに2コイチ両面、片面カラー等、印刷設定ごとの印刷ボタンを作りたいです。
0495デフォルトの名無しさん2014/09/01(月) 21:05:06.22ID:3hW7LmGC
ExcelでMySQLに接続するプログラムを作ったのですが、
MySQLのコネクターをインストールしていないPCでは
使うことが出来なくて困っています。

コネクターが無くても接続することができる
何か、良い方法はありませんでしょうか?
0496デフォルトの名無しさん2014/09/01(月) 23:11:51.20ID:Qes2XjCy
>>494
メーカーに問い合わせ
0497デフォルトの名無しさん2014/09/02(火) 00:03:11.01ID:1brcQyq9
繰り返し処理で、"" と 1 と 2 で繰り返したいんですが、for分だと""が表示できません。
上手く処理できる方法は無いでしょうか?
0498デフォルトの名無しさん2014/09/02(火) 00:41:39.05ID:K9qSSuEh
配列を使って For Eachすればできるけど
なぜそうしたいの?
0499デフォルトの名無しさん2014/09/02(火) 00:51:42.80ID:Vtjclg5C
>>496
機種選ばす、vbaから操作できるようなインターフェースってないの?
set prn = printer(0)
prn.nup(2)
prn.bothside(true)
prn.color(xlMono)
prn.exec
みたいな
0500デフォルトの名無しさん2014/09/02(火) 00:54:38.62ID:Vtjclg5C
>>497
for i = 0 to 100
j = i mod 3
if j=0 then j=""
で、jが12""の繰り返し
0501デフォルトの名無しさん2014/09/02(火) 00:56:21.26ID:7BW5B5hc
>>498
ありがとうございます。
IEを操作してURLを指定してデータを取ろうと考えていて、サイトのページ数がURL の "" 1 2 に相当します。
0502デフォルトの名無しさん2014/09/02(火) 01:01:57.30ID:K9qSSuEh
なら
>>500 さんのパターンで

For i = 0 To 2
 If i = 0 Then
   Page = ""
   Else
   Page = i
 End If


Next

でいいんじゃね
0503デフォルトの名無しさん2014/09/02(火) 01:14:36.19ID:7BW5B5hc
>>500
>>502
教えていただきありがとうございました。
0504デフォルトの名無しさん2014/09/02(火) 01:21:12.86ID:K9qSSuEh
>>503
あと
IE操作関連の質問になると、ここでは スルーされる確立が高いから
(これに反論ある方は  ここでもいいよ!って言って欲しいけど)

もし質問等あるなら
↓ ここの方が良いかも

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/
0505デフォルトの名無しさん2014/09/02(火) 01:43:15.65ID:7BW5B5hc
>>504
ご厚意感謝します。
そちらも見てみます。
0506デフォルトの名無しさん2014/09/02(火) 08:40:23.03ID:JmcyBuux
>>499
ない。他の言語ならある?
・個々の設定でプリンタを複数登録して、プリンタを切替え
・不安定なSendKeys
0507デフォルトの名無しさん2014/09/02(火) 18:02:21.14ID:Vtjclg5C
>>506
メーカーはxeroxなんだけど、ネットワークプリンタなんで印刷時のパケットキャプチャしたらテキストで印刷設定を指定してる部分があったので
やる気が出たら透過プロクシ的なものをローカルに立てます。
ちなみに開発用のツールは30万だった
http://www.fujixerox.co.jp/solution/dsp/product/pslad2/
0508デフォルトの名無しさん2014/09/02(火) 20:09:05.15ID:nwLBFLFa
Windowsの印刷の仕組み自体が基本的な部分だけしか規格化されてない
プリンターの詳細な設定はメーカーごと、機種ごとに全部違う
どんな言語でも制御するのは大変
ネットワークのパケットだけでなく、レジストリや設定ファイルも追跡する必要がある
0509デフォルトの名無しさん2014/09/05(金) 19:32:47.53ID:OYKZwDZq
フォルダをInputBoxの機能で指定して
そこから階層がi (as Integer)までの深さの
すべてのファイルのファイル名を取得してセルに1つずつ表示させるようなツールを作りたいんですが
どうすればいいでしょうか?

コードをすべて書いていただけるととても助かるのですが・・・
0510デフォルトの名無しさん2014/09/05(金) 19:35:03.36ID:OYKZwDZq
フォームにラベルやテキストやボタンを
コードから作成して貼り付けることには成功したのですが
その各コントロール、とくにボタン、で機能するイベントプロシージャってどこに書くんでしょうか?

ボタン押したときに何かさせたいけど
このボタンが上で書いたようコードから作成したものなので
どこにも書く場所がなくて困っています(ワラ
0511デフォルトの名無しさん2014/09/05(金) 20:35:26.61ID:vV8bpRl/
>>509
シェルオブジェクト使って
dir /b /s inputboxで取得したパス
の出力結果に対して行毎に\の数をカウントする。
\の数が、元のパスの\の数+i以下のものが目的のデータになる
0512デフォルトの名無しさん2014/09/05(金) 22:15:48.62ID:vN4cHPD5
for 〜 next文で大きい数字から小さい数字に回すスマートな方法は無いでしょうか?
for 10 to 1 みたいな感じです。
0513デフォルトの名無しさん2014/09/05(金) 22:19:11.72ID:/k9uu/Tc
>>510
フォームってユーザフォームの事?
その場合 一般的には イベントプロシージャは クラスモジュールに作る事になるよ

追加するコントロールが少なくてある程度固定してるなら
予め作っておいて必要に応じて .Visible を設定すれば?
0514デフォルトの名無しさん2014/09/05(金) 22:24:22.52ID:/k9uu/Tc
>>512
君の言う "スマートな方法"の定義は?

普通は
For I = 10 To 1 Step -1
とかだけど
0515デフォルトの名無しさん2014/09/05(金) 22:28:58.50ID:vN4cHPD5
>>514
ありがとうございます。
すいません。定義が曖昧でした。
より短く、シンプルなものをと考えていました。
自分の考えていたのは下みたいなものだったので、長くてスマートじゃないなと思っていました。

for i = 0 to 9
dim a as integer
a= 10 - i
0516デフォルトの名無しさん2014/09/05(金) 22:30:55.95ID:JraYaxvT
step -1ぐらい空気読んで勝手にやってほしいとは思うけどな
0517デフォルトの名無しさん2014/09/05(金) 22:59:48.87ID:TJ9WELPZ
>>509
Unix系の find コマンドでは、
指定したフォルダ以下を再帰的に、すべてのファイルを取り出すが、
-mindepth, -maxdepth オプションで、指定した階層よりも、
上・下の階層を検索しないように設定できる

WindowsのPowerShellにも、同じ機能は無いの?
0518デフォルトの名無しさん2014/09/05(金) 23:07:14.03ID:6e3AIwhz
>>515
そういうのは、たとえソースがシンプルに書けても内部コードは複雑になる
内部コードが一番シンプルで動作も早いのはStep -1
0519デフォルトの名無しさん2014/09/05(金) 23:41:12.22ID:rtobVFDF
>>516
開始、終了が定数ならいざ知らず、変数使ってる時に勝手にそんなことされたら困るよ
0520デフォルトの名無しさん2014/09/05(金) 23:50:09.02ID:boQby5q4
>>518
そっか、インタプリタだもんな
0521デフォルトの名無しさん2014/09/06(土) 10:53:41.48ID:Bj86ray6
>>516
開始値が終了値より大きい時はループしないって性質をよく利用するので勝手に-1されるのは困る
0522デフォルトの名無しさん2014/09/06(土) 21:32:45.33ID:cBqeYm6Y
抽象的な質問かもしれませんが、
オブジェクト変数の配列を作って
その配列の要素数が多いコードを書くと
動作がものすごく重くなるんだけど
これを防ぐにはどういうテクニックを使えばいいですか?
0523桃白白 ◆9Jro6YFwm650 2014/09/06(土) 21:36:02.45ID:PaDmYBUZ
>>522
要素数が多い配列を返す関数を書いてたり
要素数が多い配列を引数に取る関数を書いておらっしゃるのでしょうか?
0524デフォルトの名無しさん2014/09/06(土) 21:46:33.96ID:bJjx4RgG
>>522
遅くなってる理由がイマイチ分からないからアレだけど、
例えば配列を最初から10万要素持っててループしているとか、
または都度配列の要素数を変えてるために時間を食ってるとかなら、
配列の代わりにコレクションを使うとかどうでしょうか?
0525デフォルトの名無しさん2014/09/06(土) 21:49:43.15ID:Bj86ray6
>>522
型に関係なく、変数(要素数)が多いというのはメモリをたくさん消費するということで、それだけじゃ動作が重くなったりはしない
何か根本的に勘違いしてるので、対策は「VBAの勉強をきちんとする」
0526デフォルトの名無しさん2014/09/07(日) 07:14:16.18ID:8bYOV7ym
>>525
>>>522
>型に関係なく、変数(要素数)が多いというのはメモリをたくさん消費するということで、それだけじゃ動作が重くなったりはしない

動作って言うなら場合によっては重くなると思うよ。メモリそれだけ食ってるわけだから
例えば計算に使うのに十分なメモリ領域がそれによって確保出来なければ当然動作は重くなる。

>>525
>何か根本的に勘違いしてるので、対策は「VBAの勉強をきちんとする」

VBAスレなんだからVBAの勉強をすると言うのは全てに対して当てはまる。つまり、回答になっていないっていうことだよ。
それに、メモリの話はVBAに限ったことじゃなくてもっとPCの根本的なところな話だしね。
0527デフォルトの名無しさん2014/09/07(日) 08:35:27.97ID:P+sGFsS3
>>526
いや、メモリ確保出来なければ失敗するだろ
0528デフォルトの名無しさん2014/09/07(日) 10:32:33.60ID:tnqniVGk
>>526
メモリを大量に食って遅くなるのは、ようするにスワップのこととか考えてるんだと思うけど、
VBAはスワップが発生するほど変数領域をたくさん取れない仕様になってる

スワップ意外で変数を大量確保しただけで遅くなる要因てほかに何がある?
キャッシュのミスヒットぐらいではそこまで遅くはならんよ

ループの回数とか計算量が増えて遅くなるのは当たり前だし、そのオーダーはどっちかと言うとアルゴリズムの問題
0529デフォルトの名無しさん2014/09/07(日) 13:46:18.16ID:wYoKfG3n
>>528
> VBAはスワップが発生するほど変数領域をたくさん取れない仕様になってる
これ本当かよ?
すでにスワップしてる状態でマクロ動かしたらいきなり実行時エラーとか出るの?
0530デフォルトの名無しさん2014/09/07(日) 14:04:03.12ID:P1+dMMwW
自動補完をCtrl+Spaceを押して候補が出現するのではなく
入力に対応して随時、補完候補が表示されるようにできないのでしょうか?

Excel2010、win7
0531デフォルトの名無しさん2014/09/07(日) 14:20:07.58ID:P+sGFsS3
>>529
スワップしてるかじゃなくて「スワップする程」な
1GBちょいあたりが上限な印象
0532デフォルトの名無しさん2014/09/07(日) 19:33:07.88ID:u52+473R
まえにHTMLオブジェクトを解放せずに何度も呼び出していたらメモリが不足してますって出て止まったことあるね。
0533デフォルトの名無しさん2014/09/07(日) 23:04:28.82ID:oroYJ4ZW
時間の加算計算で24時間以上の時間:分を表記したい場合はどうすればいいのでしょうか?
48:10 ←48時間10分みたいな、、
0534デフォルトの名無しさん2014/09/07(日) 23:14:58.30ID:Zs53uBvG
>>533
出力先のセルの書式設定を変えれば、ただの足し算でできると思う。
05355332014/09/07(日) 23:23:34.54ID:oroYJ4ZW
>>534
事故解決。。
http://support.microsoft.com/kb/879837/ja
[ユーザー定義] を選択し
[種類] ボックスに 「[h]: mm」(「」 は除く) と入力し、[OK] をクリックします。

これはしらなかった・・
0536デフォルトの名無しさん2014/09/08(月) 09:45:37.37ID:i+MV21wA?2BP(1000)
簡易な残業管理DBをアクセス2010で作ってるですが
休憩時間の抽出ってどうしたらいいですか?

現状ではvbaで [残業終了時刻] - [残業開始時刻] で経過時間までは出るけど、
そこから 時刻が17時25分以降に8時間以上残業したら、休憩で1時間マイナスさせたいんです。

問題は [残業終了時刻] 、 [残業開始時刻] に日付を含めたシリアル値で入力している為、時刻のみの抽出の仕方がわからない事です。

よろしくお願いいします。
0537デフォルトの名無しさん2014/09/08(月) 10:01:10.21ID:K+WRRTl3
>>536
整数部分が日付で小数部分が時刻です
0538デフォルトの名無しさん2014/09/08(月) 10:30:23.00ID:Alxd9Z9Z
コードから新規作成したブックに名前をつけるにはどうしたらいいですか?
0539デフォルトの名無しさん2014/09/08(月) 10:37:47.12ID:i+MV21wA?2BP(1000)
>>537
とりあえずInt使って整数部分引いてみます
0540デフォルトの名無しさん2014/09/08(月) 11:42:44.18ID:2Wlnx/Fy
>>538

Workbooks.Add
ActiveWorkbook.SaveAs Filename:=fname


fnameにはパス及び拡張子まで含めたファイル名を指定
0541デフォルトの名無しさん2014/09/08(月) 14:38:16.26ID:Alxd9Z9Z
>>540
ファイルは保存したくないんだよ。
0542デフォルトの名無しさん2014/09/08(月) 15:25:43.52ID:i+MV21wA?2BP(1000)
>>541
終了時に消すのもダメ?
0543デフォルトの名無しさん2014/09/08(月) 15:43:57.84ID:Qf62wDAL
>>522
配列の要素の数によると思うけど、
セルの文字色、背景色、罫線とかコード内で触ってない?
セルのプロパティをコード内で触ると、途端に速度落ちるよ
0544デフォルトの名無しさん2014/09/08(月) 15:46:39.54ID:UKi6zLkX
>>541
保存しないなら名前要らなくない?

マクロ内で扱うならWorkbook型変数にいれて扱えるし。

Dim wb As Workbook (As Object とか As Variant でも良いけど)
Set wb = Workbooks.Add

以降wbに対して操作する
0545デフォルトの名無しさん2014/09/08(月) 20:11:41.14ID:qBk57sir
>>540
新規じゃなくなるけどxlt開けばそんな感じになる
とおもう
05465412014/09/11(木) 02:09:49.83ID:C7bTWK0w
>>542
ダメなのじゃ。

>>544
いるのじゃ。

マクロは自分用じゃなくて複数のユーザさんに使っていただいているんです。
普通に開くと「Book2」みたいな味気ない名前で開くので
もっとユーザさんにわかりやすい「Book2」じゃなくて「○○の分析データ」みたいなブック名にしたくて。
それを保存するかどうかはユーザさん次第です。
保存していただく場合は「○○の分析データ」みたいに名前が入ってたらより便利でしょうし。
0547デフォルトの名無しさん2014/09/11(木) 02:41:53.14ID:QjgECpza
>>546
えっと タイトルバーの表記上でもいいのかな?
君のやりたい事全部 解決してないとは思うが 一つの案として

Excel総合相談所 114
http://peace.2ch.net/test/read.cgi/bsoft/1404485911/115-
からある質問の流れの中に

>aaa.xlsというファイルを ActiveWindow.Captionでタイトルバーの表記を bbb.xls に変更したけど
>閉じるときに aaa.xls への変更を〜 と表示されたので
>ここを bbb.xls への変更を〜 にしたかったです
ってのがあるんだが

.Captionでタイトルバーの表記を "○○の分析データ" みたいに
変更するのは どうなのかな?
0548デフォルトの名無しさん2014/09/11(木) 06:49:36.60ID:/l9NbsTz
どんな案出しても後出しでダメダメ。条件は最初に言えカス
0549デフォルトの名無しさん2014/09/11(木) 12:40:04.23ID:C7bTWK0w
あるフォルダのパスの文字列があります(String)。
そしてフォルダの階層の深さの数値もあります(Integer)。

このとき、そのフォルダよりその深さ以内のすべてのaviファイルの名前を取得するには
どういうコードを書けばいいでしょうか?
0550デフォルトの名無しさん2014/09/11(木) 12:40:33.86ID:C7bTWK0w
>>547
なるほどそんな方法がありましたか!
ありがとうございました。
0551デフォルトの名無しさん2014/09/11(木) 14:02:00.96ID:QjgECpza
>>549
>>509さんかな?
自分は丸投げ嫌いだから

どこまで作れているの?
全く作ろうとしてなくて 丸投げなら
俺は ここでまでで後はスルーする

でも一応 ヒントを
ファイルとかフォルダ処理は"FileSystemObject"を使えばいい

「Microsoft Scripting Runtime」に参照設定をして

Dim FSO As New FileSystemObject
とかするのね

がんばってみてね(^^v
0552デフォルトの名無しさん2014/09/11(木) 15:56:06.94ID:nzZ17j8H
>>549
>>511でやり方書いてやったのに。

Sub macro1()
depth = 2
search_path = InputBox("検索するパスを入力")

search_path_depth = Len(search_path) - Len(Replace(search_path, "\", ""))
depth = depth + search_path_depth

Set objShell = CreateObject("WScript.Shell")
Set retExec = objShell.Exec("%ComSpec% /c dir /b /A-D /S """ & search_path & """")
Do While retExec.Status = 0
DoEvents
Loop
files_all = Split(retExec.StdOut.ReadAll, vbCrLf)

i = 0
For j = 0 To UBound(files_all)
If Len(files_all(j)) - Len(Replace(files_all(j), "\", "")) <= depth And Right(LCase(files_all(j)), 4) = ".avi" Then
ReDim Preserve files(i)
files(i) = files_all(j)
i = i + 1
End If
Next

For i = 0 To UBound(files)
ThisWorkbook.Worksheets("Sheet1").Cells(i + 1, 1) = files(i)
Next

End Sub
0553デフォルトの名無しさん2014/09/11(木) 16:05:35.71ID:LHGJhOfg
>>546
xltスルーすんな
0554デフォルトの名無しさん2014/09/11(木) 17:30:04.86ID:j7cQOneD
EXCEL2010にてネットワーク上に保存したエクセルファイルを複数台のPCで編集しているのですが
ある日突然マクロ名が変更(欠落?)されて実行不可になってしまいます。

例:マクロ名ABCDEF ⇒ マクロ名ABCD

何か考えられる原因を教えて頂けると助かります。
0555デフォルトの名無しさん2014/09/11(木) 17:36:27.06ID:FXbvu4fI
>>554
誰か違うやつが触ってる可能性は?
0556デフォルトの名無しさん2014/09/11(木) 18:18:26.71ID:A8Og/307
つうか、マクロ名って何?
マクロが記述されたブックの名前?
実行したいプロシージャの名前?
05575532014/09/12(金) 08:44:04.24ID:f7PMt4Kv
セルに数値を入力して保存という作業を複数のPCでしておりますがVB開いてマクロを編集することはしておりません。

シートを開いた時点で実行するVBにシートの自動計算をストップさせる記述をし、シート上にあるボタンにマクロを割り付けて再計算するようにしてあります。

Sub シート更新()
ActiveSheet.Calculate
Sleep (100)
MsgBox "データを更新しました。", vbInformation
End Sub

この「シート更新」が「シート更」に書き換わっていたりするのです。
0558デフォルトの名無しさん2014/09/12(金) 09:05:03.52ID:roETZAvI
>>557
>>553は俺だし
聞いたことないからブック作り直し程度しか思いつかない
0559デフォルトの名無しさん2014/09/12(金) 09:27:39.23ID:tVj/zCnQ
>>557
かならず毎回なるの?
ならないなら、人為的だととおもうけど。
0560デフォルトの名無しさん2014/09/12(金) 10:18:36.34ID:4XODk0h/
>>557
VBっていうかExcelVBAですよね?
別口でVBのプログラムも動かしてるわけではないですよね?

いっそ短い名前のままで使ってみたらどうですか?
たとえば
Sub A()
とか
そしたらそれ以上短く出来ないから動きそうですけど。
05615542014/09/12(金) 10:37:40.90ID:f7PMt4Kv
>>558
失礼しました。

>>559
毎回はならずに数日たつと書き換わっています。

>>560
ExcelVBAです。
そうですね、1文字の名前にリネームして運用してみます。
0562デフォルトの名無しさん2014/09/12(金) 12:39:03.62ID:r8qrtjiw
VBAの学び方ってみんなどうやってんの?
オレ作りたいものは決まってるから、基本の条文をある程度理解して
ネットに上がっているコードを繋ぎ合せながらやってもセル範囲など細かいところでエラーがでてしまう。
エラー出るたびまた色々なサイトで調べながらちょこちょこ進めてるけど効率悪いような気がする。
効率のいい学び方あったら教えて下さい
0563デフォルトの名無しさん2014/09/12(金) 13:10:55.48ID:Gwix+uQ+
Type Person
Number As Integer
Name As String
Age As Integer
End Type
で構造体みたいなものを作って

Dim P() As Person
みたいに人データを配列で管理してるコードをすでに作っています。

これをNameで昇順に並べて、その「あいうえお」順でNumberを1,2、3・・・・・と割り当てるにはどうすればいいでしょうか?
いまのところP()の全データを仮シートに書き出し
Excelの機能のSortを使って並べなおし
それをわざわざP()に代入しなおすというダサい方法しか思いつきません。
0564デフォルトの名無しさん2014/09/12(金) 13:53:37.12ID:gVsovmQ9
>>562
それが一番効率が良い
聞いたり見たことが全て自分の物に出来る天才なら別だけど
0565デフォルトの名無しさん2014/09/12(金) 14:06:00.99ID:r8qrtjiw
>>564
ありがとうございます。地道にやっていきます。
0566デフォルトの名無しさん2014/09/12(金) 15:02:23.53ID:4XODk0h/
>>563
その構造体の元のデータソースはどっかにあるんでしょ?
普段はそれ自体をファイルで保持・管理しておいて、
削除や追加で変更が生じたときには随時更新する。

つまり、普段からソート済みの状態でデータソースを持っておいて
何かの処理に使いたいときだけ構造体に入れて使えば良いだけでは?
0567デフォルトの名無しさん2014/09/12(金) 16:13:09.39ID:ALozTPWZ
>>562
大体同じだよ。w
俺も自分の趣味と勉強を兼ねて同じプログラムをアップデートし続けている
ただ、近くに図書館があるからそこで色んな本を借りて基本的なところ&自分の興味のあるところw
を見て勉強している

さすがにネットだけってのは情報が断片的に過ぎるんじゃないかなと思うけど
0568デフォルトの名無しさん2014/09/12(金) 21:50:31.61ID:besSWj6W
あ
0569デフォルトの名無しさん2014/09/12(金) 21:51:29.16ID:besSWj6W
メンテナンスを考えて作りましょう!
0570デフォルトの名無しさん2014/09/12(金) 23:40:31.94ID:9TpkqwiT
>>563
> ダサい方法しか思いつきません。

Excel だとそれが楽チンだから、性能とか特に困ってないなら、それでもいいと思うけど
それが嫌なら、VBA には標準ではソート機能はないから自分でゴリゴリ実装するしかない
0571デフォルトの名無しさん2014/09/13(土) 02:39:04.25ID:yM9N/fr8
>>563
この手のレスを見る度に早く.Net化してくれないかなっていつも思う。
0572デフォルトの名無しさん2014/09/13(土) 04:08:15.45ID:aRKTTaf3
>>563
単なるデータベース管理だろ?Access使え
0573デフォルトの名無しさん2014/09/13(土) 04:44:24.17ID:HC2m1B2V
>>563
ちょっと気になったのが
その構造体のNameに入るの 漢字名? ふりがな?
漢字名だと シートへ転記してソートしようが
漢字コード順にしかならん気がするが・・・・・
0574デフォルトの名無しさん2014/09/13(土) 18:02:06.00ID:C+4DW6lr
パレットにのってる色を選びたいのだけど
それの定数変数(vbRed)みたいなのってどうやって調べますか?

現状、その色を仮に使ってイミディエット窓で「? Activecell.Font.Color」で
でてきた192168みたいな数字をコードに書くというダサい方法を使ってる。
0575デフォルトの名無しさん2014/09/13(土) 18:52:32.01ID:mA7pGFLx
マクロで作ってコードコピー?
0576デフォルトの名無しさん2014/09/13(土) 23:11:38.58ID:aRKTTaf3
>>574
ネットで検索
ただし一致する定数があるとは限らない
0577デフォルトの名無しさん2014/09/14(日) 22:20:25.09ID:2S7Vs/32
質問です。2つのコードがあります。
1つ目のコード(頂物)はシートモジュール(sheet1)でかかれたものでwebサイトから取得したデータを新規にシート作成・貼付けを行うものです。
2つ目のコードは標準モジュールでかいたものでシートモジュールを実行してできた新規のシート(sheet2)に計算式などを加えるものです。

シートモジュール実行後に自作の標準モジュールを実行しようとしたところsheet2をマウスクリックで選択してからでないと定義エラーがでて出来ませんでした。
そこでsheet2を選択するコードを標準モジュールに加えましたがそれでもダメでした。1つ目のコードを標準モジュールにコピーしてもダメでした。
どうすればいいでしょうか。初心者ですのでどの分野を学習すればいいかだけでも教えて頂ければ。願いします。win8、エクセル2010です。
0578デフォルトの名無しさん2014/09/14(日) 22:38:55.80ID:7t/oowuM
>>577
とりあえずコード晒した方がみんな分かるんじゃない?
0579デフォルトの名無しさん2014/09/15(月) 07:18:25.95ID:CzZ99oZn
>>577
Sheet2を選択しとけばエラーが出ないのなら、とりあえず自作コードの適当な場所に、
(具体的にどこが適当かはコードを見ないと判断出来ないけど、少なくともエラーが出る箇所より前)

Worksheets("Sheet2").Select

の一文を入れとけば良いんじゃないですか?

もちろん、今後のメンテナンスや機能拡張のことも考えれば、
現在シートモジュールにあるコードも出来る限り標準モジュールに
置き換えておいたほうが良いです。

何かイベントプロシージャを使っているのでない限り、
シートモジュールにコードを書くメリットは特にないと思います。
05805772014/09/15(月) 10:12:38.38ID:eoqWNWRh
>>579
Worksheets("Sheet2").Selectを入れても駄目だったんですよ。
説明不足でもうしわけありません。イベントプロシージャを使ってます。
モジュールの切り替えができてないからなのかなと思ったんですが。
0581デフォルトの名無しさん2014/09/15(月) 10:42:44.84ID:WMlWVjO/
なんでこう条件後出しにするやつばっかなの?
最初に全部出せよ、クソヤロウ
05825792014/09/15(月) 13:06:14.89ID:CzZ99oZn
>>580
手動でシート2を選択すれば動くのに、
それとほぼ同等の動作であるコードでは何故ダメなのかとても不思議ですが、
判断するための手がかりが不足していますので
やはりコードを晒していただくのが一番早道のようです。
0583デフォルトの名無しさん2014/09/15(月) 13:34:01.35ID:PJO6a40E
>>581
そのくらいの可能性、見て取れよ。
勝手に思い込んで勝手にブチ切れてりゃ世話ねーよ。
05845772014/09/15(月) 15:39:36.75ID:eoqWNWRh
>>582
ありがとうございます。
通常では考えられない不具合ということだけ十分認識して
もう一度自分で検討したいと思います。
0585デフォルトの名無しさん2014/09/15(月) 15:45:38.70ID:CzZ99oZn
>>584
そこまで大げさな話ではないです。
多分コードをみればすぐ分かるような間違いだと思いますが、
コードを見ていないので分からないだけです。
0586デフォルトの名無しさん2014/09/15(月) 16:56:46.03ID:jaJ///zd
>>577
最低限、エラーが出た行と、出たエラーメッセージを正確に書け

>>581
>そこでsheet2を選択するコードを標準モジュールに加えましたがそれでもダメでした
とは初めから書いてあるがな
0587デフォルトの名無しさん2014/09/15(月) 21:05:00.78ID:LjdFnH0A
>>586

>>そこでsheet2を選択するコードを標準モジュールに加えましたがそれでもダメでした
>とは初めから書いてあるがな

コードで書いて無いから本当に有効なコードだったかは判断出来ない
0588デフォルトの名無しさん2014/09/15(月) 21:23:14.17ID:ymf8aUd8
実際のブックにそのコードが書かれてるとは限らないから
コードで書いたとしても本当に有効なコードだったかは判断出来ない

あほくさ
0589デフォルトの名無しさん2014/09/16(火) 05:48:11.89ID:Ag5d7ZlF
止まるとこの直前にセレクト入れればいいじゃないの?
それでダメなら何の命令で止まるのか、その部分だけでも書かないと。
エスパーはいないよ。

あと標準モジュールとかシートモジュールなんとかはほぼ関係ないと思う。

一行ずつデバッグしながらどこでセレクトしたのが外れてしまってるか確認しようよ。
0590デフォルトの名無しさん2014/09/16(火) 06:24:08.44ID:EiHHMuT4
>>580
>Worksheets("Sheet2").Selectを入れても駄目だったんですよ。

Worksheets("Sheet2").Selectを、Worksheets("Sheet2").Activateにすると動くと勝手にエスパー。
0591デフォルトの名無しさん2014/09/16(火) 14:34:15.42ID:9xrF7FgD
xlaファイルを作ったのですが、
開こうとすると毎回
「この名前はすでにあるモジュール、プロジェクト、オブジェクトライブラリで使われています」
というメッセージが出ます。
その場では自動でxlaファイルが開いて関数を呼び出せるようになるのですが、
一度エクセルを閉じてしまうと同じ操作をやり直さなくてはなりません。
読み込んだxlaを記憶しておいて自動で開くことはできないのでしょうか。
0592デフォルトの名無しさん2014/09/16(火) 18:44:07.69ID:VmQD7VKv
>>591
ちょっと状況が掴めないけど
>開こうとすると毎回
>「この名前はすでにあるモジュール、プロジェクト、オブジェクトライブラリで使われています」

これ .xla ファイルを参照設定して(開こうと)してない?
もしそうなら
 .xla の"プロジェクト名"を変更すると解決するかも

違うなら自分にはわからないな
0593デフォルトの名無しさん2014/09/16(火) 20:05:05.05ID:9xrF7FgD
>>592
原因は違いましたが、参照設定で開くというヒントで調べて、解決しました。
・xlaとして保存せず、名前を変えただけだった。
・アドインとして参照していなかった。
が原因でした。
ありがとうございました。
0594デフォルトの名無しさん2014/09/17(水) 12:37:30.23ID:dZ1fhYBv
たくさんシートがあって
各シートを選択したときにアクティブになっているセルのアドレスはみんなシートによってバラバラなのはみなさんご存知のとおりだと存じます。

この各シートに記憶されているアクティブになる予定のセルのアドレスはどうやって取得しますか?
コードには各シートをアクティブにしてアクティブセルを調べる方法は禁止とします。
0595デフォルトの名無しさん2014/09/17(水) 12:44:39.42ID:P16JoJkh
そんなもん知る必要がないから却下
0596デフォルトの名無しさん2014/09/17(水) 12:48:04.24ID:EnwZXKAD
標準モジュールの先頭にOption Explicitの記載はしているのですが、
変数名のタイプミスを検知しませんでした。
変数名が間違っていた場合エラーで実行出来なくなると思っていたのですが、
このオプションには何か条件があるのでしょうか。

変数はBoolean型、バージョンは2013です。
0597デフォルトの名無しさん2014/09/17(水) 14:12:36.71ID:Pa92VYa5
>>596
予約後と被ってた
どこかでグローバル宣言していた
関数の引数として定義していた
同じ名前の関数を作ってた
同じ変数名を2回使ってた
0598デフォルトの名無しさん2014/09/17(水) 14:16:56.53ID:Pa92VYa5
>>594
質問スレでクイズは却下
0599デフォルトの名無しさん2014/09/17(水) 14:27:19.63ID:dZ1fhYBv
>>598
[X][X][X]
0600デフォルトの名無しさん2014/09/17(水) 14:28:16.96ID:c1ogrgKw
>>594
多分ファイルのどこかに書いてあるから、ファイル解析して頑張れ、応援してるぞ
http://msdn.microsoft.com/en-us/library/office/cc313105(v=office.12).aspx
0601デフォルトの名無しさん2014/09/17(水) 16:14:50.86ID:Zaxh9vZl
>>594
あの田中さんでさえ各シートをアクティブにして調べてる

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

どうしてもセレクトやアクティベートをしてはいけないという
具体的理由があるならそれを教えて欲しい。

俺には単なる知的好奇心以外の理由が思いつかないし、
もしそれが理由ならこれ以上相手をする気にはなれない。
0602デフォルトの名無しさん2014/09/17(水) 18:38:54.58ID:EnwZXKAD
>>597
ありがとうございます。
ただ、ミスした変数名で検索をかけても
該当の1箇所しかHitしなかったので
一応どの条件もクリアしているかな、とは思います。
0603デフォルトの名無しさん2014/09/17(水) 18:58:08.29ID:Zaxh9vZl
>>602
とりあえずコード見せてくれたらなんか分かるかもしれない。
0604デフォルトの名無しさん2014/09/17(水) 19:25:00.80ID:pzZaxrRp
>>596
変数名は?
昔 Log だかのありがちな名前ではまったことがあったような気がする。
0605デフォルトの名無しさん2014/09/17(水) 20:15:31.24ID:IUDVFBKE
実行してもエラー出ないんだろ?それなら何の問題もないと思うが?
0606デフォルトの名無しさん2014/09/17(水) 20:17:03.92ID:dZ1fhYBv
>>601
理由は、以前オレがアクティベートしなくても取得する方法を発見したからだよ。
そのときはその方法に興奮し感動したもんだよ。

しかし、やりかた忘れた。
0607デフォルトの名無しさん2014/09/17(水) 20:18:19.60ID:EnwZXKAD
>>604
「flg_**** 」です。
宣言した変数名がflg_aa11で、ミスしてたのはflg_zz11みたいな感じで
アルファベットの2文字を間違えてました

>>603
職場のデータなのでちょっと今手元にないのですが、

Dim flg_aa11 as Boolean

If 条件 Then
flg_aa11 = True
End if
〜中略〜
If flg_zz11 = True Then ←ここを間違えていた
処理
End if

という感じです。
1stepずつ確認した時flg_zz11の中身はEmptyで、
Ifの中に書いた処理が実行されてしまっていました。
0608デフォルトの名無しさん2014/09/17(水) 20:27:26.73ID:E0verSM2
あ、違う
If flg_zz11 = False Then 〜、ですね
0609デフォルトの名無しさん2014/09/17(水) 20:27:42.28ID:/OmvXPMu
>>607
Option Explicit を邪魔でコメントにしてたってオチじゃないの?
0610デフォルトの名無しさん2014/09/17(水) 20:53:46.21ID:Zaxh9vZl
>>606
それ勘違いとか夢オチとかではないよね?
忘れたって言ったってまるっきり何もかも覚えてないってわけでもないでしょ?

何かのプロパティとして取得できたのか、
数行でも何らかのプログラムをして取得できたのかぐらいは覚えてないの?
0611デフォルトの名無しさん2014/09/17(水) 22:03:50.72ID:pzZaxrRp
>>607
現象が再現する最小のコードをどこかにアップしてみて
多分その過程で原因がわかると思うけど
0612デフォルトの名無しさん2014/09/17(水) 22:14:18.35ID:40gxadfd
>>607
・別の(たとえばシート)モジュールだった
・Module2だった
0613デフォルトの名無しさん2014/09/17(水) 22:25:27.09ID:q0kO1DWi
オブジェクトブラウザでその変数名検索してみたら?
0614デフォルトの名無しさん2014/09/17(水) 22:37:02.98ID:IUDVFBKE
お前が検索しろハゲ
0615デフォルトの名無しさん2014/09/17(水) 23:47:56.45ID:E0verSM2
596です。皆さんありがとうございます。
明日もう一度ご指摘いただいた点を見直してみて、
それでも再現するようであればまたご相談させていただきます。
0616デフォルトの名無しさん2014/09/18(木) 01:31:16.98ID:RJkooT4y
いや、相談されても何も解決しないと思うぞ
ブック丸ごと公開してデバッグでもしない限り
0617デフォルトの名無しさん2014/09/18(木) 10:33:08.86ID:NRNOSfJW
>>610
分からない。
当時発見したときは、「ほうほう、こんな方法があったのか!」とものすごく感動した思いがあるので
やりかたが存在するのは確か。

オレはネット検索したりオブジェクトブラウザを見たりVBA本を数冊読んだりすることくらいしかしないから
そのうちのどれかから見つけたのだと思うけど、いまだにどうやって見つけたかはさっぱりわからない。

もちろん夢とかじゃないだろう。
0618デフォルトの名無しさん2014/09/18(木) 11:29:45.86ID:rKSmT1lK
アクティプじゃないWindow(ブック?)の アクティプセル取得の事だったりしてwww
0619デフォルトの名無しさん2014/09/18(木) 11:49:38.12ID:NRNOSfJW
>>618
たしかWindowという文字列を使った覚えがある。
それかもしれない。
ところで、そのアクティプじゃないWindow(ブック?)の アクティプセル取得ってどうやるんだ?
0620デフォルトの名無しさん2014/09/18(木) 11:51:42.27ID:rKSmT1lK
Windows(2).ActiveCell
0621デフォルトの名無しさん2014/09/18(木) 11:54:24.19ID:NRNOSfJW
>>620
それだ!
0622デフォルトの名無しさん2014/09/18(木) 11:57:45.15ID:rKSmT1lK
結局 勘違いってオチね

>各シートに記憶されているアクティブになる予定のセルのアドレス
じゃないし
0623デフォルトの名無しさん2014/09/18(木) 12:03:23.15ID:NRNOSfJW
Bookを増やすとWindowも増える。

つまり
Workbooks.Count = Windows.Count
の関係にある。

しかし例えばCount=5のとき
Workbooks(1)=Windows(5)
Workbooks(2)=Windows(4)
Workbooks(3)=Windows(3)
Workbooks(4)=Windows(2)
Workbooks(5)=Windows(1)
という不思議な関係がある。

Windowsってなにものなんだ?
存在意義は?

とりあえずこれですべてのBookの各ActiveSheetとActivecellのオブジェクトを、それをいちいちActivateせずに取得できるようになった。

Windows(n)にはActivesheetのプロパティもActiveCellのプロパティも存在するから。
BookについてはWindows(n).Parentで取得できるし。
0624デフォルトの名無しさん2014/09/18(木) 12:09:23.49ID:NRNOSfJW
>>622
ブックをたくさん開いて、いろんなシートでいろんなセルをActivateにしたあと、
次のコードを実行してごらん。

Sub ActiveObjectCheck()
Dim w As Window
Dim i As Integer
i = 1
Cells(1, 1) = "Book"
Cells(1, 2) = "ActiveSheet"
Cells(1, 3) = "ActiveCell"
Range(Cells(1, 1), Cells(1, 3)).Interior.Color = rgbGray
For Each w In Windows
i = i + 1
Cells(i, 1) = w.Parent.Name
Cells(i, 2) = w.ActiveSheet.Name
Cells(i, 3) = w.ActiveCell.Address(False, False)
Next w
End Sub
0625デフォルトの名無しさん2014/09/18(木) 12:11:19.04ID:rKSmT1lK
そのような関係性はない
あるのは
>作業中のウィンドウは常に Windows(1) であることに注意してください。
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.windows(v=office.11).aspx
0626デフォルトの名無しさん2014/09/18(木) 12:14:28.95ID:rKSmT1lK
>>624
>ブックをたくさん開いて、いろんなシートでいろんなセルをActivateにしたあと、

>>594 コードには各シートをアクティブにしてアクティブセルを調べる方法は禁止とします。
の条件だろ
0627デフォルトの名無しさん2014/09/18(木) 12:28:02.12ID:Y/CO+rMO
新しいウィンドウを開く で Book1:1、Book1:2 とすると
Workbooks.Count = Windows.Count ではなくなる。
0628デフォルトの名無しさん2014/09/18(木) 13:58:03.46ID:mK8SZ9df
>>624

例えば、ひとつのブック内でSheet1がアクティブシートのとき、
Sheet2やSheet3をアクティブにしたときのアクティブセルを
セレクトもアクティベートも求めるにはどうすれば良い?
>>594で出された最初の質問にはそういう意味も含まれているよ。
0629デフォルトの名無しさん2014/09/18(木) 14:09:26.09ID:RX7vjZRI
いつまで続けるのこれ
06306282014/09/18(木) 14:11:33.52ID:mK8SZ9df
文章が一部抜けてた

×セレクトもアクティベートも求めるにはどうすれば良い?
○セレクトもアクティベートも使わずに求めるにはどうすれば良い?
0631デフォルトの名無しさん2014/09/18(木) 15:55:49.61ID:RJkooT4y
取得するプロパティはなぜか用意されてないみたいだけど、保存してソースを見れば書いてあるんじゃない?
今のExcelファイルは単なるテキストだし

ていうか、普通にシートやブック切り替えて調べりゃいいじゃん
なんで一番簡単な方法を拒絶するのか理解できん
単に頭の体操がしたいだけ?
非公開の方法を見つけたところで互換性が保証されてるわけでもないのに
0632デフォルトの名無しさん2014/09/18(木) 17:53:03.79ID:yoMUPDG3
>>単に頭の体操がしたいだけ

に決まってら w
よくみんな付き合い続けるね
0633デフォルトの名無しさん2014/09/18(木) 18:08:34.35ID:mK8SZ9df
>>632
STAP細胞みたいなもんだよ。
みんな無いと思ってるけど
一人でも有ると言い張る奴がいる以上
白黒つけたくなるんだよ。
0634デフォルトの名無しさん2014/09/20(土) 23:15:25.62ID:A1CJttDb
WorksheetFunctionの関数を使うとき
SUMでもMATCHでもMAXでもなんでもいいんだけど
フィルターを使ってるときSelectionの範囲内の見えてるセルだけを対象としたいときは
どうすればいいですか?
0635デフォルトの名無しさん2014/09/21(日) 02:13:03.35ID:zM26SjLW
>>634
SpecialCells(xlCellTypeVisible)
でググると色々なサイトで解説されてる
0636デフォルトの名無しさん2014/09/21(日) 05:53:16.13ID:KHLm9j0T
ExcelのVBAで.Netで言うところのデリゲートみたいなことをしたいんだけど、いい方法知ってる人いませんか?
0637桃白白 ◆9Jro6YFwm650 2014/09/21(日) 17:21:56.19ID:yQ4xgCu9
>>461
できたおー
https://friendpaste.com/2EtCwSYrRIOkSj0z6FeZjs


          :     ____
            ,. -'"´      `¨ー 、
           /        i i      /ヽ、
        ,,.-'"   \          /  ヽ
       /  / /::::::\\  ー―= く __  ヽ、
       /   |  |:::::::::::::::| |  | |:::::::::::::::|  |   ヽ
      ./    \ \::::://   \\:::::/ /    ヽ
     /             \              i
     /              (            .l
    ,'          、__              /
    i                           /  /))
    ',             ̄            / / ((
     ヽ、         __,,.. --------------i-'" /   ))
      ヽ、_   __ -_'"--''"ニニニニニニニニヽ≦__∠〜
         `¨i三彡--''"´              ヽ
          /                      ヽ
         /                     ヽ
0638デフォルトの名無しさん2014/09/21(日) 20:07:04.65ID:voPYEv14
動作テストを兼ねてF8キー押してコードを一行ずつ実行するモードをやるとき
フォームを使っててボタンを押したら標準モジュールのプロシージャを実行するような仕様のときは
どうすればいいんですか?

ボタンクリックのイベントプロシージャのところでF8押しても
標準モジュールのプロシージャからF8押しても
うまくいかない。
0639デフォルトの名無しさん2014/09/21(日) 20:23:08.62ID:f5g4XcaG
Private Sub CommandButton1_Click()
 Stop
0640デフォルトの名無しさん2014/09/21(日) 20:24:23.12ID:H/qewALr
>>638
ブレークポイントつこてもあかんの?
0641デフォルトの名無しさん2014/09/21(日) 20:32:59.99ID:voPYEv14
>>640
つこてる豆が違うんですよ。
0642デフォルトの名無しさん2014/09/21(日) 20:40:13.66ID:voPYEv14
それは標準モジュールのどこかにブレークをしかけておくと
フォームのボタンから実行したときにプロシージャに飛ばされた先のところでいったん止まり
そこからF8連打で一行ずつ実行されるということですか?

ちょっといまテストできない環境なので後で試してみます。
0643デフォルトの名無しさん2014/09/21(日) 20:42:26.38ID:voPYEv14
次のお題なのですが
VBAのWorksheetfunctionを使ってMATCHを使っているのですが
これ該当値がないとシート関数とは違ってエラーでマクロ自体がそこで中断して
止まってしまいます。

エラーになりそうなときはMATCHを使わないように回避するにはどうするのが一般的でしょう?
基本的な質問かもしれませんが。
0644デフォルトの名無しさん2014/09/21(日) 21:57:32.99ID:zM26SjLW
>>643

エラーになるかどうかを事前に知ることは一般的には不可能なので、
(検索対象のデータ数がゼロ件であるとかの特殊な場合を除く)
エラーが出たらそれを無視したりエラートラップをかけて処理を行ったりします。

この辺が参考になるかと思います。
http://www.moug.net/tech/exvba/0100004.html
0645デフォルトの名無しさん2014/09/21(日) 22:07:46.66ID:voPYEv14
エラーになるかどうかというのは選択範囲に値が存在しないときだから予測は可能です。
ただそれをどういうふうにコードに書くのか。
0646デフォルトの名無しさん2014/09/21(日) 22:10:35.55ID:voPYEv14
ON ERRORはわたしのプログラム哲学(笑)が許さないのです。
だってそれを使ったら他の場所で他のエラーが出ても無視しちゃうのは
これからコードを更新するときなどにも支障が出ますし。

エラーは人間でいえば痛みです。
痛みがあるおかげで病院に行ってガン末期になる以前に治療が開始できるのです。
0647デフォルトの名無しさん2014/09/21(日) 22:42:41.62ID:zM26SjLW
>>645-646

事前に予測できるのですか?
貴方の最初の質問からではちょっとその状況が想像出来ませんが、
それならばMatchを実行するかどうかをIf文で分岐させれば良いだけではないのですか?

その分岐条件がどんなものかも貴方の質問内容から汲み取ることは出来ませんので
私にはこれ以上の回答は出来ませんが。

それに貴方の哲学とやらにも興味はないので、それを抜きにすれば
On Error が一般的な解決方法であるのは間違いないです。

ちなみにOn Error Goto 0 でエラートラップを解除できますから
当該処理の範囲を抜ける際にその一文を書き加えるだけで
貴方が懸念するような事態にはなりません。
0648デフォルトの名無しさん2014/09/22(月) 21:44:59.26ID:MSAqdUgS
>>643
http://www.moug.net/tech/exvba/0100035.html
一方、WorksheetFunctionオブジェクトを省略した記述ではエラー値が返され
実行時エラーは発生しません。検索値がないときは
IsError関数やIsNumeric関数などを使ってエラーを判定する処理を記述してください。

だってよ

それ以前にVBAで Match 使う場面が思いつかんかった
xlpart の find でよくね?
0649デフォルトの名無しさん2014/09/23(火) 03:48:11.14ID:Nn4DQhnV
>>648
すばらしい!
しかしなぜMATCH関数には
 Application.WorksheetFunction.Match(・・・
 Application.Match(・・・・・
の2とおりもあるんだ?

他の関数も2とおりあるものはたくさんあるのかな。
ちなみに後者はなんのオブジェクト?
0650デフォルトの名無しさん2014/09/23(火) 04:37:16.63ID:DADtgFDk
>>649
そのリンク先のサイトに、互換性を保つためってちゃんと書いてあるんだが
0651デフォルトの名無しさん2014/09/23(火) 05:45:20.81ID:Nn4DQhnV
>>650
では、
Application.Match(・・・・・
は、好ましくない書き方なんですね?
ずばりそうでしょう。

実際、オブジェクトブラウザにはこの書き方は出ていない。
0652デフォルトの名無しさん2014/09/23(火) 14:02:12.13ID:rjUTyIhL
>>651
逆に
WorksheetFunction.Match メソッド (Excel)
http://msdn.microsoft.com/ja-jp/library/office/ff835873(v=office.15).aspx

ここのサンプルに
var = Application.Match(Cells(iRow, 1).Value, Worksheets(iSheet).Columns(1), 0)

とか 使ってたりするwww
0653デフォルトの名無しさん2014/09/23(火) 18:01:37.61ID:J4bO4OTw
>>636
どんな使い方したいかによるなぁ。
イベント絡みで使いたいの?
それともメソッドを変数に格納して使いたいとか?
0654デフォルトの名無しさん2014/09/23(火) 18:21:04.36ID:BgveuF20
【相談したい事】スケジュール表を作っているが、WorkSheetをまたいだ時間の比較が出来ない
【Excel Ver】Excel 2003
【OS】Windows XP Home
【詳細】

'従業員のスケジュール記入列を読み出す変数
Dim i

'従業員ワークシートの開始・終了時間の値を読込
各従業員のスケジュール開始時間 = worksheets("従業員A").range("a" & i) as date
各従業員のスケジュール終了時間 = worksheets("従業員A").range("b" & i) as date
'全従業員ワークシートの時間を比較させる値を読込
全従業員のスケジュール開始時間 = worksheets("全従業員").range("c" & j)

'全従業員ワークシートの時間が各従業員の開始時間と全従業員のワークシート時間以上、且、終了時間未満の場合
if 全従業員のスケジュール時間 >= 各従業員のスケジュール開始時間 and 全従業員のスケジュール開始時間 < then
'〜スケジュールの詳細をworksheets("従業員A")からworksheets("全従業員")へ値を渡す処理

【知りたい事】
ここで「全従業員のスケジュール時間 >= 各従業員のスケジュール開始時間」の値が「8:00 = 8:00」だと条件が通らない、
かといって「9:30 = 9:30」なら通ったりするため、八方塞な状況です。

・各従業員の開始・終了時間は入力規則のリストから選択
・全従業員の時間は予めワークシートに表記済

原因がわかる方、レクチャーをお願い致します。
0655デフォルトの名無しさん2014/09/23(火) 18:33:24.99ID:DADtgFDk
>>654
変数名長いと読みにくいな
しかもあちこちソース不備があるし

比較が「8:00 = 8:00」ってなってるが、これがホントに比較してるデータなら
コロンの全角と半角が違ってるから、文字列として一致していない

実際に比較するときの、変数の型確認して見ろ
0656デフォルトの名無しさん2014/09/23(火) 18:46:47.42ID:DADtgFDk
>>652
サンプルとかヘルプとか更新されてないっぽいからなぁ
2007でもWorksheetFunction.Matchのヘルプに
検査値が見つからない場合は、エラー値 #N/A が返されます
とか書いてあるけどまあ嘘だしな、これ
0657デフォルトの名無しさん2014/09/23(火) 18:49:34.19ID:DADtgFDk
>>636,653
使い方次第だが、実際の方法としては CallByName ぐらいじゃね
0658デフォルトの名無しさん2014/09/23(火) 18:53:47.50ID:BgveuF20
>>655
失礼しました。

'各従業員のスケジュール
Dim スケジュール1開始 As Date
Dim スケジュール1終了 As Date

スケジュール開始1 = worksheets("従業員A").range("a" & i)
スケジュール終了2 = worksheets("従業員A").range("b" & i)

      '全従業員のスケジュール
Dim 比較時間 As Date
      比較時間 = Worksheets("全従業員").Range("c" & i)
'比較時間が各メンバーのスケジュール1開始と比較時間以上、且各メンバーのスケジュール1終了以下の場合
If 比較時間 >= スケジュール1開始 And 比較時間 < スケジュール1終了 Then
'値は8:00 = 8:00 だと通らず、 9:30 = 9:30 だと通る

8:00の全角コロンは間違いです。
実際の比較はどちらも同じ時間・書式でされています。
0659デフォルトの名無しさん2014/09/23(火) 19:03:19.10ID:DADtgFDk
>>658
>8:00 = 8:00 だと通らず、 9:30 = 9:30 だと通る
変数は比較、開始、終了で三つあるんだが
ブレークポイント張るとかして、ちゃんと三つ全部の、実際に入ってる値を確認してみろよ

時刻比較で有りがちなのは、書式で表示されてないけど日付が違うパターンが多い
0660デフォルトの名無しさん2014/09/23(火) 22:58:26.50ID:Nn4DQhnV
では次のお題です。
ネットワークにあるファイルを開くためのダイアログで
デフォルトとしてあるフォルダから選択するようにするにはどうすればいいでしょうか?

そのフォルダは、\\、で始まるやつです。

通常ならドライブを指定して、それからフォルダを指定するのだと思いますが
\\で始まるからドライブが指定できない。
0661u2014/09/24(水) 03:19:35.98ID:Znpi/jan
(CNN 川越信隆) 体長2.7メートルの巨大ホオジロザメをのみ込んだのは、一体どんな「怪物」なのか――。
オーストラリアのサメを調べていた研究者がそんな疑問にぶつかった。

このホオジロザメは4カ月前、追跡用のタグを付けて海に放していた。
ところがその地点から4キロほど離れた海岸にタグのみが漂着。
調べたところ、温度が突然急上昇し、580メートルの深さまで一気に潜っていたことが分かった。

研究チームは、サメが別の生物にのみ込まれたために温度が急上昇し、
その生物が潜った深さが装置に記録されたと推測。
しかしどんな生物かは分からなかったため、この一帯の海域を詳しく調べた結果、
さらに巨大なホオジロザメが生息していることを確認した。
0662デフォルトの名無しさん2014/09/24(水) 04:16:31.40ID:TqR8ySbH
てっきり鯨に食われたのかと思った
0663デフォルトの名無しさん2014/09/24(水) 08:42:54.91ID:vJkEy8s/
>>660
"ファイルを開くためのダイアログ"に 何を使うかで違うけど
Application.GetOpenFilename
だとしても可能だよ
ヒントは田中さんのとこ という事でググってね

それが貴方の哲学(笑)的に どうかは関知しないけど
0664デフォルトの名無しさん2014/09/24(水) 10:42:50.94ID:4awcA0eB
2.7メートルって小型じゃん
0665デフォルトの名無しさん2014/09/26(金) 21:18:09.43ID:u91o0w3f
ここで質問しようとしたこと何度かあるけど
上手く伝わるように質問文何度も見返しながら書いてたら
間違いや別の方法考え付いて結局自己解決してしまう。
コードだけ観ててもアカンのね
0666デフォルトの名無しさん2014/09/27(土) 01:35:11.95ID:DCuWOV5R
>>665
つまり問題を言語化していく中で、全体像が浮かんでくるわけか。
0667デフォルトの名無しさん2014/09/27(土) 02:15:22.43ID:DEOObq5h
>>665
わかる
人に質問する時、言い切る前に解決しちゃうとか?
0668デフォルトの名無しさん2014/09/27(土) 02:16:14.64ID:DEOObq5h
何故か?付いてた
0669デフォルトの名無しさん2014/09/27(土) 09:30:07.66ID:z531iquN
ChangeFileAccessについて情報を探しています
Excel2010でxlsm形式で保存した下記コードが期待通りに動きません

Sub auto_open()
ThisWorkbook.ChangeFileAccess xlReadOnly
ThisWorkbook.ChangeFileAccess xlReadWrite
MsgBox "表示させたい"
End Sub

書き込み可能になったところで処理が終わってしまいメッセージが表示されません。元はExcel2000で作られたファイルでxls形式のままExcel2010で開くと動作します
どうもxlsm形式でChangeFileAccessが2回走ると処理が止まってしまうようです。この動作が仕様なのか回避方法がないかわかる方はいませんか?
0670デフォルトの名無しさん2014/09/27(土) 18:07:55.98ID:VNfSjhXW
>>669
ChangeFileAccess のヘルプに
>読み取り専用を書き込み可能に変更した場合は、読み取り専用にしていた間に変更された部分がないことを確認するために、ファイルが改めて読み込まれます。
ってあるけど
そのときにauto_open走ってループしてるんじゃねえか
0671デフォルトの名無しさん2014/09/28(日) 16:28:14.43ID:g4uidbB6
On Error GoTo err_prc:

i = 1
Do
i = i + 1

If Cells(i, 6) <> Cells(i, 8) Then
MsgBox "値不一致 & Cells(i, 1) & " 行:" & i
cverr(1000) '←
GoTo err_prc
End If


kensu = kensu + 1
Loop Until Cells(i, 1) = ""

If Err.Number = 0 Then
MsgBox "完了 件数 :" & kensu & "件"
End If

Exit Sub

err_prc:
'Err処理
MsgBox "登録異常 " & Cells(i, 1) & " 行:" & i & vbCrLf & _
" 内容:" & Err.Description, vbCritical
End Sub

On Error の中でチェックをしつつ処理をするようにしています。
ここで質問ですけど、自分でエラーコードを設定することは出来ないんでしょうか?
cverr(1000) '←
のようにすると文法エラーになってしまうんですが。
0672デフォルトの名無しさん2014/09/28(日) 18:34:39.12ID:SiKgDQdT
>>671
Err.Raise
0673デフォルトの名無しさん2014/09/28(日) 19:01:56.11ID:g4uidbB6
>>672

If Cells(i, 6) <> Cells(i, 8) Then
Err.Raise 1000
GoTo err_prc
End If

err_prc:
If Err.Number = 1000 Then
MsgBox "値不一致 :" & Cells(i, 1) & " 行:" & i
Else
'それ以外のエラー
MsgBox "異常 " & Cells(i, 1) & " 行:" & i & vbCrLf & _
" 内容:" & Err.Description, vbCritical
End If

で出来ました。後はエラーコードがExcelが使ってるものと被らないように
エラーコードを調べておけば良いのかな。

ありがとうございます
0674デフォルトの名無しさん2014/09/28(日) 19:36:33.35ID:rJB8wEzT
>>673
goto文はスパゲッティコードの原因だから使うなってばっちゃが言ってた
0675デフォルトの名無しさん2014/09/28(日) 19:49:48.37ID:g4uidbB6
>>674
まぁこの場合は

Err.Raise 1000
の後単純に
Exit Do
で良いのですが^^;
0676デフォルトの名無しさん2014/09/28(日) 20:55:05.29ID:+CCEmX/F
>>674
使い方の問題。
0677デフォルトの名無しさん2014/09/28(日) 21:34:18.90ID:Lr7x15ny
そもそもVBAではエラー処理したら避けて通れないような…

結局のところ使い方次第だよな
0678デフォルトの名無しさん2014/09/28(日) 21:46:50.25ID:v3A9JYrA
そういう場合はメインの処理を別Functionにして戻り値でエラーコードを返してメイン側で分岐、GoToを使わなくて済むようにするのが構造化の正統な方法なんだけど
0679デフォルトの名無しさん2014/09/28(日) 21:52:46.24ID:QKO3R3Ls
なんかさー、VBAってGOSUBなんての持っているんだね。
以前人が作ったPGにフツーにGotoなんて書いてあるとブチ切れそうになるけど、
GOSUBなんて使えるの初めて知ったよ。
まぁブチ切れそうになるのは変わらないけどね。
0680デフォルトの名無しさん2014/09/28(日) 22:42:25.98ID:dy7TqO6L
>>678
例外処理ですが?
0681デフォルトの名無しさん2014/09/28(日) 22:50:10.24ID:lwUZotcA
>>679
Basic だからなぁ...
0682デフォルトの名無しさん2014/09/28(日) 23:06:15.28ID:rdw+UIlr
VBAでattributesプロパティについて質問したい初心者なんですが
FileSystemObjectなのでテンプレ>>2に引っかかる様な気がします
でもVBA以外に知識無いんですけどどこで質問したらいいか教えてください
0683デフォルトの名無しさん2014/09/28(日) 23:36:29.14ID:lwUZotcA
>>682
VBScriptについて必死に話し合うスレ 辺りかなあ
http://peace.2ch.net/test/read.cgi/tech/1391694526/

FileSystemObject は VBA のヘルプにも出てくるぐらいなので、ここでもいいような気もするが...
0684デフォルトの名無しさん2014/09/28(日) 23:58:58.24ID:rdw+UIlr
>>683
ありがとうございます、ちょっと覗いてきます
0685デフォルトの名無しさん2014/09/29(月) 01:44:46.85ID:lYOkyXy1
>>681
それなんだよね。「Basicだから」昔の命令が使えるようになってるけど、
それも良し悪しで、.NetでもOn Error Gotoとか使えるの、アレ廃止にして欲しい。
プロシージャ毎にTry CatchやOn Error Gotoころころ変えて使う奴は死んで欲しい。
0686デフォルトの名無しさん2014/09/29(月) 04:19:15.87ID:ZR32OSxU
VBAってほとんどがその人による一過性のプログラムだろ
0687デフォルトの名無しさん2014/09/29(月) 06:03:54.89ID:HClfAbJC
>>685
嫌なら C# に行けばいいだけのこと
0688デフォルトの名無しさん2014/09/29(月) 06:28:41.92ID:lYOkyXy1
>>687
言ってる意味が分からん。
作り手の意識の問題だろ?
C#になればGoto文が無くなるとでも?
0689デフォルトの名無しさん2014/09/29(月) 07:09:32.10ID:HClfAbJC
>>685
> .NetでもOn Error Gotoとか使えるの、アレ廃止にして欲しい。

なら、C# にでも行けってこと。
理解力無さすぎだろ。

> プロシージャ毎にTry CatchやOn Error Gotoころころ変えて使う奴は死んで欲しい。

お前の回りの糞環境なんかに興味はない。
0690デフォルトの名無しさん2014/09/29(月) 07:30:05.23ID:SCyCB+di
>>689
だからC#になればGoto文が消えるのか低脳
構造化やObject思考そのものを無視して作って平気なお前のような奴が
つらつらとスパゲッティコードを書いてドヤ顔して持ち越すから殺意を覚えるんだろうが。
環境以前の問題ということすら分かってないし、
C#って名前しか知らないならすっこんでろド低脳
0691デフォルトの名無しさん2014/09/29(月) 07:36:34.58ID:uxrvmLAq
>>690
On Goto は消えるだろうが
わざわざ >>689 で On Goto まで引用してもアホには無駄だったな w
そもそも、そんなアホな文句は作ってる奴に言え
0692デフォルトの名無しさん2014/09/29(月) 07:46:55.65ID:SCyCB+di
>>691
本質をすり替えるな低脳。
On Gotoが無くなったからなんだ?
Gotoを使った時点でObject指向としては破綻してるんだよ。
俺はアホかも知れないが、話せば話すほど無知をひけらかすお前はバカとしか言いようが無いな。
0693デフォルトの名無しさん2014/09/29(月) 08:22:18.56ID:uxrvmLAq
>>692
> On Gotoが無くなったからなんだ?

>>685
> .NetでもOn Error Gotoとか使えるの、アレ廃止にして欲しい。

人にいちゃもんつける前に、自分が書いたことぐらいちゃんと覚えとけ。
0694デフォルトの名無しさん2014/09/29(月) 08:33:08.11ID:SCyCB+di
>>693
はぁ?よっぽどオツムのネジがぶっ飛んでると見える。
今までのスレの流れ見ててなんでOn Error Gotoに限ったことだと思えちゃうわけ?
そんなどこに何使っちゃいけないかくらい
自分で考えられない頭だから低脳だって言うんだよ。なぁ、低脳。
0695デフォルトの名無しさん2014/09/29(月) 08:39:39.80ID:1duyPuLF
おまえら早起きだな
三文得してるか?
0696デフォルトの名無しさん2014/09/29(月) 10:07:23.72ID:KJgZcFnF
>>670
ありがとうございます。やっぱりそんな感じなんですかね
これが、「仕様変更でそうなった」のか「異常だけど以前動いていた」のかはわかりませんか?
頂いた情報から簡単なテストをしてみました

Sub auto_open()
Cells(1, 1) = "変更する"
ThisWorkbook.ChangeFileAccess xlReadWrite
MsgBox "表示される"
End Sub

「読み取り専用を推奨」で保存しファイルを読み取り専用で開くと期待通りに動きました

Sub auto_open()
ThisWorkbook.ChangeFileAccess xlReadOnly
Cells(1, 1) = "変更する"
ThisWorkbook.ChangeFileAccess xlReadWrite
'保存の確認が入る
MsgBox "ここまで処理させたい"
End Sub

いつもどおり読み書き可能で保存して開くと保存確認のメッセージが表示されて処理が中断されました
同じことをしているつもりなんだけどこう・・・なんか
やっぱり処理方法根本から見直さないとダメそうです。ありがとうございました
0697デフォルトの名無しさん2014/09/29(月) 11:01:47.46ID:uxrvmLAq
>>694
> 今までのスレの流れ見ててなんでOn Error Gotoに限ったことだと思えちゃうわけ?

お前が書いてるからだろ。

> そんなどこに何使っちゃいけないかくらい自分で考えられない頭だから低脳だって言うんだよ。

お前の頭ん中のことなんて知らんがな。

ちなみに goto 云々言いたいみたいだけど、goto とオブジェクト指向は関係ないぞ。
0698デフォルトの名無しさん2014/09/29(月) 12:42:22.93ID:SCyCB+di
>>697
>> 今までのスレの流れ見ててなんでOn Error Gotoに限ったことだと思えちゃうわけ?
>お前が書いてるからだろ。

どこにOn Error Gotoに限りって書いてあるのかな?日本語読めないの?

>>697
>> そんなどこに何使っちゃいけないかくらい自分で考えられない頭だから低脳だって言うんだよ。
>お前の頭ん中のことなんて知らんがな。

ふーん、Object指向一般で言われていることと、人の思い込みとの判別もつかないほど知識が欠落してるくせに
人に口出ししちゃうんだ。そんなことしなければそんな赤っ恥かかなくても済んだのにねぇ。

>>697
>ちなみに goto 云々言いたいみたいだけど、goto とオブジェクト指向は関係ないぞ。

ほー、俺の認識では構造化言語ですら例外処理以外では使わない方がいい認識だけどな。
じゃ、Exceptionの概念があるObject指向言語で、どんなシュチュエーションでGoto文が必要になるのか教えてくれないか?
Object指向だろうが関係無いんだろ?
0699デフォルトの名無しさん2014/09/29(月) 12:54:54.80ID:9mrfrP8m
>>698
二重以上のループの中から抜けたいとき。
そのためだけに無駄に関数に切り出してreturnにしたりとかしないといけないのはダサいだろ。
そもそも最近は関数型っぽくなってきてあまりループ書かんけど。
0700デフォルトの名無しさん2014/09/29(月) 13:13:27.86ID:SCyCB+di
>>699
へぇー。多重ループから抜けるとき、Goto文使うんだぁー。
しかもそれをさせないためには別途関数切り出したりしちゃわないと出来ないんだー。

これはもう、Object指向以前の問題だなw
お前、VBAからもう一度勉強し直した方がいいよw
俺はこんなのと真面目に会話してたのか・・・確かにアホだわ。俺。orz
0701デフォルトの名無しさん2014/09/29(月) 14:10:27.13ID:FADDnw+1
二重ループ抜けるのにgoto使うのってダメなの?
変なフラグ変数使ったり、インクリメント変数?を無理矢理いじるより分かりやすいと思ってたんだけど。
0702デフォルトの名無しさん2014/09/29(月) 16:17:04.88ID:iyWMPyYK
>>698
> どこにOn Error Gotoに限りって書いてあるのかな?

幼稚園児かよ w
お前は On Error Goto について書いたから俺はそれにレスしただけ
他のことは知らんし興味もないからレスする必要もないだろ

理解できたか?

> じゃ、Exceptionの概念があるObject指向言語で

Exception とオブジェクト指向も関係ないぞ w

>>701
普通に Ok
引っ込みつかなくなったバカが暴れてるだけだから気にしなくていいよ
0703デフォルトの名無しさん2014/09/29(月) 17:21:49.29ID:PXDdRZQD
>>702
うざいよ
0704デフォルトの名無しさん2014/09/29(月) 20:25:17.31ID:v3LAIsTa
全くの素人ですが聞きたいことがあるので質問です

Inputboxに入力された文字列が特定のセル範囲(B5〜B55)の文字列と一致したら次のマクロへ行くものを作りたいのですが
特定のセル範囲を指定、参照するための方法で難儀しています。
Vlookup関数を使おうと思うのですがネットや本では情報が少なくなかなか構築出来ません。
御助力願いたく思います。

OS Windows7
Excel 2010
0705デフォルトの名無しさん2014/09/29(月) 21:12:03.20ID:82y46eor
Userformでrefeditを使えば?
0706デフォルトの名無しさん2014/09/29(月) 21:31:49.34ID:SCyCB+di
>>702
お前の程度は知れたからもういいや。
好きなだけスコープ無視してGoto使って好きなだけスパゲッティコード組めばいい。
俺は別に困らない。
0707デフォルトの名無しさん2014/09/29(月) 21:32:39.79ID:jt92T0Nl
>>704
普通にfor文とかでループしてチェックしたらいいかなと思う。
無理に関数と絡ませないで。
初心者なら基本的なセルの参照の仕方から入ったほうがいいと思う。
0708デフォルトの名無しさん2014/09/29(月) 22:01:06.59ID:HClfAbJC
>>706
涙ふけよ w
07097052014/09/29(月) 22:14:54.21ID:82y46eor
全然的外れな事言ってしまった^^;
0710デフォルトの名無しさん2014/09/29(月) 22:22:52.67ID:FgfVx3KQ
>>704
最近、似たようなコード書いたわ。

If InStr(Worksheets(sheet_name(i)).Cells(y, x).Value, keyword) Then

こんな感じでfor文で回したらどうだろ
0711デフォルトの名無しさん2014/09/30(火) 08:40:35.88ID:D10jXUCk
>>704
WorksheetFunction.CountIf(検索文字, Range("B5:B55")) > 0

VBA的にやりたいならやっぱりfor文のループかね。ありがちなのは
For each checkCell in serachRange
とか

くっそ重いファイルで直接セル参照なんか繰り返してられねーよってなってくるとセル範囲を配列に取り出して〜とかやる
07127112014/09/30(火) 08:44:00.39ID:D10jXUCk
訂正
WorksheetFunction.CountIf(Range("B5:B55"), 検索文字) > 0

最初
WorksheetFunction.Match(検索文字, Range("B5:B55") ,0) > 0
こっち浮かんで引数なおすの忘れた
0713デフォルトの名無しさん2014/09/30(火) 13:44:04.29ID:GQLqZJ8w
変な質問ですみません
VBAコードを実行するボタンをエクセルシートに配置しています
時々ボタンを押して実行するとボタンが小さくなります
再現性や規則性がなくて困っているんですが、原因となるコードなどがあると思いますか?
0714デフォルトの名無しさん2014/09/30(火) 15:01:58.17ID:SORtUHAP
>>713
小さくなるのはボタンだけ?
Excelを終了するときに「保存しますか」って聞かれる?
0715デフォルトの名無しさん2014/09/30(火) 15:08:17.62ID:GQLqZJ8w
>>714
ボタンだけです
実行コードはシート移動や処理が含まれるので、終了時の保存確認はあります
0716デフォルトの名無しさん2014/09/30(火) 16:29:13.37ID:enG7bkWb
ホントにボタンのサイズが変わってるのか?
ズームとか変わってるんじゃないか?
0717デフォルトの名無しさん2014/09/30(火) 16:34:22.91ID:GQLqZJ8w
>>716
疑うのもごもっとも
内輪で使用しているのですが、自分も最初笑ってなにやったんだと答えたくらいです
デバイス、バージョンそれなりの組み合わせでまれに発生してます
自分も遭遇した時は笑ってしまいました・・・
何せ押す度にどんどん小さくなっていくんですもの・・・
0718デフォルトの名無しさん2014/09/30(火) 16:40:07.42ID:enG7bkWb
じゃあそう言うコードかいてるんだろ
シートでボタンにかかってる行や列削除したら、それに合わせてボタン縮むぞ
0719デフォルトの名無しさん2014/09/30(火) 16:43:46.99ID:GQLqZJ8w
>>718
もちろんそれは理解しています
削除に関係するコードはボタン部分にはかかってないです
シート間移動のボタンでも発生していのが、自分の理解を超えているところなんです
0720デフォルトの名無しさん2014/09/30(火) 16:49:35.00ID:enG7bkWb
発生したときにステップインでコード確認したら?
0721デフォルトの名無しさん2014/09/30(火) 16:53:49.33ID:GQLqZJ8w
>>720
やはりそうなりますよね
自分はまだ1度しか遭遇してないので、問題は発生した時に作業可能な環境かどうかなどになります
皆さんありがとうございました
もう少し分析してみます・・・
0722デフォルトの名無しさん2014/09/30(火) 17:35:24.63ID:UAQxGw3W
あまり分からずにコメントするけど、ボタンのサイズが変わる時になんかイベント発生しなかったか。
focusあたりとか。
そこにトラップ仕掛けておけば糸口にならないかな?
07237042014/09/30(火) 19:16:12.99ID:msJX1nXI
親切に教えてくれてありがとう
結局こんな感じになりました

Sub test()
Dim a
Dim b
Dim c
b = InputBox("入力してください")
c = Len(b)
For Each a In Range("B5:B55")
If c = 5 Then
If InStr(a.Value, b) > 0 Then
If b = "" Then Exit Sub
Call マクロ1

End If
End If
If b = "" Then Exit Sub
Next a
End Sub
07247042014/09/30(火) 19:18:49.79ID:msJX1nXI
ちなみにVBAではワークシート関数は基本使われないのでしょうか?
0725デフォルトの名無しさん2014/09/30(火) 19:57:38.65ID:Lzyb7JP9
Application.WorksheetFunction.〜で使うよ
0726デフォルトの名無しさん2014/09/30(火) 19:59:31.23ID:+B6ncc16
>>724
いや、別にそんなことはないと思うけど
0727デフォルトの名無しさん2014/09/30(火) 20:03:14.75ID:msJX1nXI
>>725
いや、>>707で関数絡ませないでと言っているので
Application.WorksheetFunction.〜
自体避けられているのかなと
0728デフォルトの名無しさん2014/09/30(火) 20:18:52.86ID:msJX1nXI
申し訳ない
うざったいと思われるかもしれないがもう一つだけ

>>723で一致した文字列のセルの右隣のセルに数値を加算する場合どのようにすればいいでしょうか?
0729デフォルトの名無しさん2014/09/30(火) 20:34:43.11ID:7x1dA5IG
>>727
あーすまん、707だけどVLOOKUPに迷ってる感じの書き方だったし、50件程度のデータだから無理に使う必要もないと思い書いたまで。
forだと言語問わずプログラムの基本だからサンプルも多いだろうしさ。

ただ、自分はworksheetで出来ることはworksheetで終わらせて、VBAではほとんど使わないかな。
roundupとかくらいかな?積極的に使うのは。
ま、ここは好みとかあれば、worksheet関数の方が処理が速かったりと色々。
0730デフォルトの名無しさん2014/09/30(火) 20:58:51.49ID:2xIMsJb6
>>723
> If c = 5 Then
> If b = "" Then Exit Sub

b, c はループの中で変わらないからループに入る前に判定した方が分かりやすいよ
あと、変数の型は指定した方がいい
0731デフォルトの名無しさん2014/09/30(火) 21:05:36.63ID:RxufM98r
お前の指図は受けん
0732デフォルトの名無しさん2014/09/30(火) 22:56:01.85ID:/X78r07n
誰か呼び出し元のブックにExcelDriverを使ってODBC接続して、
ワークシートをSQLで操作してる人いない?
試しに実装してみたら保存前のデータも読み書きできるし、
変にうまくいってるもんだから落とし穴でもあるんじゃないかと気になるんだ
0733デフォルトの名無しさん2014/09/30(火) 23:07:51.16ID:5nwoXrmL
そーですね。
0734デフォルトの名無しさん2014/09/30(火) 23:10:56.54ID:RxufM98r
>>732
そもそもそんな中途半端なもんいらんという大きな落とし穴がある
0735デフォルトの名無しさん2014/10/01(水) 00:13:11.81ID:/nUw76iD
あるエクセルファイル(ファイルAとします。)に例えば下記のようなデータが入力されていたとします。

      A列   B列
1行目  名前   番号
2行目  ヤマダ  10
3行目  タナカ   20
4行目  サトウ   30
 ・
 ・
 ・

別のファイルに下記のようなデータがあったとします。

      A列   B列
1行目  名前   
2行目  サトウ  
3行目  タカダ
4行目  オオハシ
 ・
 ・
 ・

このファイルのA列に入力されているそれぞれの名前について、ファイルAのA列で
どの行数にその名前があるかを検索して、B列に入力されている番号を取得して、
このファイルのB列に入力したいのですが、どのようにすれば検索、データ取得、
データ入力がスムーズに処理できるでしょうか。
よろしくお願いします。
0736デフォルトの名無しさん2014/10/01(水) 00:39:19.57ID:iilx0lFQ
>>735
それVBA使わんでもVLOOKUPだけで出来るけど
どうしてもVBAでやりたいのか?
0737デフォルトの名無しさん2014/10/01(水) 05:47:19.81ID:Y6dDxP8G
>>732
以前から何回もそれについては書いてる。
落とし穴?
ああ、試してないから分からんけど、以前同じ方法でCSVファイルから値を取得しようとして、
項目名に当たるヘッダを大文字、小文字で別項目にしようとしたとき、
別ものとみなしてくれなくて勝手に別名付けられたってのが有った。
多分Excelでも同じことが起こるんじゃないか?
0738デフォルトの名無しさん2014/10/01(水) 06:04:45.61ID:Y6dDxP8G
>>735
そこに載ってる例が単純化したもので、実際にはもっと複雑なことをやってると想定して言うと、
>>732の人が言ってる方法使うとSQL投げればいいからまあ楽と言えば楽。
本当に単純なものだったら>>736の人が言ってる方法が一番楽かな。
0739デフォルトの名無しさん2014/10/01(水) 10:44:31.32ID:/9i+VWPU
>>724
>>711でVBA的にやりたいのなら〜って言ったのは融通効かないから
現に>>728みると「やりたいこと」が膨らんでいるわけだしfor eachを選んで正解じゃないかな
ところで、わざわざ文字長調べてInStrで比較チェックしてるのはなんなのだ?

Sub test()
Dim a As Range
Dim b As String
b = InputBox("入力してください")
If b = "" Then Exit Sub
For Each a In Range("B5:B55")
If a.Value = b Then
Call マクロ1
'a.offset(0 ,1) = a.offset(0 ,1) + 1 '>>728に対応するなら
'Exit For 'マクロ1走らせるのが1度きりなら誤作動防止のためにも入れるべき
End If
Next a
End Sub

書いてしまったが「EXCEL VBA 右隣のセル」でくらいはググってほしかったかもしれん
0740デフォルトの名無しさん2014/10/01(水) 17:05:22.06ID:eAztE/fR
>ところで、わざわざ文字長調べてInStrで比較チェックしてるのはなんなのだ?

やり方としてはまだるっこしいと思うけれど、>>723のやり方だと部分一致で検出できる
>>739だと完全一致のみ検出される
他にもやりようは色々あるけど、俺だったらRange.Findを使う。
0741デフォルトの名無しさん2014/10/01(水) 17:53:41.81ID:DKX9Y3Cd
>>739-740
ありがとうございます
参考になりました。

ところで皆さんどうやってVBA学びましたか?
本買ってもあんまり役に立たなくて面喰ってるんですが…
0742デフォルトの名無しさん2014/10/01(水) 18:09:10.75ID:Y6dDxP8G
>>741
最初は仕事場に転がってるソース見ながらNetで意味調べてやってたかなぁ。
本はある程度知識が付いて来た後は余り見なくなった。
0743デフォルトの名無しさん2014/10/01(水) 18:19:04.87ID:eAztE/fR
>>741
本も何冊か読みましたけど、一番役立ったのはWeb検索でした。

分からないときには適当なキーワードで検索すると
大抵答えが出てるんでとても助かります。

OfficeTANAKAさんとかMougさんとか
その他色々な解説サイトも非常に重宝しますね。
検索しても大抵その辺のサイトは出てきますし。
0744デフォルトの名無しさん2014/10/01(水) 18:38:03.31ID:68pKVrQC
マイコンBASICマガジンで覚えた俺は少数派だろうな
0745デフォルトの名無しさん2014/10/01(水) 18:48:44.54ID:Y6dDxP8G
>>744
ベーマガってVBAが出るくらいまで出てたっけ?
VBAとN-BASIC系は全然別物だと思うんだけど。
0746デフォルトの名無しさん2014/10/02(木) 01:21:36.32ID:ywyt30SG
EXCELのセルをURLのリンクみたいにクリックすることでジャンプさせることはできないでしょうか?
目次機能みたいなものが欲しいです

今はF5からジャンプしていますが、メニューがソートされたりカテゴリ分けが出来ないので不便で仕方がありません
0747デフォルトの名無しさん2014/10/02(木) 06:18:04.82ID:ulPYsQCB
>>746
リンク見たいにっていうか
セルにハイパーリンク書けばいいんじゃないか
特定セルへの移動もできるし
VBAとか要らんぞ

どうしてもVBAでやりたいならBeforeDoubleClickとかSelectionChangeとかの
イベント使ってやればできなくはないが、保守考えるとお勧めじゃないぞ
0748デフォルトの名無しさん2014/10/02(木) 08:02:16.37ID:ywyt30SG
>>747
まさしく実現したい機能そのものでした!
ありがとうございます
0749デフォルトの名無しさん2014/10/02(木) 08:43:07.47ID:M81Thj4V
>>740
部分一致で検出できるってのは知ってる
元がVLookup使いたいみたいな話だったから完全一致で一度のみじゃねーの?と思って
というか、部分一致で検出しちゃうから厳密には期待した動作になってるか怪しくね?
まぁ、ただの好奇心

Range.Findでもいいとは思うけど、Excelの検索機能とオプション共有してるからきちんと指定してやらないと誤動作起こすし、逆にExcelの検索のオプションいじられるのも嫌
どうしてもFindNextまで使いたいってときじゃないと使わないなぁ
0750デフォルトの名無しさん2014/10/02(木) 20:43:46.06ID:jyfn+Ffi
VBAの関数をコールバック関数要求するAPIに渡すことってできませんか?
0751デフォルトの名無しさん2014/10/02(木) 20:55:00.29ID:+TLNVR7u
>>750
できます
AddressOf
0752デフォルトの名無しさん2014/10/04(土) 00:15:08.54ID:vdHHVoH9
ありがとう
つーことは色々できそうですね
0753デフォルトの名無しさん2014/10/05(日) 12:57:47.89ID:ZPhiPoMg
説明のため超簡単な具体例を挙げますと

Type Person
Name as String
Age as Integer
End Type

と定義したユーザ定義タイプ(?)で配列変数を使用しています。
Dim Person() as Person

ここでExcelシート関数のVLOOKUPように、Personの名前から年齢をひっぱってくるのに
一番単純かつ定番な方法は、どういうコードでしょうか?
0754デフォルトの名無しさん2014/10/05(日) 12:59:13.79ID:ZPhiPoMg
まさかVLOOKUPの機能をVBAで自分で自作しないといけないですか?
まあそれはそれほど難しくはないけど、ひょっとしていい方法があるのかなと思いまして。
0755デフォルトの名無しさん2014/10/05(日) 15:09:22.76ID:30lOmxOS
>>754
まぁ、ユーザー定義型の配列ならFor文で探すしかないんじゃない?
もっとも、代わりにいい方法が無いかと言われればディクショナリを使う方法は有るけど。
0756デフォルトの名無しさん2014/10/05(日) 15:37:06.29ID:ZPhiPoMg
>>755
そのディクショナリとはなんですか?
Collectionとは違うのですか?
どういう機能なのですか?
0757デフォルトの名無しさん2014/10/05(日) 17:57:42.69ID:30lOmxOS
>>756
いや、少しはググろうよ。
0758デフォルトの名無しさん2014/10/05(日) 22:25:09.06ID:D9zVmpHm
ディクショナリだと同姓同名の対処が面倒そう
0759デフォルトの名無しさん2014/10/06(月) 12:52:30.85ID:OCEMuI/e
コンボボックスで最初から表示させておくアイテムを入れるにはどうしますか?
ひょっとしてコードからでないとできないのですか?
0760デフォルトの名無しさん2014/10/06(月) 19:20:13.00ID:nHQnp75N
プロパティの「リスト」から
0761デフォルトの名無しさん2014/10/06(月) 19:49:48.15ID:OCEMuI/e
>>760
プロパティに「リスト」は無いんですよ。
かわりにListRowsやListStyleやListWidthはあるけど。
0762デフォルトの名無しさん2014/10/06(月) 19:57:15.85ID:5vMehEVP
>>761
ListFillRangeプロパティ
0763デフォルトの名無しさん2014/10/06(月) 20:21:48.40ID:OCEMuI/e
>>762
そんなのないよ
0764デフォルトの名無しさん2014/10/06(月) 20:28:25.29ID:5vMehEVP
>>763
どっかのバージョンから 無くなったのか?
http://officetanaka.net/excel/function/tips/tips05.htm
0765デフォルトの名無しさん2014/10/06(月) 20:45:35.85ID:D2J3InuJ
コンボボックスとCellの入力規制を間違えてるオチ臭い
0766デフォルトの名無しさん2014/10/06(月) 21:32:00.75ID:hFMdywSq
教えてくださいまし。

excel2010のグラフ上をクリックしたら
その座標に要素が追加されるマクロを組もうとしています

グラフのmousedown,mouseupイベントで取れるxy座標は
どうもグラフ内の座標ではなく、別の原点から数えた数字のようです

これをグラフ中の系列の座標に変換する方法はありませんか?
0767デフォルトの名無しさん2014/10/06(月) 23:09:34.41ID:1aJf3StA
専門のイベントハンドラとか手段があるのかもしれないけど
泥臭い方法としてスクリーン座標を得てWindowFromPointとかでグラフのウィンドウを特定して
グラフの描画領域の長方形の位置を調べてグラフの座標系に変換かなあ
書いててあまりやりたくないなあ
0768デフォルトの名無しさん2014/10/07(火) 07:40:45.16ID:BDzrKSeM
プログラムを高速化するために
コードのどこで時間がかかっているかを突き止めるための
ツールかなにかはありませんか?

ALT+F11でいつも使うエディタ環境でそういうツールがあれば良いのですが・・・
0769デフォルトの名無しさん2014/10/07(火) 07:49:56.46ID:BDzrKSeM
使ったオブジェクト変数たちは
Set objTest = Nothing
として解放すべきですか、しなくてよいですか?
0770デフォルトの名無しさん2014/10/07(火) 08:08:56.38ID:fQQLijMg
>>769
荒らしネタの定番乙です
0771デフォルトの名無しさん2014/10/07(火) 08:24:55.78ID:g8pr77TK
>>768
その、いつも使うエディタ環境でF8(ステップ実行)おしっぱにして体感
ブレイクポイント置きまくってF5ポチポチして体感

普通に処理時間を計測するコード入れればいいんじゃねーの?
0772デフォルトの名無しさん2014/10/07(火) 09:08:58.63ID:g8pr77TK
>>766
マクロの記録でちょっと覗いてみた
ActiveSheet.ChartObjects("グラフ 1""").Activate
ActiveChart.PlotArea.Select
Selection.Top = 52.102
Selection.Height = 203.72
ActiveChart.Axes(xlValue).MinimumScale = -1
ActiveChart.Axes(xlValue).MaximumScale = 3.5

mousedownの原点がどこだか知らんけどChartObjectsの原点との差分、PlotAreaとの差分でポイント位置求めて
ポイント位置/Height をMinimumScale MaximumScale の比率で合わせる感じか?
横方向もクリックした位置が何項目目の領域なのかを求めて、とかか
軸の向きにも注意かね(グラフは下から上に増える・位置座標は上から下に増える)

系列が複数あった場合はもうシラネ
0773デフォルトの名無しさん2014/10/07(火) 09:26:41.44ID:8v3U01k9
>>769
必ずして下さい。
高速化云々ではなくお作法として。
0774デフォルトの名無しさん2014/10/07(火) 09:54:41.84ID:fuGUBakF
>>773

コード書いてて
Set objHoge = hoge
…
Set objHpge = Nothing
みたいなことはよくやるけど、

For Each objHoge In hoge
…
Next objHoge

のあとに
Set objHpge = Nothing

を入れることはあまり無いな。
何でかって言われると理由は特に無いんだけど。

あと FileSystemObject みたいにコード内の複数個所で使うオブジェクトだと
パブリックで宣言するからNothingするタイミングがつかめない。
こういう場合にはローカルで使うごとに宣言して
その度ごとにNothingするほうがリソースの無駄遣いのような気がする。
0775デフォルトの名無しさん2014/10/07(火) 12:25:51.31ID:ZHGs/h37
無意味な初期化や後始末を推奨する風潮がバカプログラマを濫造する一因になっている
0776デフォルトの名無しさん2014/10/07(火) 12:55:01.51ID:GinpV+dZ
>>775
そういうお前はどんな時が無意味でどんな時に意味あるのかちゃんと区別できてるのか?

変数の寿命が尽きる直前ならNothingする意味はないけど
まあわからないなら作法として書いとけばいいんじゃね
0777デフォルトの名無しさん2014/10/07(火) 13:17:54.15ID:pP8u07NL
常に間違うバカプログラマ>たまに間違える半熟プログラマ
0778デフォルトの名無しさん2014/10/07(火) 13:34:36.24ID:fuGUBakF
>>775-776

むしろ初期化や後始末を言語任せ・システム任せにするほうが
よほどバカプログラマを産んでると思う。

俺にとってNothingを入れるのは
その変数の使われてる部分を明確に意識付けするための手段なので、
そう考えると For Each のときにNothingしてないのは
Nextの時点で区切りが付いてると無意識に考えてるからかもしれない。
0779デフォルトの名無しさん2014/10/07(火) 13:50:26.78ID:GinpV+dZ
>>778
Forループの意識はまあわかる
たがVBAではForループでのスコープはない
Staticという、スコープを抜けても寿命の尽きない変数もある

人間はミスをするんだから、システム任せに出来るところは任せる方がミスは減ると思うけどね
初期化をシステムに任せてバカになるほどプログラミングは単純な作業じゃないし

初期化しないと変数に何が入ってるか保障されない言語とか、いまさら恐ろしくて使う気になれん
0780デフォルトの名無しさん2014/10/07(火) 14:10:24.54ID:DDN2zglu
mainの最後でmallocしたものをfreeするのがお作法 ← 馬鹿
0781デフォルトの名無しさん2014/10/07(火) 14:16:21.08ID:BDzrKSeM
>>771
やっぱりそうやるしかないんですか。
というかみんなそうしてるんですか。
なにかものすごいツールでもあると思いましたが。

しかしなんか盛り上がってますね (ワラ
0782デフォルトの名無しさん2014/10/07(火) 18:36:49.82ID:RmI68rZw
>>781
この後Nothing代入時にメモリが解放されるかどうかという流れ
0783デフォルトの名無しさん2014/10/07(火) 19:18:23.92ID:GinpV+dZ
>>768,781
VBA向けのプロファイラがいくつかあった気がする
ググってみたら?
0784デフォルトの名無しさん2014/10/07(火) 21:25:16.21ID:QmqH+DBr
俺もNothing省略派だったんだけど、
メモリにゴミが残ることが有るって聞いてから、
怪しげなのは一応Nothing書くようにしてる。
でも無意味にやるのも何かアレなんで、.Net使ってるときは出来るだけDisposeメソッドを実装してUsing
使うようにしてるかな。
VB6やVBAで同じ様なことをやろうとすると、
With New クラス名 みたいになると、VB6のスレで言ってる人がいたけど、
何故かその方法はあのスレでは忌み嫌われていたみたい。
07857662014/10/07(火) 23:35:31.20ID:y3mcae+E
今日会社でセコセコと作ってやっとできますた


ググって出てきた良サイトが非常に参考になりました。
要点は3つあります。

1.range("a1")の左上xy座標を取るメソッドがある
2.chartareaのtop,left,width,heightの座標はrange("a1")からの相対座標
3.相対座標はすべて72ppiでマウス座標は96dpi
4.上記の変換とズーム倍率を考慮して距離の変換をする

これでマウスでクリックした座標に要素を追加することができますた
0786デフォルトの名無しさん2014/10/08(水) 06:33:01.15ID:cp4LepTB
>>785
ポイントとインチは長さの単位だから、環境にかかわらず同じ
1インチ=72ポイントだから、72ppiはまあ正しいんだけど
dpiは解像度の単位だから、環境が変われば変わる可能性は有るぞ
96DPIってのは今のWINDOWSの標準的な設定での話
ただVBAで直接その値を取る方法はないっぽいけど
0787デフォルトの名無しさん2014/10/08(水) 21:34:35.31ID:XyELhX/g
それがあるんだな

このサイトはちょっと神だった。
完全にやりたいことのエッセンスが全部かかれてた

http://home.att.ne.jp/zeta/gen/excel/c04p06.htm
0788デフォルトの名無しさん2014/10/08(水) 22:10:02.55ID:0nBP/2kH
そらまあAPI使えば他のアプリでできるようなことはなんでもできるだろ
0789デフォルトの名無しさん2014/10/08(水) 22:14:24.26ID:cp4LepTB
>>787
直接って意味通じなかった?
API良べば取れるけど、それはVBAの直接の機能じゃないから
0790デフォルトの名無しさん2014/10/08(水) 22:19:27.00ID:cp4LepTB
×API良べば
○API呼べば

あとときどき、ポイントって言葉をドット数の意味で使ってる文章もあるから注意な
0791デフォルトの名無しさん2014/10/08(水) 23:00:42.17ID:pLmgaWPq
ポイントとドットってどう違うんですか?
0792デフォルトの名無しさん2014/10/08(水) 23:47:10.00ID:UFd7lKdk
ちょっと待て
>>787のサイトは検証用にしかAPIは使ってないぞ
0793デフォルトの名無しさん2014/10/08(水) 23:52:58.12ID:0nBP/2kH
>>791
ポイントはコンピューターができる前から印刷業界で使われてる文字サイズの単位
ドットは表示装置や印刷装置の最小単位
0794デフォルトの名無しさん2014/10/09(木) 00:13:22.66ID:1Jbx/p96
>>793
>ドットは表示装置や印刷装置の最小単位
解像度の大きな液晶ディスプレイをVGAモードで使ったりすると
画面の1ドット=1ピクセルじゃなくなるけどな

ドットには点っていう以上の意味はない
それ以外の意味は文脈で判断しろ
0795デフォルトの名無しさん2014/10/09(木) 00:23:22.68ID:1Jbx/p96
>>792
誰へのレスだよそれ
>>786へのレスだとするなら
そのサイトのVBAのコードでは96DPIで決め打ちしてるからな

検証で値しらべるならその値を使えば良いのにとも思うが
まあAPIは本筋じゃないと考えてるのかもしれん
0796デフォルトの名無しさん2014/10/09(木) 06:43:38.28ID:6IcNd+Zb
>>789 それいったらマウス座標だって取れない
0797デフォルトの名無しさん2014/10/09(木) 07:34:27.41ID:1Jbx/p96
>>796
どの座標系化は置いといて、MouseDownで位置は取れるって話から始まってるわけですが
0798デフォルトの名無しさん2014/10/09(木) 18:42:01.62ID:FQmwM76k
ワークブックのイベントプロシージャってどのように使用してますか?
ブックを開くときとか印刷するときの操作とかいろいろあるようですが
具体的にどう使用すればいいか思い浮かばないです
0799デフォルトの名無しさん2014/10/09(木) 18:46:27.75ID:Nbu2CYiA
思い浮かばないなら使う必要ないんだろ
使い道のわからない道具が自分の役に立つとか思うわけ?
0800デフォルトの名無しさん2014/10/09(木) 20:30:42.90ID:otWTg9aK
なんでそんなに喧嘩腰なんだ?
0801デフォルトの名無しさん2014/10/09(木) 20:37:10.58ID:/IXmqSOL
くっだらねー質問するからだろ
0802デフォルトの名無しさん2014/10/09(木) 21:02:19.88ID:FQmwM76k
>>799
使い方わかればやりたいことが浮かぶ場合もあるでしょ
選択肢を増やしたいだけですよ
0803デフォルトの名無しさん2014/10/09(木) 21:37:18.59ID:/IXmqSOL
学校の宿題?
0804デフォルトの名無しさん2014/10/09(木) 22:00:18.20ID:yXhns5Mt
まぁそうカリカリしなさんな。
0805デフォルトの名無しさん2014/10/09(木) 22:33:26.25ID:otWTg9aK
>>803
こんなピンポイントな機能を宿題にする学校があるかよ
ひょっとして、大学とか言うところに行ったら、なんかわからんけど難しいことやってるらしいから、Excel の全ての機能が宿題に出るとか思ってたりして w
0806デフォルトの名無しさん2014/10/09(木) 23:50:25.77ID:/IXmqSOL
仕事してて、なんか無駄に手間や時間がかかる作業がある→vbaで楽できないか?
が普通じゃないの?

イベントってのがある→この機能使って何かできないか?
なんてこと考えるのは暇な学生か、学校の宿題かなと。
資格取る系の専門学校ならイベント使ってなんか書いてこいってありそうだし

すれ違いなんでこの辺で。
0807デフォルトの名無しさん2014/10/10(金) 00:03:28.54ID:EHlSM9Y1
Workbook_Open()には保存しないでBookを閉じるコードを
本人が見てないときに記述したりとか
0808デフォルトの名無しさん2014/10/10(金) 00:11:55.36ID:5oxKWxyB
>本人が見てないときに記述したりとか

さりげなくえげつないな、ヲイ w
0809デフォルトの名無しさん2014/10/10(金) 00:34:22.66ID:JVLooUg+
>>807
どういう意味?
0810デフォルトの名無しさん2014/10/10(金) 11:57:55.66ID:JVLooUg+
Objectなら

For Each obj in Selection.Cells
・・・・
Next obj

の記述ですべての対象オブジェクトを処理することができますが
・配列のすべての要素
・セル選択範囲をVariant型の変数に入れて、そのすべてのセル
にある処理をしたい場合、どうしたらいいのでしょうか?
0811デフォルトの名無しさん2014/10/10(金) 13:53:55.74ID:nfu2OY0n
>>810
For Each obj in (Variant型の変数)
・・・・
Next obj
0812デフォルトの名無しさん2014/10/10(金) 14:04:52.59ID:VoLeXZi+
Variant型変数にセル範囲を通常代入すると
変数にはデフォルトプロパティであるValueの配列、つまりセルの値の配列が入り
そこには値の情報だけでセルそのものの情報(アドレスなど)が無いから、
それを元にセルへの操作をすることは出来ない

Variant型変数にセル範囲をSet使って参照代入してるなら
その変数はセル範囲のオブジェクトと同じなので>>811でいける
0813デフォルトの名無しさん2014/10/10(金) 18:47:40.76ID:cGiw//Qi
>>810
なぜに Variant なの?
Range 型でいいと思うが
0814デフォルトの名無しさん2014/10/10(金) 21:52:33.78ID:HyTC8hvE
ComboBoxのドロップダウンリストの右側にスクロールバーが出るんです
表示させる行数とアイテム数は同じなので、おそらく行の高さが足りないせいだと思うんですが
ドロップダウンの行の高さって変更できますか?
0815デフォルトの名無しさん2014/10/10(金) 22:02:15.04ID:HyTC8hvE
すいません、勘違いでした、やはりアイテム数の方が多いだけでした
>>814は無視してください
0816デフォルトの名無しさん2014/10/10(金) 22:24:40.26ID:MdI71dED
function hoge(a,b)をつくったとして、
呼び出すときに
call hoge(a,b)
か
hoge a,b
で呼び出しますが、
後者のように括弧を付ける必要がない関数の呼び出し方に名前は付いていますか?

ずっと
hoge(a,b)で呼びだそうとしてハマっていまして、勉強したいなぁと思った次第です
0817デフォルトの名無しさん2014/10/10(金) 22:55:32.74ID:de2+aj1W
ちなみに前者の名前は?
0818デフォルトの名無しさん2014/10/12(日) 00:55:12.07ID:/KY4YfKQ
>>816
callステートメントなしの呼び出しは、たぶん古い文法。C言語やJavaがメジャーになっているいまでは、誰が見ても分かりにくい。callステートメントで呼び出すべき。
0819デフォルトの名無しさん2014/10/12(日) 02:25:36.21ID:6IYKdj0B
>>818
CやJavaで、Callに該当する「関数・メソッドを呼び出す命令」を教えて欲しいもんだ
0820デフォルトの名無しさん2014/10/12(日) 16:11:59.03ID:JzEmhAxb
チャート名が1から20の連番となっています。

イミディエイトウィンドウに
?ThisWorkbook.Worksheets("Chart").ChartObjects(3).name
と打ちEnterすると
4
が返ってきます。これは理解できます。
インデックス番号とチャート名が必ずしも一致していないからです。

下のように打ち込みEnterで
?ThisWorkbook.Worksheets("Chart").ChartObjects("3").name
この結果となります。
4
"3"というチャートオブジェクトの名前は"3"と期待していたのに"4"という結果でした。

ChartObjectsに"3"という名前でアクセスできないのでしょうか?
0821デフォルトの名無しさん2014/10/12(日) 16:52:46.90ID:JzEmhAxb
>>820はとりあえずチャート名を数字だけででなく、文字列+数字とすることで名前でアクセスできました
(今まで"2"という名前のチャートは"Chart_2"という名前に変更しました)
0822デフォルトの名無しさん2014/10/12(日) 22:45:21.32ID:O7/KUbKN
>>819に同意。
CやJavaでcall相当句かがないから
VBbAではcallを使わないのがナウいと思うのだがちがうのか?
その場合、カッコを使いたいのに使えない違和感は残るが。
0823デフォルトの名無しさん2014/10/12(日) 23:24:09.48ID:+YSzC4gt
Callを使いたいならカッコを付けてCallを使わないんであればカッコをつけない。
このしきたりさえ守っていればどっちでもいいんじゃないかと思う。
これはVBAに限らずVBでも同じ。
0824デフォルトの名無しさん2014/10/12(日) 23:31:49.26ID:O7/KUbKN
>>823
では、それどっちがカッコいいですかね?
0825デフォルトの名無しさん2014/10/13(月) 02:20:43.77ID:K6UGdcTn
ttp://fast-uploader.com/file/6968689125552/

エクセルに画像を貼り付けて、「問題開始」というボタンを用意してそれをクリックしたら上記フォームがでるようにします。
そのフォームで任意の場所を右クリックしたら問題をシートのセルから呼び出して,その後「正しい」「間違い」をクリックすれば,右側に正誤の○×と解説がでるようにしたいです。
その後シートの別セルから解説を呼び出す。そのあと右クリックしたら次の問題がでて,戻りたい場合は左クリックを押せば1問戻る。
というようなVBAを作りたいです。

コードを作成していただけないでしょうか?
0826デフォルトの名無しさん2014/10/13(月) 05:20:35.79ID:vRAUewd3
これは見事なクレクレ
0827デフォルトの名無しさん2014/10/13(月) 12:10:57.56ID:jfQv/DEB
>>825
私がやりましょう
見積額は5万円(税別)です
バグには対応しますが改善の提案や仕様の変更や追加は別料金です
0828デフォルトの名無しさん2014/10/13(月) 13:54:12.06ID:dwdekEXY
おれなら、49800円でやってやるよ。
0829デフォルトの名無しさん2014/10/13(月) 14:53:39.72ID:K0lQn6l5
>>825
仕様書まで書いてくれるなら、俺が5千円でやってやるよ
仕様書書けないと、細かいところは作りながらサンプル使って貰っての調整になるので3万な
0830デフォルトの名無しさん2014/10/13(月) 16:03:41.32ID:c0FdQNYR
ttp://fast-uploader.com/file/6968738871999/

passはkop VBAのパスは00000

元ネタのエクセルはこのとおりなんですけど

いちいち正しい誤りを選択して解答するという手間と
表示される○×が解答に対しての○×なのでわかりづらいところが一番ネックです

例えば誤りが正解で解答を正しいとした場合「正しい(取り消し線あり) 誤り」のような表記にしたいです。

>>829さんどんなものでしょうか?
0831デフォルトの名無しさん2014/10/13(月) 16:28:56.52ID:K0lQn6l5
>>830
なんでここまで作れて、質問というか依頼の件を作れないのか不思議だ
もしかして他人が作ったものを手直ししたいとかなのかな?

ここまで作れるくらいの能力はあるってなら、ここのレスを使って文章やコードを回答し
それを依頼者自身がブックに組み込めば解決するが
他人が作った物で、VBAは殆ど分からないってなら、ブックとして仕上げてやらないと
どうにもならんだろう

その辺はどうなんだい?

例えば

Private Sub CommandButton1_Click()
を
Private Sub Answer(q As Long)
に書き換えて

Private Sub CommandButton1_Click()
  Call Answer(1)
End Sub
Private Sub CommandButton2_Click()
  Call Answer(2)
End Sub
のコードを追加し

CommandButton1のCaptionを"正しい"
新たに作ったCommandButton2のCaptionを"誤り"にする
そしてCommandButton1,2をフレームの中に入れて、サイズと位置を調整する


なんて解説で理解できるのかな?
0832デフォルトの名無しさん2014/10/13(月) 17:34:10.60ID:UPM0IlOC
VBScriptから新規ブックを作成して、
(VBScriptから)そのブックにVBAマクロを埋め込んで、
(VBScriptから)そのマクロを実行させる

というようなことをしたいと思います
昔同じような処理を書いた気がするのですが、2行目の方法を思い出せずにいます
もしできるのであれば2行目の方法が知りたいです
0833デフォルトの名無しさん2014/10/13(月) 18:26:40.48ID:pMXJ+1G0
>>825
おれが勉強がてら29800円で試作してやるよ
0834デフォルトの名無しさん2014/10/13(月) 18:29:57.58ID:pMXJ+1G0
>>830
なんでエクセルで234Mもあんだよw
0835デフォルトの名無しさん2014/10/13(月) 19:40:00.09ID:4xgZUT3/
>>832
(VBScriptのスレに)行けば白桃みたいな名前の人が教えてくれるよ
0836デフォルトの名無しさん2014/10/13(月) 20:45:08.99ID:M+L2tDc7
>>834
なんか間違ってないか?
俺が>>830からダウンロードしたのは
サイズが229KB (234,756バイト)になってるけど?
0837デフォルトの名無しさん2014/10/14(火) 01:43:55.59ID:zpHmU28Q
>>835
最近見ないと思ったら別んとこ居たのね
0838デフォルトの名無しさん2014/10/14(火) 21:49:01.83ID:/bXqI/YD
>>831
レスありがとうございます
おっしゃるとおりVBAは殆どわからない者です。

コマンドボタン1を押したら答え1を呼び出して
コマンドボタン2を押したら答え2を呼び出す。
とやりたいことはなんとなく自分でもわかるのですが
具体的なコードの記述がさっぱりですから・・

Private Sub Answer(q As Long)

End Sub

Caption

の意味はわかりません・・・
0839デフォルトの名無しさん2014/10/14(火) 22:12:13.02ID:o4U/JqTO
>>838
入門書でも読めよ!
0840デフォルトの名無しさん2014/10/14(火) 22:26:20.70ID:7vQffhSK
>>838
カエルのやつおすすめ
0841デフォルトの名無しさん2014/10/16(木) 16:14:24.72ID:Z4Itq52S
WorksheetFunction.Vlookup( )を使うとき
もし該当の検査値がなければエラーを出さずに空欄""を返すようにしたいのですが
どうしますか?
0842デフォルトの名無しさん2014/10/16(木) 20:22:59.30ID:2oOPO/Rw
>>841
On Error
0843デフォルトの名無しさん2014/10/16(木) 20:38:54.84ID:dCooRIFL
>>841
今のバージョンでも使えるかどうかわからんが
Application.VLookup使って、VarTypeなりIsErrorなりでチェックする

だめならOn Errorでエラー拾うしかないんじゃね
0844デフォルトの名無しさん2014/10/19(日) 13:25:50.68ID:VcRItLWH
Excel総合相談所 115で質問しましたが、答えが得られなかったので、こちらで質問します。
あちらのスレにはこちらに書き込むことを書き込みます。

【1 OSの種類         .】 Windows7
【2 Excelのバージョン   】 Excel10
【3 VBAが使えるか    .】 はい
【4 VBAでの回答の可否】 可

大量のアンケートがあるので、集計フォームを作って入力と集計を行おうと思ってます。
それぞれ対応したオプションボタンを押すと、対応したセルに1を代入するみたいな事ってできますか?

イメージとしては下記のような感じです。

10代 20代 30代 男性 女性 独身 既婚
 ○   ○   ○   ○  ○   ○  ○
         入力←ボタン


10代 20代 30代  │ 男性 女性 │ 独身 既婚
 
1               1         1
         1          1     1

1               1              1

また、アンケートは沢山あるので、入力のボタンを押したら、フォームに入力した内容をクリアして
表内の次の行の先頭の列にアクティブなセルを移動して、次のアンケートを1個下の行に入力する事もできますでしょうか?

今までは手で入力してたのですけど、アンケートの量が膨大過ぎて、こんな事ができたらいいなと思っています。
VBAのユーザーフォームで作成しようと思っています。
0845デフォルトの名無しさん2014/10/19(日) 13:58:17.66ID:QQzlmOcf
>>844
可能です
それぞれのボタンにCommandButton_Clickイベントがあるので、そこでセルに数字を書き込んだり行を移動したりするだけです
0846デフォルトの名無しさん2014/10/19(日) 14:01:30.09ID:QQzlmOcf
>>844
少しおせっかいになりますが、セルに書き込むデータはこのようにした方が集計が楽になりますよ

年代 性別 家族
10    1   1
20    2   2
10    2   1
30    1   2
0847デフォルトの名無しさん2014/10/19(日) 16:00:42.76ID:VcRItLWH
>>846
なるほど、CommandButton_Clickに仕込むのは思いつきませんでした。
最終的に入力するコマンドボタンに対して設定が必要と思っていました。
ボタン毎に個別に設定すればいいのですね。
これからその方法を勉強してきます。
ありがとうございました!

顧客のフォーマットがこの入力方式で、変更不可なのです。
その形のほうが入力も集計も絶対楽ですよね・・・・
0848デフォルトの名無しさん2014/10/19(日) 16:06:43.16ID:QQzlmOcf
>>847
選択肢のグループごとにラジオボタンにまとめた方が、入力の重複とか考えなくていいから楽かな
0849デフォルトの名無しさん2014/10/19(日) 16:28:23.56ID:OAm8Axmx
それぞれのOptionButton_Clickに入力処理をやらせるより
「入力」のCommandButton_Clickで一括入力した方が、絶対に良いと思うけど
それじゃダメな理由って何かあるの?

OptionButtonのイベントは何も使わず
「入力」のCommandButton_ClickでOptionButtonの状態を取得し
.UsedRange.Rows.Count + 1 の行に入力、OptionButton.Value = Falseで
選択状態のクリア、これだけでいいと思うのだが


あとは更に効率化するならショートカットキー入力って手もある
例えばテンキーで

7=独身 8       9=既婚
4=男性 5       6=女性
1=10代 2=20代 3=30代

として、10代、男性、独身なら、「1,4,7,Enter」
30代、女性、独身なら、「3,6,7,Enter」

+ - * / も使えるから、仮に年代だけで0〜9全部使っても問題ない

キー入力はUserForm_KeyPressで取得できるし
ラベルに入力内容を表示すれば、Enterでシートへの入力をする前に確認できる
テンキーではなく文字キーボードの方で、上段の1,2,3,4,5を年齢にして、あとはEnterから近いところで

@=独身 「 =既婚
:=男性  」=女性

なんて仕様にも出来る
0850デフォルトの名無しさん2014/10/19(日) 18:14:22.69ID:YnlAiiUt
Axes(xlValue, xlSecondary).MinimumScaleのところで止まってしまいます。
『'Axes'メソッドは失敗しました。'_Chart'オブジェクト』というエラーメッセージです。

For i = 1 To 20 'チャートの数だけ繰り返す
With ws_chart.ChartObjects(i).Chart
.Axes(xlValue, xlSecondary).MinimumScale = 0
.Axes(xlValue, xlSecondary).MaximumScale = 1
End With
Next i

私の予想ですが、このチャートに第二軸が設定されていないためと思います。
複数あるチャートのうち、第二軸があるチャートのみ第二軸の最小値と最大値をセットしたいのです。
チャートに第二軸があるかどうかをどのように判断したらいいのか教えてください。
0851デフォルトの名無しさん2014/10/19(日) 18:20:29.92ID:QQzlmOcf
>>850
Axes.Count
0852デフォルトの名無しさん2014/10/19(日) 18:39:34.28ID:YnlAiiUt
>>851
解決しました
素早い回答ありがとうございました
0853デフォルトの名無しさん2014/10/22(水) 15:25:06.57ID:vca6kidm
先生方お願いします win7 office2010
シートAにあるC17の内容が変更されるとシート2chの表に罫線を引いていく
という事をやりたいのですが、途中のActiveWorkbook.RefreshAllで処理が終了してしまいます。
エラー等は出ていないのですが、Worksheets("2ch").Select以下が処理されないのはなぜなのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("C17")) Is Nothing Then
Exit Sub
End If

ActiveWorkbook.RefreshAll

Worksheets("2ch").Select
Dim s As Long
For s = 4 To 200 Step 1
If Cells(s, 7) <> "" Then
Range(Cells(s, 1), Cells(s, 7)).Borders.LineStyle = True
End If
Next s

End Sub
0854デフォルトの名無しさん2014/10/22(水) 19:58:46.60ID:zmVW/SKG
>>853
>.Select以下が処理されない
そんなことはない。ちゃんと処理されている

罫線引きたいシートはどっちだ?
シートモジュールでシート省略したCellsはそのシートだぞ
つまり、そのコードでは、検査してるセルも罫線引こうとしてるセルもシートAだぞ
0855デフォルトの名無しさん2014/10/23(木) 00:15:30.96ID:muexFl6z
配列にforeachで値を格納しようと思っているのですが、うまく行きません。
例として、配列dの全ての要素に1を入れようとしています。

Sub a()
Dim d(2) As Long
For Each Key In d
Key = 1
Next
MsgBox d(0)
End Sub
これはうまく行きませんでした。

このように書くしか無いでしょうか?
Sub b()
Dim d(2) As Long
For i = 0 To UBound(d)
d(i) = 1
Next
MsgBox d(0)
End Sub

また、なぜ上では上手く動かないのでしょうか
0856デフォルトの名無しさん2014/10/23(木) 00:36:20.02ID:v83fov2u
for eachは配列要素を変数keyに代入してるだけ
配列要素へのリファレンスではない
0857デフォルトの名無しさん2014/10/23(木) 00:41:09.32ID:MyanTN6O
>>855
Keyとd(x)はあくまで別の変数で、ループのたびにd(x)からKeyに値がコピーされるから
0858デフォルトの名無しさん2014/10/23(木) 00:47:40.34ID:09ABF8gu
>>855
推奨は
For i = LBound(d) To UBound(d)
0859デフォルトの名無しさん2014/10/23(木) 00:50:01.23ID:PmBkK17w
>>855
For Each 変数 In グループ
の場合、
グループが連想配列(コレクション)なら変数は参照になるが
グループが単純な配列なら変数は複製になる

言ってしまえば引数のByValとByRefの違いのようなもの

なので
> このように書くしか無い
というか、元からそのように書くべき仕様になっているわけだ

そもそも、Long型配列の要素を取り出す変数にLong型を指定出来ず
KeyはVariant型にしなければならないということからも解る通り
For Eachは単純な配列の要素を取り出すのに適した設計になってない

つまり、単純な配列にはFor、連想配列にはFor Eachが仕様上の適材適所
0860デフォルトの名無しさん2014/10/23(木) 01:09:23.44ID:MyanTN6O
>>859
>言ってしまえば引数のByValとByRefの違いのようなもの
微妙にいいかげんな事を言ってるな
値渡し/参照渡しと値型/参照型の区別ができてない予感
ループ変数にNothingをSetしても、もとの配列変数がNothingになったりしないぞ
つまりループ変数への渡し方としては型に関係なくByValだ
0861デフォルトの名無しさん2014/10/23(木) 08:04:10.23ID:R1nuVt9+
VBAでもともと入ってる定数変数からその実際の値を知ることはサルでもできそうなほど簡単ですが
逆に実際の値から定数変数を見つけるにはどうしますか?

言ってるのは、色の定数変数でvbYellowから65535はイミディエイト窓で「? vbYellow」と打ち込めばすぐわかるけど
49407からそれに対応する色の定数変数を知りたいのです(コードの可読性を高めるためですもちろん)。

定数は色に限らず罫線で使う定数とかその他さまざまなことも含み一般的にどう見つけるか知りたいです。
0862デフォルトの名無しさん2014/10/23(木) 08:05:48.74ID:R1nuVt9+
ちなみに49407はどうやって出てきたかというと
あるセルに色をつけてその色をコードで使いたいので
その色のセルを選択(Avtivate)して「? Activecell.Interior.Color」と打ち込んだのですよ。
0863デフォルトの名無しさん2014/10/23(木) 08:23:38.90ID:ljExcPDI
>861
数値が特異的なものなら、ぐぐったら出てくるかも。
色の場合は、49407の16進数表記 &HC0FF& の方がわかりやすいかもしれない。
RGB()を使うって手もあるかな。
定義済みの定数変数が必ずあるとは限らないし。

定数変数は、意味から調べて使うものだと思う。
0864デフォルトの名無しさん2014/10/23(木) 08:24:07.61ID:RUH3XcXL
>>861
ヘルプとかMSDNにあったような。
0865デフォルトの名無しさん2014/10/23(木) 08:50:29.97ID:muexFl6z
>>856-860
なるほど、よくわかりました。ありがとうございました!
0866デフォルトの名無しさん2014/10/23(木) 10:07:31.75ID:09ABF8gu
>>861
定数の一覧はオンラインヘルプで「色の定数」で検索すると出てくるけど、
1600万以上ある色のうち定数が定義されているのはわずか8色のみ
希望の色の定数は存在しないと思って間違いない
自分がよく使う色がある場合はアドインなどを自作しておくといいかも

たいがいの定数は実際の値が何かを気にせずに使うようになっている
むしろ数字に置き換えるのは可読性や互換性の観点から推奨されない
0867デフォルトの名無しさん2014/10/23(木) 10:39:50.55ID:WaYYqABm
>>861
希望の色があるかわんらんが
Excel 2007 以上なら たぶん これが使えるとおもうよ

XlRgbColor 列挙 (Excel)
http://msdn.microsoft.com/ja-jp/library/office/ff197459(v=office.15).aspx
0868デフォルトの名無しさん2014/10/23(木) 11:25:13.87ID:09ABF8gu
>>867
なるほど、ヘルプにも同じリストが入ってたわ (2010)
http://up2.cache.kouploader.jp/koups11743.png
0869デフォルトの名無しさん2014/10/23(木) 11:44:59.46ID:R1nuVt9+
定数は色に限らず罫線で使う定数とかその他さまざまなことも含み一般的にどう見つけるか知りたいです。
~~~~~~~~~~~~~~~~~~                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0870デフォルトの名無しさん2014/10/23(木) 12:03:41.49ID:ljExcPDI
>869
ヘルプ見ましょう^^

>867-868で具体的な方法が示唆されてるのに、なんでわからないかね。

ていうか、49407で定義されてる色定数があったとしても、
それに置き換えて本当に可読性上がるかどうかは状況次第。

Private Const ma_bgcolor_warning As Long = &HC0FF&

とか定義してこれを使う方が、可読性上がって変化にも強くなる…かも。
0871デフォルトの名無しさん2014/10/23(木) 12:36:33.21ID:zTiBmqHW
どんな事があっても決して変更しないという強い意志が大切だ
0872デフォルトの名無しさん2014/10/23(木) 12:55:48.84ID:wVXZyphH
>>870
アイボリーとかターコイズ位ならまだしも、ゲーンズボロとかモカシンとか書かれても、色が想像できないし
0873デフォルトの名無しさん2014/10/24(金) 16:12:16.62ID:FHgP9zzb
お願いします

使用OS windows7
使用excel 2010



◆仕様
用意された複数のビンゴカードデータの中から、ビンゴになったカードを探し出すプログラム

◆前提
ビンゴカード;5マス×5マスのカードです。中央はゲーム開始時に穴空いてます。excelに手入力
ビンゴゲーム:抽選番号は人力のクジで抽選される 抽選されるたびにフォームに手入力する

1. カードデータはすべて事前に手入力する。(100件くらいのビンゴカードのデータを用意)
2. ビンゴカードのデータは登録順に数字を振りあてられる
3. 他ソフトでビンゴを実行する
4. ビンゴソフトで出た順に1-99までの数字をプログラムに入力していく。
5. 数字の一致しているビンゴカードナンバーを表示
6. 用意されたデータからリーチ・ビンゴになったカードのナンバーを表示する�rープ音がなるとより良い


よーするにビンゴカード100枚買ったけど一人でシコシコ穴あけていっても間に合わないし気付けないからPCにやらせたいというわけです。



http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/bingo_game.html

これを参考にしたら上手くイキそうなんですが、プログラムサッパリ分からないため、どういじっていいのかこれもサッパリなのです
0874デフォルトの名無しさん2014/10/24(金) 16:19:41.56ID:FHgP9zzb
お願いいたします

os windows7
excel 2010


用意された複数のビンゴカードデータの中から、ビンゴになったカードを探し出すプログラム

◆前提
ビンゴカード;5マス×5マスのカードです。中央はゲーム開始時に穴空いてます。データとしてexcelに手入力
ビンゴゲーム:抽選番号はクジで決められる  抽選番号は選ばれるたびにその場でexcelのフォームに手入力

1. カードデータはすべて事前に手入力する。(100件くらいのビンゴカードのデータを用意)
2. ビンゴカードのデータは登録順に数字を振りあてられる
3. クジで抽選番号がきめられる
4. ビンゴソフトで出た順に1-99までの数字をフォームに入力していく。
5. 数字の一致しているビンゴカードナンバーを表示
6. 用意されたデータからリーチ・ビンゴになったカードのナンバーを表示する�@ ビープ音が出ると尚良


よーするにビンゴカード100枚買ったけど一人でシコシコ穴あけていっても間に合わないし気付けないからPCにやらせたいというわけです。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/bingo_game.html
これを参考にしたらイケそうなんですが、いかんせんプログラムサッパリ分からないためどういじればよいのかもサッパリなのです。
0875デフォルトの名無しさん2014/10/24(金) 16:20:41.79ID:FHgP9zzb
あ、連投誤爆すいません
0876デフォルトの名無しさん2014/10/24(金) 18:29:02.57ID:3FgV77QY
>>873-875
�@プログラムサッパリ分からないなら、キッパリ諦める
�Aプログラムの勉強して、解らない部分だけを具体的に質問する
�B金を出して丸投げ依頼する

どれでも好きなものを選んで下さい

要するに、「A.要望通りのプログラムj」「B.勉強する手間」「C.金」のうち
どれか1つだけは妥協しろって話

�@を選べばAは手に出来ないが、BとCは喪失しない
�Aを選べばBは必要だが、Cを喪失せずにAを得られる
�Bを選べばCを喪失するが、Bを掛けずにAを得られる

どれを選択するのも自由だけど、さすがに一つも妥協したくないってなら「さようなら」だ
0877デフォルトの名無しさん2014/10/24(金) 22:36:47.47ID:ttks8Tdv
>>876
散れ。
0878デフォルトの名無しさん2014/10/24(金) 23:41:03.31ID:xQx5lyng
千本桜?
0879デフォルトの名無しさん2014/10/25(土) 00:01:59.68ID:A0j+Rp4K
よく判らんが、それひとりでやって楽しいのか?
ひとりで100枚穴空けてひとりでビンゴゲームしてひとりで当選したビンゴカードナンバー探し出してひとりで「リーチ!」とか「ビンゴッ!」ってやるつもり?

そもそもここまで詳しく画像付きで書かれてるサイト探し出したのに「サッパリ判らない」てのは、この先説明しようが無いと思うんだが

なんか忘年会の余興で他の連中驚かそうとか鼻高々ピノキオになりたいとか、そおゆう系譜?
それにおまえら手を貸せ? なんならおまえらが作れ?  貸すのは構わないがおまえのお里が知れるぞ? 後日
つうか、そもそも大勢でやるビンゴにこんなもんいらんわな・・ 抽選番号読んで各自で穴空けてリーチやビンゴ!が面白いんだからな・・
一人でシコシコ穴あけて・・ ってヶ所で用途や目的が大不明だわ
0880デフォルトの名無しさん2014/10/25(土) 00:26:50.15ID:mYI8hEKS
ビンゴで1位〜5位内で当たると目立つから当たってないふり
毎度してたわ。ビンゴは嫌いです
0881デフォルトの名無しさん2014/10/25(土) 01:30:30.99ID:jfttnGuy
>>876
君がこのスレに「さようなら」してくれるのなら大歓迎だよ。
自助努力をしない人を君が個人的に嫌うのは一向に構わないが、
それがこのスレの総意であるかのような物言いは避けていただきたい。

このスレにはそういうの関係なく
ただの自己満足でコードが書きたいだけの人も居るんだよ。
0882デフォルトの名無しさん2014/10/25(土) 02:05:20.24ID:Htq1vUdR
>>876,881
お前らの言う事はどっちももっともなんだが
>プログラム技術@2ch掲示板
>この板はプログラムを作る人のための板です。
だから、丸投げはさすがに違うところで依頼してくれと
08838812014/10/25(土) 03:04:18.41ID:jfttnGuy
>>882
丸投げされたって回答を強要されてるわけじゃないんだから
気に入らないならスルーしとけばいいだけだと思うんだよね。

たとえば俺なんかは職業プログラマーじゃなくて単なるアマチュアなんで
普段は自分の仕事用にちょこっとマクロを組むぐらいしかやること無いわけですよ。

だからコードを書くためのネタを提供してもらえるから丸投げ大歓迎だな。

もちろん、書きたいネタ・わかるネタだけ相手にするから
興味がないときや手に負えないときにはスルーしてるけどね。
0884デフォルトの名無しさん2014/10/25(土) 06:44:50.81ID:gTYzNJ95
おやおや、また>>1★5問題か。
今は>>2★5に書いてあるのか。
だから丸投げが嫌な奴は別スレでって話で前回落ち着いたじゃないか。
で、2種類のスレが立って結局丸投げ禁止のスレが淘汰されて今に至ってるんだから
わざわざぶり返して荒らすこともない。
ここは丸投げやコード記述が嫌な奴のオナニースレではないので、嫌なら別スレ建てろってこった。
0885デフォルトの名無しさん2014/10/25(土) 11:18:21.21ID:gLziX6No
テンプレ戻されるのを恐れて早漏スレ立てとかどんだけw

どっちがキチガイかがよく分かるな
0886デフォルトの名無しさん2014/10/25(土) 13:17:44.47ID:awQCBO24
>>885
たてようと確認しにいったお前がキチガイだろうなどう見ても
0887デフォルトの名無しさん2014/10/25(土) 13:37:15.09ID:gLziX6No
残念、立てようとして確認したのではなく
以前は>>2厳守のスレと丸投げOKスレが両方あったから
今でも両方あるのかなと思って確認したら
900さえ行ってないこのスレの次スレが立ってるのを見つけただけだが、、、

そもそも、俺は>>2崇拝者ではなく、>>2の過剰な崇拝者と
>>2の過剰なアンチを、両方とも嘲笑してるだけだし
0888デフォルトの名無しさん2014/10/25(土) 13:54:53.53ID:awQCBO24
はいはいw
0889デフォルトの名無しさん2014/10/25(土) 18:38:57.14ID:gTYzNJ95
やっぱり>>1★5厨が炙り出されてたか。
ID変わるまでは静かにしてるのかな。
0890デフォルトの名無しさん2014/10/26(日) 21:08:46.13ID:fQkp4lJ2
初歩的な質問ですみませんが シートを別名保存する場合 

Sub test()
Dim pas As Variant
Worksheets("Sheet1").Select

pas = "C:\" & Range("b3").Value & ".xls"
ThisWorkbook.SaveAs Filename:=pas

End Sub

このようにセルの数字をファイル名にしたいのですがどのように書けば良いのでしょうか?
08918902014/10/26(日) 21:09:58.28ID:fQkp4lJ2
>>890
 シートを別名保存 > ブックを別名保存   の間違いでしたすみません。。
0892デフォルトの名無しさん2014/10/26(日) 21:18:29.29ID:AOEKovwk
>>890
そのように書けばいい
0893デフォルトの名無しさん2014/10/26(日) 21:27:03.80ID:fQkp4lJ2
>>892
あれ!!謎のErrorがでまくっていて困り果てた結果の質問でしたがExcelを立ち上げ直すと動くようになりました! ありがとうございました!!
0894デフォルトの名無しさん2014/10/27(月) 08:41:33.76ID:vN2Fe9bL
>>874
そもそも、EXCELでやることじゃない。

VBでもがんばって勉強しな
0895デフォルトの名無しさん2014/10/27(月) 08:52:16.18ID:c92k51KD
Dim card(100, 5, 5) As Integer
Dim bingo(100, 12) As Byte

配列cardに全データを入れる
配列bingoの初期状態は0
穴が空いたら数字をマイナスにする
1個空けるごとに縦横斜めをチェック、リーチなら1、ビンゴなら2をbingoセットして音を出す
配列bingoにフラグをセットする時、すでに同じフラグが入っていたらスルー
0896デフォルトの名無しさん2014/10/27(月) 12:28:04.21ID:jRiSofs8
card(100, 5, 5)
bingo(100, 12)

より、ユーザー定義型使って

card(100).grid(5, 5)
card(100).bingo(12)

ってした方が良くね?
With card(100)を使えば

.grid(5, 5)
.bingo(12)

で済むわけだし


あと、ビンゴフラグは、該当するものに+1していくようにすれば
4でリーチ、5でビンゴで、1個空けるごとに縦横斜めをチェックする必要は無いのでは?

フラグのインデックスを、横軸を上から1,2,3,4,5、縦軸を左から6,7,8,9,10、
右上がり軸を11、右下がり軸を12とすると、数字が該当した(穴を空けた)位置の行と列を使い、
bingo(行)に+1、.Bingo(列+5)に+1、行=列なら.Bingo(12)に+1、行+列=6なら.Bingo(11)に+1
ってするだけで、毎回、12軸*5マス=60箇所のマイナス値チェックは不要になるし
マイナス値チェックが不要って事は、「穴が空いたら数字をマイナスにする」って処理も無くせることになる

何か間違ってるかな?
0897デフォルトの名無しさん2014/10/27(月) 13:35:04.51ID:0oi6tOMg
>>896
> 何か間違ってるかな?

よそでやれ
0898デフォルトの名無しさん2014/10/27(月) 14:52:22.59ID:C2Yey9HZ
ひょっとして、

If Not (Selection.Cells.Find("うんこ") Is Nothing) Then
Selection.Cells.Find("うんこ").Interior.Color = vbUnkoColor
End If

のようにするよりは

tmpCell = Selection.Cells.Find("うんこ")
If Not (tmpCell Is Nothing) Then
tmpCell.Interior.Color = vbUnkoColor
End If

のほうが、Findの検索を2回じゃなく1回だけしかしないので高速などの理由で好ましいですか?
0899デフォルトの名無しさん2014/10/27(月) 15:11:41.14ID:0oi6tOMg
>>898
> 好ましいですか?

はい
0900デフォルトの名無しさん2014/10/27(月) 15:57:16.12ID:C2Yey9HZ
>>899
その心は?
0901デフォルトの名無しさん2014/10/27(月) 16:01:33.34ID:C2Yey9HZ
あと会社でみんなでExcelファイルを使いまくって共同フォルダに保存してるけど
デフォルトでシート3つのままにしているやつがほとんどのため
シートが3つあった場合いちいち全部みて未使用を確認せねばならん。

なのでこんなツールつくってくれないか?
・あるフォルダ以下のすべてのExcelファイルを調べる
・未使用のシートがあればそれをシートごと削除する。
0902デフォルトの名無しさん2014/10/27(月) 16:06:49.33ID:gYcrC5UI
>>897
なんでいきなり悔しがってるの?
0903デフォルトの名無しさん2014/10/27(月) 16:07:01.55ID:0oi6tOMg
>>900
> その心は?

自分で書いてるじゃん
>>899
> Findの検索を2回じゃなく1回だけしかしないので高速などの理由
DRY

>>901
使ったシート名を変更させろよ
0904デフォルトの名無しさん2014/10/27(月) 16:07:58.29ID:0oi6tOMg
>>902
> なんでいきなり悔しがってるの?

悔しがってる?
VBAと関係ない話になってるので、よそでやれと言ったまで
0905デフォルトの名無しさん2014/10/27(月) 16:13:12.80ID:C2Yey9HZ
>>903
DRYとは?
0906デフォルトの名無しさん2014/10/27(月) 16:15:03.27ID:0oi6tOMg
>>905
Googleって知ってる?
https://www.google.co.jp/search?q=DRY&;oq=DRY&aqs=chrome..69i57j69i61j69i60.912j0j7&sourceid=chrome&es_sm=122&ie=UTF-8
0907デフォルトの名無しさん2014/10/27(月) 20:07:50.61ID:h7Lo5JhP
>>901
> シートが3つあった場合いちいち全部みて未使用を確認せねばならん。

なんでそんなことしてるんだ?
上司からの指示?
なら、マクロ探すより次の仕事探した方がいいんじゃね?
0908デフォルトの名無しさん2014/10/27(月) 20:15:33.52ID:gql5KgGq
あれをVBAと関係ない話と言うなら、DRYもVBAと関係ない(VBAに限ったものではない)話だし
DRYがプログラム全般に通ずる話だがVBAにも無関係じゃないと言うなら、件の話も然り
0909デフォルトの名無しさん2014/10/27(月) 21:26:29.93ID:KBeM+4NE
テンプレ厨が次スレもテンプレ縛り無しで先に立てられちゃったから苛立って
当たり散らしてるだけ。気にする必要ない。
0910デフォルトの名無しさん2014/10/28(火) 00:21:11.16ID:eZMhmcua
Sub test()
Dim WSH, cmd, path, output As String
Set WSH = CreateObject("WScript.Shell")
path = """C:\Program Files\7-Zip\7z.exe"""
output = """C:\Program Files\7-Zip\output.txt"""

cmd = path & " > " & output
WSH.Run "%ComSpec% /c " & cmd
End Sub

プログラムをshell.runで実行して、結果をプログラムと同じ場所にをテキスト出力したいんですが
上記のプログラムですと、テキストすら作成されずエラーも出ません。
試しにcmdの中をコマンドプロンプトで実行すると上手くテキスト出力できました。
一体何が原因でどうすれば意図通りに出力できるでしょうか?
0911デフォルトの名無しさん2014/10/28(火) 00:36:29.67ID:oItsuRwV
>>910
Runメソッドが環境変数を展開するのかとか
環境変数はちゃんとセットされてるのかとか
そもそもコマンドプロンプト経由で呼び出す必要があるのかとか
出力先にアクセス権はあるのかとか


まあ、色々あるんだが、とりあえずWSHのスレ行って聞けと
0912デフォルトの名無しさん2014/10/28(火) 10:04:31.28ID:/44LW0Xx
>>909
> テンプレ厨が次スレもテンプレ縛り無しで先に立てられちゃったから苛立って
> 当たり散らしてるだけ。気にする必要ない。

まあどっちかというと、稚拙な日本語で稚拙なロジックを自慢そうに語ってたので、いらっとしたというのが正直なところ
0913デフォルトの名無しさん2014/10/28(火) 11:55:40.06ID:9E+lxAmK
>>912
すごい僻み根性だな
自分より劣ってると感じたら生暖かく見守ってりゃ良いのに。
せめて欠点を具体的に指摘して対案を提示するぐらいのことはやらないと
ただのやっかみだと思われても致し方ない。
0914デフォルトの名無しさん2014/10/28(火) 12:15:37.35ID:EwPoWrGI
思われても仕方ないというか、それが事実だろうぜ
本人は口先では否定するだろうけどw
0915デフォルトの名無しさん2014/10/28(火) 12:57:55.14ID:/44LW0Xx
目も当てられないほどひどいものを見たくないというのは、僻みとかやっかみとか言うのか
0916デフォルトの名無しさん2014/10/28(火) 13:05:30.07ID:9E+lxAmK
>>915
同じことを何度も言わせるな
具体的に指摘できなければ他人にはお前の内心など伝わらない。

少なくとも俺には「目も当てられないほど」とか「稚拙」とかいう
その評価の根拠がわからない。

わからない以上、それまでのスレの流れも鑑みた上で
僻みとかやっかみがもとで発せられた言葉だろうと推測せざるを得ない。
0917デフォルトの名無しさん2014/10/28(火) 13:24:15.47ID:/44LW0Xx
>>916
> 少なくとも俺には「目も当てられないほど」とか「稚拙」とかいう
> その評価の根拠がわからない。

え、>>896がすばらしいと思ってるってこと?
なら、そう思ってればいいよ
0918デフォルトの名無しさん2014/10/28(火) 13:25:23.39ID:/44LW0Xx
っていうかさ、桃白白の糞コードがここに貼られてたとき、それを指摘する奴らのことも、僻みとかやっかみとか思ってたわけ?
0919デフォルトの名無しさん2014/10/28(火) 13:29:19.49ID:/44LW0Xx
出し惜しみもアレだから一つだけ言っとくかな

>>896は計算量が>>895とそれほど変わらない
計算量を劇的に減らす手段がVBA(VB)にはあるのに
0920デフォルトの名無しさん2014/10/28(火) 13:58:36.65ID:9E+lxAmK
>>917
とりあえずその発言には明らかなロジックの誤りが存在している。

「目も当てられない」や「稚拙」の否定は「素晴らしい」ではない。
"> "の否定が "<" では無いのと同様、その中間も存在している。


>>918
タオパイパイの件について、個別に把握しては居ないけれど
それが根拠や改善策を伴う具体的な指摘であれば問題は無い。
そうでなければそれが正当な批判かどうかの判断は出来ない。
そして、その件と今回の件に関連も無い。

>>919
これで3回目の繰り返しになるけれど、
何を言おうが具体的に例示出来ないなら説得力は無い。

言うだけならSTAP細胞も反重力エンジンも有るっていえる。
0921デフォルトの名無しさん2014/10/28(火) 14:26:22.57ID:nKCK5sDR
現在、必死に検索中、、、
0922デフォルトの名無しさん2014/10/28(火) 14:40:41.77ID:52F6/qy8
Workbooks.Open Range("A" &amp; g).Value &amp; ".xls"

ワークブックを開くフォルダを絶対パスで指定したいのですが
上のコードの場合どう組み込めばいいですか?
0923デフォルトの名無しさん2014/10/28(火) 15:24:41.22ID:9E+lxAmK
>>922
Range("A" & g)の内容にパスを含めるか、
あるいはOpen と Range の間に"" でパスを書く。
その場合、パスの末尾の"\"と、その後(つまり Range の前)の "&" をお忘れなく

Workbooks.Open "ここにパスを書く(最後は \)" & Range("A" & g).Value & ".xls"
0924デフォルトの名無しさん2014/10/28(火) 15:43:15.17ID:/44LW0Xx
>>920
> 何を言おうが具体的に例示出来ないなら説得力は無い。

ヒント出してあげてるのに
0925デフォルトの名無しさん2014/10/28(火) 16:02:10.40ID:52F6/qy8
>>923
助かりましたありがとう!
0926デフォルトの名無しさん2014/10/28(火) 16:12:18.82ID:9E+lxAmK
>>924
別にこちらはコードが知りたいわけではない。

批判の論拠が有るかどうかを聞いているのだって
稚拙云々という発言の妥当性を証明する必要があるのは
君のほうであってこちらは別にどうでも良い。
証明できなければ君が僻み根性の持ち主であると評価され続けるだけの話。

ヒントがどうとかほざいた所でそんなものに説得力が無いのは明らか。
0927デフォルトの名無しさん2014/10/28(火) 16:15:39.97ID:/44LW0Xx
>>926
> 稚拙云々という発言の妥当性を証明する必要があるのは

要するに、稚拙かどうかを判断する能力が君にはないわけだ
0928デフォルトの名無しさん2014/10/28(火) 16:19:05.37ID:/44LW0Xx
つか、俺としてはどういうロジックで「僻み根性」なんて言われてるのか、そっちが知りたいよ
わけわからん
0929デフォルトの名無しさん2014/10/28(火) 16:29:32.84ID:EwPoWrGI
実力もないのに、根拠無き自尊心と自己顕示欲ばかりが強いと
自分を誤魔化し、周りに印象操作するために、いろんな詭弁を並べなくちゃならなくて大変だねぇ
0930デフォルトの名無しさん2014/10/28(火) 16:31:02.52ID:9E+lxAmK
>>927
あたりまえだ。
根拠が無いものを判断することなど誰にも出来ない。
もちろん君にも出来ない。

>>928
ひとまずは>>909で良いんじゃないの?
それで苛立ってスレを楽しんでるように見える人達に噛み付いてる。
という流れ。

もちろん否定するのは自由だけれど、
コードの稚拙さを論拠にした以上はその根拠を詳らかにしなければ
それは単に否定の発言をしたというに過ぎず有効な反論とは呼べない。
0931デフォルトの名無しさん2014/10/28(火) 16:34:43.06ID:/44LW0Xx
>>930
> コードの稚拙さを論拠にした以上はその根拠を詳らかにしなければ

コードが稚拙だと言った覚えはないが
・日本語が稚拙
・VBA関係ない
とは言ったが
0932デフォルトの名無しさん2014/10/28(火) 16:45:49.93ID:nKCK5sDR
結局具体的には示せなくて、誤魔化しはじめましたとさw
0933デフォルトの名無しさん2014/10/28(火) 17:07:42.06ID:9E+lxAmK
>>931
>稚拙な日本語で稚拙なロジックを自慢そうに語ってたので、いらっとしたというのが正直なところ

「稚拙なロジックを」というのはコードのことではないのか?
「稚拙な日本語」と対になっている以上、コードの事を指していると判断するのが
「稚拙ではない日本語のロジック」なのだが。
0934デフォルトの名無しさん2014/10/28(火) 17:17:01.42ID:/44LW0Xx
>>933

うーん、プログラマじゃない人と話してる気がする

> >>931
> 「稚拙なロジックを」というのはコードのことではないのか?

>>896には多少のコード(前半)が書かれてるが、俺が稚拙なロジックと言ったのはそこじゃないよ
ここ
> あと、ビンゴフラグは、該当するものに+1していくようにすれば
> 4でリーチ、5でビンゴで、1個空けるごとに縦横斜めをチェックする必要は無いのでは?
0935デフォルトの名無しさん2014/10/28(火) 17:47:02.97ID:oItsuRwV
>>934
お前らの下らん言い争いはどうでもいいが
> あと、ビンゴフラグは、該当するものに+1していくようにすれば
> 4でリーチ、5でビンゴで、1個空けるごとに縦横斜めをチェックする必要は無いのでは?
これを稚拙という、VBAにそなえられている「計算量を劇的に減らす」手段ってのには興味がある
0936デフォルトの名無しさん2014/10/28(火) 17:52:24.93ID:9E+lxAmK
>>934
改めて>>896を読んだのだが
たしかにコードそのものではなくアルゴリズムが書いてあった。
その点はきちんと確認しなかったこちらの誤りだったと認めよう。

ただし、そうであっても
根拠無き批判は批判とは呼べないという結論は変わらない。

プログラマ云々はこれまた印象操作というか、
問題の本質とは関係ない話だと思うのだが、
それと結論とになにか関連は有るのか?

もし仮にプログラマであれば自分に同意するはずだという意味なら
それはやはり間違っていると言わざるを得ないが
どっち道間違ってるのは確定事項なのわけで
正直これ以上論ずる意味を感じない。
0937デフォルトの名無しさん2014/10/28(火) 18:03:10.53ID:/44LW0Xx
>>936
> プログラマ云々はこれまた印象操作というか、
> 問題の本質とは関係ない話だと思うのだが、
> それと結論とになにか関連は有るのか?

コードに対する批判とロジックに対する評価は全く別物。それを混同していると見えたので、プログラマじゃないのかと

> 正直これ以上論ずる意味を感じない。

俺も賛成

>>835
> VBAにそなえられている「計算量を劇的に減らす」手段ってのには興味がある

00〜99の数字からカードNo・カード上の位置への逆インデックスをDictionaryを使って構築すれば、数字探索O(N)からO(1)に減らせる
ただし、bingoフラグをも使わないベタ実装でも、一瞬で処理が終わると思われるので、計算量の削減に実利があるとは思えない

あるいは、メモリ上のデータ構造を使わずに、シート上にビンゴカードを展開して、range.findを使うとかね。Excelらしいし
0938デフォルトの名無しさん2014/10/28(火) 18:11:38.36ID:MxSJLzYv
俺ならフラグは1ビット、1列に1バイトを割り当ててたな
下5ビットが全部1、つまり16進で&h1Fになったらビンゴ
まあ+1してって4でリーチ、5でビンゴにした方が計算量は少ないよな
ビット単位だとリーチの判定が面倒だし

別の案として、カードデータをワークシートに全部並べる
ガラポンを1個引くごとに該当の数字を0に一括置換
作業列にSUM関数やIF関数を置いて、ビンゴもリーチもFINDで一発
0939デフォルトの名無しさん2014/10/28(火) 18:13:36.82ID:MxSJLzYv
推敲してる間に先を越された ・・・ orz
0940デフォルトの名無しさん2014/10/28(火) 18:28:55.86ID:/44LW0Xx
>>937
> 00〜99の数字からカードNo・カード上の位置への逆インデックスをDictionaryを使って構築すれば、数字探索O(N)からO(1)に減らせる
> ただし、bingoフラグをも使わないベタ実装でも、一瞬で処理が終わると思われるので、計算量の削減に実利があるとは思えない

あ、ごめん、Dictionaryなんか使う必要全然なかったわ
文字列の配列でOKだね

テへ
0941デフォルトの名無しさん2014/10/28(火) 18:30:45.57ID:oItsuRwV
>>937
DictionaryはWSHの機能で、VBの機能でもVBAの機能でもないってのはまあおいといて
>>896は数字探索のコストについては言及していない
数字探索の回数がさがると言う>>896の意見は間違ってない
数字探索のコストまで意識が及ばないのを稚拙というなら、そこをちゃんと指摘してから言えよと
ただ、別のアルゴリズムでの処理オーダーがO(n)とO(1)だったとしても、どっちが早いかなんて比較できんぞ
あくまで件数に対する処理時間の割合なんだから。順次検索2.5回がハッシュ値計算より遅いとは言い切れん

あとWSHのDictionaryだけど、これほんとに(ほぼ)O(1)で探索するか?
まえに見たどっかのテストだとそうなってなかったぞ
Dictionaryはハッシュテーブルで実装されてると言うお前の思い込みじゃないのか

>ベタ実装でも、一瞬で処理が終わると思われるので、計算量の削減に実利があるとは思えない
実利のないことをつついて稚拙とか言ってたのか
僻みといは言わんが、良い性格だとは思われんわな、そりゃ
0942デフォルトの名無しさん2014/10/28(火) 19:58:32.75ID:xSrXocoZ
>>896は最適化というより、>>895のやり方を崩さない範囲での改善例を挙げただけでしょ?
そういう方向では十分に意味があり有意義な意見だと思う
少なくとも、具体的な指摘も出来ずに否定してる奴の方が稚拙であることは間違いない
0943デフォルトの名無しさん2014/10/28(火) 20:25:16.29ID:FB7I10mJ
>>939
だいじょうぶ おれは見てる だいじょうぶ、がんがれ だいじょうぶ 推敲してから書き込んだだけおまえのがエラい  ・・・たぶん
0944デフォルトの名無しさん2014/10/28(火) 21:53:38.37ID:s98vcxYO
>>937
さんざん出し惜しみした計算量を劇的に減らす手法...
よく恥ずかしげもなく出したな w
0945デフォルトの名無しさん2014/10/28(火) 22:19:56.41ID:xhc5AVYv
残り少なくなってるからクソどうでも良い言い争いはこのスレだけで終わらせてくれ
0946デフォルトの名無しさん2014/10/28(火) 22:53:10.27ID:8+H+l7VA
スレ延びてるから何かと思えば果てしなく下らない内容だった
0947デフォルトの名無しさん2014/10/28(火) 23:58:38.82ID:X1q00OrQ
スレ伸び過ぎている時点で開く前からこんな事だろうとは思っていた
0948デフォルトの名無しさん2014/10/29(水) 00:06:29.70ID:gNEeZJqJ
おまいらビンゴなんかでそんなに悩まないでくれよ。




今度ぷよぷよの作り方丸投げしようと思ってるんだからさ。
0949デフォルトの名無しさん2014/10/29(水) 04:47:20.07ID:L5pJvKJr
【Excelでぷよぷよを作ろう】
http://1st.geocities.jp/mattulwan1/puyo/
0950デフォルトの名無しさん2014/10/29(水) 10:14:19.12ID:MH1nCRLQ
おいおい、まじで>>896の駄目さ加減がわかる奴はいないのか?
しょうがないから説明するよ
まず、毎回穴の数をカウントし直すベタ実装は以下

'配列は1 originで使う
dim hole(5, 5) as integer

digitFound = False
for i = 1 to 5
 for j = 1 to 5
  if digit(i, j) = targetDigit then
   goTo exit_loop
  end if
 next
next
exit_loop:

if digitFound then
 hole(i, j) = 1
 tatecount = hole(i, 1) + hole(i, 2) + hole(i, 3) + hole(i, 4) + hole(i, 5)
 yokocount = hole(1, j) + hole(2, j) + hole(3, j) + hole(4, j) + hole(5, j)
 naname1count = hole(1, 1) + hole(2, 2) + hole(3, 3) + hole(4, 4) + hole(5, 5)
 naname2count = hole(1, 5) + hole(2, 4) + hole(3, 3) + hole(4, 2) + hole(5, 1)
end sub

if tatecount = 4 or yokocount = 4 or naname1count = 4 or naname2count = 4 then
 'リーチ
elseif tatecount = 4 or yokocount = 5 or naname1count = 5 or naname2count = 5 then
 'bingo
end if
(続く)
0951デフォルトの名無しさん2014/10/29(水) 10:21:31.08ID:MH1nCRLQ
まあ>>942の意見には同意するが、VBAと関係ない話だしよそでやってよって感じで

さて、このベタ実装に複雑さを持ち込むにはなんらかの理由が必要
・複雑さと引き替えに速度を得る(処理時間がボトルネックになる場合。qsortとかキャッシュとか)
・評価を遅延させるコードを追加することによって、全体の処理量を減らす
・コードは長くなるが、それは複雑な問題を簡単に分割した結果で、全体としてのシンプルさが上がる
・複雑さと引き替えにメンテナンス性をあげることができる(Strategyパターンを用いてOCP原則を担保する)
・複雑さと引き替えにテスト容易性をあげることができる(DIパターンとか)

>>962のロジックにはなにかメリットがあるか?
とくに何のメリットもないし、逆にベタ実装よりわかりづらくなってる
しかも、穴あき状態を保存してくていいという主張なんだが、まあ普通のプログラマなら穴あき状態くらいは保存しとくもんだろう

という理由で「稚拙なロジック」と評価した

俺からは以上です
0952デフォルトの名無しさん2014/10/29(水) 10:22:12.34ID:MH1nCRLQ
あ、言い忘れてた

ようするに、KISSの原則ってことね
0953デフォルトの名無しさん2014/10/29(水) 10:24:08.85ID:MH1nCRLQ
悪い、もひとつ追加。

>>950のコードでgoto使うなとかcount合計のとこループしろとかあるかもしれないけど、それは本質的な問題じゃないからいいよねってことで
0954デフォルトの名無しさん2014/10/29(水) 10:33:45.57ID:MH1nCRLQ
>>950のコード見直してたら間違いに気づいたけど訂正はしない

>>941
> 数字探索の回数がさがると言う>>896の意見は間違ってない
> 数字探索のコストまで意識が及ばないのを稚拙というなら、そこをちゃんと指摘してから言えよと
> ただ、別のアルゴリズムでの処理オーダーがO(n)とO(1)だったとしても、どっちが早いかなんて比較できんぞ
> あくまで件数に対する処理時間の割合なんだから。順次検索2.5回がハッシュ値計算より遅いとは言い切れん

これにだけコメントしておく
「数字探索」というのは、ビンゴマシンがはき出した数字が各カード上に存在するかを調べること
最悪2500回の比較が必要。つまりO(N)
これを(dictionary関係なく)インデックスを作っておけば、数字探索はO(1)になるという意味

まあ毎回最悪2500回かかっても処理量的にはたいしたことないので、インデックスなんか作る必要ないんだが
0955デフォルトの名無しさん2014/10/29(水) 10:48:44.56ID:TQjXHOq7
配列のつかいこなしかたがよくわからないんですが、簡潔かつ詳しく解説したサイトないですか?

・どういうときにVariantが便利なの?
・Split関数とかArray関数とどのように関連があるの?
・動的配列は最初に要素数を書かないけど、使うときは結局はReDimで指定しないといけないのは、結局自由には使えないってこと?
・配列全体をあらわすときとか、()を使わない使用方法もあるけど、それはどんなときに使うの?

などのような高度な使い方はさっぱりわからない。
0956デフォルトの名無しさん2014/10/29(水) 11:14:52.43ID:czOj3axe
論破された悔しさから必死に検索してもこの程度かよw

負け犬の遠吠えどころか、負け犬の小便程度だな
0957デフォルトの名無しさん2014/10/29(水) 11:42:51.96ID:TQjXHOq7
配列の使い方を教えていただけないでしょうか?
0958デフォルトの名無しさん2014/10/29(水) 11:47:48.79ID:MH1nCRLQ
>>956
つまり、その程度のこともわからず、根拠根拠しかいえない奴ばっかだったってことですよ
0959デフォルトの名無しさん2014/10/29(水) 11:49:53.60ID:TQjXHOq7
なぜこれらができない?


Sub Test1()
Dim a() As String
a() = Array("A", "B", "C", "D", "E")
End Sub

Sub Test2()
Dim a(5) As String
a() = Array("A", "B", "C", "D", "E")
End Sub


Sub Test3()
Dim a(5) As String
a = Array("A", "B", "C", "D", "E")
End Sub
0960デフォルトの名無しさん2014/10/29(水) 11:52:11.19ID:TQjXHOq7
しかし、このうち1つだけが当たり。

Sub Test4()
Dim a As Variant
a() = Array("A", "B", "C", "D", "E")
End Sub

Sub Test5()
Dim a As String
a = Array("A", "B", "C", "D", "E")
End Sub

Sub Test6()
Dim a As Variant
a = Array("A", "B", "C", "D", "E")
End Sub

みんな使い方はどうやって覚えてる?
0961デフォルトの名無しさん2014/10/29(水) 11:53:46.60ID:MH1nCRLQ
>>956
そういう言語仕様だから、言語ごとに使える方法を覚えるしかないよ
0962デフォルトの名無しさん2014/10/29(水) 11:56:22.95ID:TQjXHOq7
これセルを複数選択したときに配列になるパターンだけど、はなぜ2つとも同じ動作で正常なのですか?

Sub Test7()
Dim a As Variant
a = Selection
Debug.Print a(2, 2)
End Sub

Sub Test8()
Dim a As Variant
Set a = Selection
Debug.Print a(2, 2)
End Sub
0963デフォルトの名無しさん2014/10/29(水) 12:01:08.23ID:TQjXHOq7
Variant型が配列を自由にできそうだから
「配列はすべてVariantしか使わない」ことにしたらすべて解決?
0964デフォルトの名無しさん2014/10/29(水) 12:35:57.11ID:sGjc0oQu
>>950
> '配列は1 originで使う

だせーコメント、下限の指定のやり方も知らんのかよ w
0965デフォルトの名無しさん2014/10/29(水) 12:49:22.07ID:sGjc0oQu
>>962
たまたま結果が同じになってるだけ
Test7 の方は選択されてる領域の値が配列としてコピーされる
Test8 の方は Range オブジェクトが入る
なので、Test8 の方なら、セルの値を変更したりもできる
その代わり遅いけど
とりあえず Debug.Print TypeName(a) ってやってみれ
0966デフォルトの名無しさん2014/10/29(水) 19:37:23.42ID:WgixnIhX
あれだけ大見得切ってこの程度だったのは…
0967デフォルトの名無しさん2014/10/30(木) 00:13:59.87ID:QKQcea/5
ExcelVBAからIME2010の単語登録をしたい
Os Win7 32bit Excel2013

Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
Declare Function ImmRegisterWord Lib "imm32.dll" Alias "ImmRegisterWordA" (ByVal hKL As Long, ByVal lpszReading As String, ByVal dwStyle As Long, ByVal lpszRegister As String) As Long
Dim hKL As Long
Dim rc As Long
hKL = GetKeyboardLayout(0)
rc = ImmRegisterWord(hKL, "ぱ", 1, "ぱぱぱ")
とやっても必ず0が帰ってくる
dwStyleが1なのがまずいかと思ってループで0〜10万まで突っ込んでみても成功できなかった
IME2010でもimm32.dllで単語登録は可能?
2003以降ImmGetRegisterWordStyleが使用できなくなってうんたら以外の情報が見つからなかったのでわかる人教えてほしい
0968デフォルトの名無しさん2014/10/30(木) 00:23:04.46ID:kPIxDZa1
最新のPCの人が
Workbooks.Saveasの保存のコードのところでエラーが出るんだけど
これはどう回避したらいいですか?
0969デフォルトの名無しさん2014/10/30(木) 06:11:12.95ID:MaVmo7Mi
保存機能をなくす
0970デフォルトの名無しさん2014/10/30(木) 08:03:42.49ID:kPIxDZa1
>>969
あほ
0971デフォルトの名無しさん2014/10/30(木) 08:04:45.59ID:kPIxDZa1
どなたか?
0972デフォルトの名無しさん2014/10/30(木) 08:35:22.52ID:MQMCTKm/
>>967
「APIを使ってのIMEへの単語登録」は、ExcelにもVBAにも関係ないので
君がそれを実現するための言語としてVBAを選択したところで、ここではスレ違いです


>>968
SaveAsには複数の引数(オプション設定)があるので
具体的にどういうコードを書いて、何というエラーが出てるか書かなかったら
>>969のように小馬鹿にされても自業自得だ

初心者はエラー文見ても意味不明かもだけど、エラー文にも原因や回避策を探るヒントが
含まれていることが多いし、Ctrl+Cでエラー文のコピーも出来るから、コードと併せて
エラー本文はそのまま貼ろう
0973デフォルトの名無しさん2014/10/30(木) 10:34:53.35ID:XcOLvYSq
>>972
> 「APIを使ってのIMEへの単語登録」は、ExcelにもVBAにも関係ないので
> 君がそれを実現するための言語としてVBAを選択したところで、ここではスレ違いです
VB6も死滅したし、これくらい許容しては?
0974デフォルトの名無しさん2014/10/30(木) 11:46:12.33ID:7fc6WtHX
>>967
原因はわからないけど GetKeyboardLayout(0) の戻り値がおかしくなっているみたい。
C++ で同じようにすると、ImmRegisterWord( ) から 1 が返ってきて、正しく登録できる。
で、hKL の値を見てみると、VBA は &h04110444 で C++ は 0xe0200411 になってる。
ものは試しで、直接
rc = ImmRegisterWord(&he0200411, "ぱ", 1, "ぱぱぱ")
ってやると、ちゃんと登録できる。
とりあえず、今わかったのはここまで。
0975デフォルトの名無しさん2014/10/30(木) 11:56:05.99ID:ZYKcu7qA
>>973

俺もスレ違い云々を厳格に適用するのは反対なんだけど、
ここよりも適切なスレがあるから>>967には
そちらに移動してもらったほうが良いんじゃないかとも思う。

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/l50

回答するには「答える能力」と「答える意欲」の両方が必要なわけで
答える能力があってもスレ違いを理由に答える意欲が無い人は
ここで何時まで待っていたって答えてくれない。

もしも>>972がここで答える気が無くても答える能力のある人なら
あっちでなら答えてくれると思うよ。
答える能力も意欲も無い人かもしれないけど。

ちなみに俺には答える能力のほうが無い人です。
0976デフォルトの名無しさん2014/10/30(木) 18:06:11.41ID:XcOLvYSq
>>975
> もしも>>972がここで答える気が無くても答える能力のある人なら
> あっちでなら答えてくれると思うよ。
ないな。
0977デフォルトの名無しさん2014/10/31(金) 00:07:20.42ID:rh+3Znhq
関数で、
引数が配列変数、返り値も配列変数、ってできますか?
0978デフォルトの名無しさん2014/10/31(金) 00:24:43.50ID:IA3p3mfx
>>977
配列変数って、配列を受け渡ししたいってこと?
できるけど、Variantでやった方が楽じゃないかな
0979デフォルトの名無しさん2014/10/31(金) 00:38:34.53ID:rh+3Znhq
>>978
そのとおり。
例えば文字列配列を渡して、もし重複したダブリあればそれを削除して
要素数がそれだけ少なくなった配列をまた1から順番に詰めて返り値にする関数です。

そしよければそんな関数を作ってコードを教えていただけませんか?
0980デフォルトの名無しさん2014/10/31(金) 01:58:28.21ID:IA3p3mfx
>>979
自分で作れ
0981デフォルトの名無しさん2014/10/31(金) 03:43:27.37ID:pcLUUbEh
>>979
面倒だからコードも書かないし雑にぱっと考えついた方法だけ書くと
配列から順番に値を取得してディクショナリのキーに設定。ディクショナリに同じキーが有った場合は設定しないで
配列の最後まで繰り返す。
ディクショナリのキーを配列に設定して、余った分の要素は削るか初期値を設定しておしまい。
って言うか配列じゃなければダメなの?最初からディクショナリなら
わざわざ配列から値を取得したり詰め替えたりする必要ないんだけど。
0982デフォルトの名無しさん2014/10/31(金) 05:20:59.43ID:mpqowuw2
あ
0983デフォルトの名無しさん2014/10/31(金) 06:38:00.74ID:wcUdaFCA
>>981

このネタ(配列中の重複削除)少なくとも3回目
前回も前々回もディクショナリーとかコレクションとかを使えとアドバイスされたのに
その後音沙汰なし
0984デフォルトの名無しさん2014/10/31(金) 09:04:30.71ID:rh+3Znhq
>>981
どうもですぅ。やってみますぅ。

>>983
このネタというふうにあなたはおっしゃったけれども、私は自分でオリジナルの質問をすることが出来るんです。
その人とは違うんです。
0985デフォルトの名無しさん2014/10/31(金) 09:05:14.54ID:rh+3Znhq
で、コードはどうなるの?
ディクショナリーとか使い方がさっぱりわからん。
0986デフォルトの名無しさん2014/10/31(金) 09:19:19.57ID:wcUdaFCA
>>985
>>237-257
この辺読め、これがたぶん二回目のやつ(コレクション使うパターン)だ
一回目は前スレかそれ以前だが探すのが面倒なので自力でぐぐってくれ
たしかディレクトリーつかう解決法だったはずだ
09879862014/10/31(金) 09:21:09.09ID:wcUdaFCA
ディレクトリーってなんだよ…orz
ディクショナリーの間違いだ。
0988デフォルトの名無しさん2014/10/31(金) 09:23:56.82ID:rh+3Znhq
なんかかなり複雑そうだな。
あと先人のソートもできるならやってから配列に入れたいな。
どうすればいいんだろう?
0989デフォルトの名無しさん2014/10/31(金) 10:33:35.56ID:rh+3Znhq
邪道だと思いませんか?
重複を避けるために
Collectionの引数Keyを用いてそこでエラーなら重複とみなし処理をしないなんで。
ON ERROR使わないといけないじゃん。
こんなんオレのプログラミング哲学が許さない。
0990デフォルトの名無しさん2014/10/31(金) 10:50:24.00ID:rh+3Znhq
ソートをするのに
Excel本体のソート機能を呼び出すことはできないのですか?

無理やりコードで作業シートをつくりそこにデータを入力してSortメソッドを使うダサイ方法じゃなく。
0991デフォルトの名無しさん2014/10/31(金) 11:02:24.57ID:Ff8njc41
SortedListでも使ったら?

Collectionはエラーが出るか否かでしか重複を検知できないが
DictionaryならExistsでキーが既に存在するかを確認できる
そしてSortedListなら、Containsでキーが既に存在するかを確認できる上に
自動的にソートもされる
0992デフォルトの名無しさん2014/10/31(金) 11:11:16.29ID:ZzQYNmVs
>オレのプログラミング哲学


ゲラゲラゲラ
0993デフォルトの名無しさん2014/10/31(金) 11:15:34.57ID:rh+3Znhq
>>991
なるほどありがとうございます。

ここを見ただけですが、かなり便利で使えそうな気がします。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_sortedlist.html

ところでそんな貴重な情報、どこで仕入れてきているのでしょうか?
SortedListとかCollectionとか町の本屋のパソコンコーナーにあるVBA本には絶対に載ってないですし(まあほとんど入門書ですが)。
0994デフォルトの名無しさん2014/10/31(金) 11:36:17.53ID:6O2gHEcS
>>994
VBAで.NETのクラスを使えることを書いてる書籍が皆無だとは思わんが・・・
ともあれ、.NETのクラスを使えることがわかったんだから、次は.NETのクラスを勉強すればいいね。
0995デフォルトの名無しさん2014/10/31(金) 11:54:29.74ID:rh+3Znhq
>>994
そうだったのですか
勉強してみます

スレも最後だから白状しよう。
オレは237です(爆)
0996デフォルトの名無しさん2014/10/31(金) 12:15:53.17ID:Ff8njc41
>>993
「VBA ソート 重複」で検索して、2件目がそのサイトなんだが・・・

>>995
=237なのは解ってたから、既出で237が不満そうな方法ではなく
今までに出てない方法を紹介したわけだが・・・
0997デフォルトの名無しさん2014/10/31(金) 13:50:41.56ID:EwB3SceG
偶然だな
実は俺も237なんだ
0998デフォルトの名無しさん2014/10/31(金) 15:29:57.55ID:IA3p3mfx
Excel VBA なんだから、Excelにある機能はそっち使えばいいと思うんだが
0999デフォルトの名無しさん2014/10/31(金) 15:35:33.54ID:6O2gHEcS
>>998
Excel VBAから簡単に使えて、しかも余分なコードなしに目的が達成できるものがあるなら、
そっち使えばいいと俺は思うよ。
Dictionaryもそうだし、FileSystemObjectやRegExpもそう。
1000デフォルトの名無しさん2014/10/31(金) 15:49:28.23ID:Ff8njc41
>>998
弊害がなければ、ね
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。