●EXCEL・VBA質問スレ Part2●

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
・まじめにExcelの機能を追及してみようと思う奇特なひと
・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと
・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと
・とにかく漏れにこんな仕事まわすなと怒っているひと
そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです

前スレ
http://pc11.2ch.net/test/read.cgi/tech/1168308855/
2デフォルトの名無しさん:2007/05/27(日) 00:07:52
      ,..,,_             ハ
     ,r'   `l         ,.-‐' `、
  _ ○ _,. -‐丶‐ 、       )    ゝ
   / |/       ~\       ̄ヽ_/
   ノ /l  /l      トー-、_
   `l`'イ__/ |       \    ̄`ー―--、_  
    ト、_   `ヽ,   |  l           `Y" ヽ
    〈   `ー、 |  i  ;'           人_,..ノ
    ヽっ_ /  丿 r'`ー、        _ノ
       ( └l-'  ̄|   ト---─‐'" ̄
        `ー ’   `、_,/
3デフォルトの名無しさん:2007/05/27(日) 00:35:10
>>1
乙。

エクセル2007になって拡張子が変わった。変なことしてくれるよな。
そのブックを他のブックからVBAで参照してるとも知らずに拡張子を変えて
くれたために、動かなくなった。
4デフォルトの名無しさん:2007/05/27(日) 00:38:34
.NETに移行していってる中でいつまでも続くVB6ベースのVBA。
変数宣言と同時に初期化してしまったりする。
いつまでVB6ベースなんだろ。
5デフォルトの名無しさん:2007/05/27(日) 07:15:06
>>1
Part3の間違い。次スレはPart4ね
6デフォルトの名無しさん:2007/05/27(日) 18:21:25
7デフォルトの名無しさん:2007/05/27(日) 20:17:43
次スレはモーグに立ててね
8デフォルトの名無しさん:2007/05/27(日) 23:31:11
>>4
VB6はVista環境でもOKだからな、終わりなのは.NET1.1なんだよな
9デフォルトの名無しさん:2007/05/28(月) 01:27:22
▼━過去スレを見たい人━━━━━━━━━━━━━━━━
o2onで気長にまってたら落ちてくるかも。

o2on・・・2chのdatファイルを共有するP2Pソフトです。
現段階ではまだαバージョンですので、マターリいきましょう。

公式サイト
ttp://o2on.net/wiki/
10デフォルトの名無しさん:2007/05/28(月) 02:09:10
複数の文字列変数tmp(g))がcells(l,4)に存在するか調べています。
out(syutu)が複数個あるにもかかわらずAでは1つしかみつかりません。
Aのやり方で動作させたいのですがうまく動作しないので
@でがまんしています。Aのなにがいけないでしょうか。。。

@
Do Until tmp(g) = ""
For l = 1 To 2000
If tmp(g) = Cells(l, 4) Then
out(syutu) = Cells(l, 1) & "," & Cells(l, 2) & "," & Cells(l, 3) & "," & Cells(l, 4)
syutu = syutu + 1
End If
Next l
g = g + 1
Loop

A
Do Until tmp(g) = ""
l = 1
Do Until Cells(l, 4) = ""
If tmp(g) = Cells(l, 4) Then
out(syutu) = Cells(l, 1) & "," & Cells(l, 2) & "," & Cells(l, 3) & "," & Cells(l, 4)
  syutu = syutu + 1
End If
l = l + 1
Loop
g = g + 1
Loop
1110:2007/05/28(月) 02:26:56
すんません
原因わかりました
途中でNULLのセルがありました。
しつれいしました。
12デフォルトの名無しさん:2007/05/28(月) 02:40:55
セルにURLが書かれていて、HTMLの<title>から</title>までの間の文字列を取得して、
そのURLの1つ横のセルに入力するマクロを教えてください。
13デフォルトの名無しさん:2007/05/28(月) 02:54:30
>>12
マルチウザイ
14デフォルトの名無しさん:2007/05/28(月) 02:56:18
マルチじゃありませんよ。あれだけ探したのに
15デフォルトの名無しさん:2007/05/28(月) 03:08:00
全く同じ質問を別のスレでもしてる>14
16デフォルトの名無しさん:2007/05/28(月) 04:20:53



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


17デフォルトの名無しさん:2007/05/28(月) 09:19:17
質問です。ユーザーフォームのテキストボックスに
整数のみ(小数点も除く)入力させる制限方法って
何かいい方法ありますかねぇ?
IMEDisableだと英語も入力できてしまうし・・・
鬱になりそう・・・
18デフォルトの名無しさん:2007/05/28(月) 09:32:35
入力制限なんていくらでもアルゴリズム解説やサンプルソースが転がってるだろ
19デフォルトの名無しさん:2007/05/28(月) 10:04:35
>>18
(´・ω・`)ググってサンプルソースとかないからココに来たのに・・・
20デフォルトの名無しさん:2007/05/28(月) 10:26:15
excelで、
500件以上のデータの中から同じ文字列のやつを探し出して、
抽出ではなく、1つを残して他は行ごと消去する。
というのはできますでしょうか?

説明わかりにくいので一応簡単な例も…
A  B   C   D
1 お肉  10k 1000円
2 野菜  10k 500円
3 菓子   5k  680円
4 お肉  7k  700円
5 お肉  3k  300円
6 菓子  4k  450円
7 アイス   1ケース  800円

の結果が
A  B   C   D
1 お肉  10k 1000円
2 野菜  10k 500円
3 菓子   5k  680円
4 アイス   1ケース  800円

というようになる感じです。
B列の文字から判断して値段、数量は関係なしで大丈夫です。

だれか、ご教授お願いします。
そんな僕は経理担当者。。。
21デフォルトの名無しさん:2007/05/28(月) 11:32:43
B列をUniqで抽出してその行を選択、どっかに避難してから残りを削除ってところかな。
22デフォルトの名無しさん:2007/05/28(月) 11:45:01
>>21
ありがとうございます。
さっそくやってみます。
23デフォルトの名無しさん:2007/05/28(月) 11:59:15
>>19
言葉は正しく使おうね

× 無い
○ 検索仕方が悪いから見つけられてない
24デフォルトの名無しさん:2007/05/28(月) 12:23:50
>>17
VBAは初心者? ググればすぐに見つかりますよ?
一応書いとくけど。
TextBoxのKeyPressイベントに次のコードを書けばOK。

If KeyAscii>=Asc("0") And KeyAscii<=Asc("9") Or KeyAscii=ASC(".") Then
  Exit Sub
 else
  KeyAscii=0
 End If
25デフォルトの名無しさん:2007/05/28(月) 17:39:21
Printers コレクションとPrinter オブジェクトを使って
用紙名から用紙IDを導くことは可能でしょうか?

サンプル等があれば宜しくお願いします。
26デフォルトの名無しさん:2007/05/28(月) 21:01:15
最近は質問だけして去っていくのが多いな〜。
ググる手間が省けてるんだから、解決したら解決したことぐらい報告しろよな〜。

>>25
用紙IDって?
27デフォルトの名無しさん:2007/05/28(月) 21:12:48
自分用語かな?
〜がしたいから、〜が知りたいと書けばヒントになるんだがな。
28デフォルトの名無しさん:2007/05/28(月) 21:18:00
>>17
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
KeyAscii = 0
End If
End Sub
29デフォルトの名無しさん:2007/05/28(月) 21:44:56
>>28
をいをいw
30デフォルトの名無しさん:2007/05/28(月) 21:45:49
>>28
>>24が答え言ってるし、小数点も入力させるって言ってるし。
31デフォルトの名無しさん:2007/05/29(火) 07:47:15
Set addshape = ActiveSheet.Shapes.AddLine(10, 10, 20, 20)
と描いたばかりの、オートシェイプがShapesコレクションの何番目か(index)や、

オートシェイプやコントロールの名前が分かっている時に、
それがそれぞれのコレクションの何番目か(index)を知るにはどうしたら良いのでしょうか?

よろしくお願いします。
3225:2007/05/29(火) 10:03:33
>>26
「用紙ID」は判り辛かったですか。すいませんです。
つまり、A4=9 A3=8 という内部の番号です。

これをPrinterオブジェクトで指定して、
出力毎に用紙サイズを選択してレポート出力をしたいのですが、
既定(B5,A4,A3等)の用紙の番号はHELP等で明記されているので可能なのですが、
サーバプロパティで作成したユーザ定義の用紙サイズ番号が設定したPC毎に違うので、
指定ができないのです。

ですからユーザ定義の「サイズ名」を各PC同じにする事によって、
「サイズ名」から内部の番号を割り出して一覧化して
初期処理として用紙選択の一覧に加えるロジックを形成したい考えております。

検索しましたが、同じ考えを抱えている人は多いみたいですが、
約1名を除いて挫折してるみたいです。
その一名のサンプルデータは消滅していました。

http://www.accessclub.jp/bbs5/0020/vba5978.html
内のhttp://www.accessclub.jp/fileup/ss1_board/300_1.lzh

どうぞ宜しくです。
33デフォルトの名無しさん:2007/05/29(火) 14:06:50
EXCELのVBAをつかって一つのグラフエリアに2つのグラフを描きたいのですが教えてください。
34デフォルトの名無しさん:2007/05/29(火) 15:33:59
>>33
系列1と系列2を書きたいということ?
35デフォルトの名無しさん:2007/05/29(火) 15:43:41
>>31
配列のindexとは意味合いが違うが仕様に気をつければzorderposisionが使える
36デフォルトの名無しさん:2007/05/29(火) 17:08:30
>>32
↓これを同期させればどう
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Forms
それかWidthとHeightをVB側で指定してPagerSize=256でできないか
37デフォルトの名無しさん:2007/05/29(火) 22:28:42
>>32
サーバプロパティとか相変わらず俺様用語だし、
そもそもPrintersコレクションって…

根 本 的 に ス レ 違 い
38デフォルトの名無しさん:2007/05/29(火) 22:39:34
cells(1,1)=あいうえお
cells(2,1)=かきくけこ
cells(3,1)=さしすせそ
とあるとき
文字列"きく"とか"すせそ"など上の3つのセルに含まれるかを
簡単に調べる方法、関数ってありますか?

考えたのは"きく"の場合
cells(1,1)ではまず"きく"は2文字なのであい、いう、うえ・・・と順に調べていく
とゆう方法。不細工すぎて泣きそうなのでいい方法をお聞きしたく。

39デフォルトの名無しさん:2007/05/29(火) 22:57:21
前スレでやったばっかりだけど、InStrじゃダメ?

InStr(cells(1,1),"きく") > 0
40デフォルトの名無しさん:2007/05/29(火) 23:01:57
>>38
前スレでさんざん出てきた話だぞ?
具体的にどんな風か教えて。調べてどうしたいとか。
エクセル関数ならFIND、VBAならInstr。
>cells(1,1)ではまず"きく"は2文字なのであい、いう、うえ・・・と順に調べていく
検索対象行が10000行あったらどんだけ時間がかかると思ってるんだ…
41デフォルトの名無しさん:2007/05/29(火) 23:16:01
>>39,40ありがとう
いるかくんとかぐぐったけど
そうゆう便利なのinstrは出てこなかったから。。
42デフォルトの名無しさん:2007/05/29(火) 23:17:12
初歩的なこととは思いますが質問させてください…
自身のファイルがあるディレクトリとファイル(ブック)名を
知る方法がわかりません…

目的は、ブックのセーブと同時に、ブックと同じディレクトリに
hetml形式で保存(強制上書き)させたいのです。
何も考えずに
ActiveWorkbook.SaveAs _
FILENAME:="./" + ActiveWorkbook.Name + ".htm", _
FileFormat:=xlHtml
ってやったら、MyDocumentoに吐き出されてしまいました(´・ω・`)
43デフォルトの名無しさん:2007/05/29(火) 23:25:22
ThisWorkbook.Path
44デフォルトの名無しさん:2007/05/29(火) 23:28:51
>>42
With ActiveWorkbook
ActiveWorkbook.SaveAs _
FILENAME:= .Path & "\" & Mid(.Name, 1, Len(.Name) - 4) & ".htm", _
FileFormat:=xlHtml
End With

てか、ディレクトリ指定しなきゃThisWorkbookと同じ場所に保存されなかったっけ?
よくおぼえてねーや
45デフォルトの名無しさん:2007/05/29(火) 23:33:11
エクセルのA列をまとめてコピーして、別途開けたノートパッドに貼り付け

これどうするの?
print #1,a
のaに列単位とかは指定できないっぽくて困ってます
46デフォルトの名無しさん:2007/05/29(火) 23:41:53
>>45
print #なんて初めてしった。

使ったことないから知らないけど、
ForEachとかでまわして文字列で渡せば?
47デフォルトの名無しさん:2007/05/29(火) 23:53:42
普通にA列選択してコピペすればいいじゃん
何いってるの?
48デフォルトの名無しさん:2007/05/29(火) 23:55:03
<<46
200行くらいの大量なデータなので、ちょっとくどいかなぁと。
セルの切れ目でテキスト上改行するよう制御する必要もあるかもしれないし。
普通にマウス使えば(notepad起動・A列コピー・貼り付けで)直ぐなのですが、
諸般の事情により自動化させたいのです。

printはここで調べました。
ttp://www2.moug.net/bbs/exvba/20070324000008.htm
49デフォルトの名無しさん:2007/05/30(水) 00:13:05
> 200行くらいの大量なデータなので
1個1個タイプするぐらいがちょうどいい
5046:2007/05/30(水) 00:34:24
>>48
リンク先に答え書いてあんじゃん

>'指定範囲だけを出力したいときは .UsedRangeを _
> 指定範囲に代えればいいです。

これでできたよ。


クリップボード使えばいいのか。勉強になった。ウヒョー
51デフォルトの名無しさん:2007/05/30(水) 00:54:02
コンパイルエラーがでる
ユーザー定義型は定義さていませんだって。

どうも
'Microsoft Forms 2.0 Object Library への参照設定が必要 _
参照設定リストに↑が無いばあいは、プロジェクトに _
いったんUserForm を挿入してすぐ解放してください。 _
これで、クリップボードとのやりとりをするDataObject _
が使用可能になります。
という箇所がわかっていないらしい
52デフォルトの名無しさん:2007/05/30(水) 00:58:07
で?
5346:2007/05/30(水) 01:05:44
>>51
VBEで、挿入→ユーザーフォーム
するとプロジェクトにフォームが表示されるから
右クリックで「UserFormの開放」でおk

確認は、ツール→参照設定で
Microsoft Forms 2.0 Object Libraryにチェック入ってればおk
参照設定で直接チェックいれてもおk


ついでに、

>Open myTextname For Output As io

だと上書きされるっぽいから追記したい場合は
Output → Append
に変更

いいこと教えてもらったからサービスな(はぁと
あとは自分で試行錯誤してくれぃ
54デフォルトの名無しさん:2007/05/30(水) 01:09:55
>>46さんいろいろありがとう。
早速試してみます。
55デフォルトの名無しさん:2007/05/30(水) 16:22:12
Type T
code As Integer
End Type

Sub abc()
Dim a As T, c As New Collection
c.Add Item:=a
End Sub

↑のコードを実行するとc.Addの行で
「コンパイルエラー:パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、
変数を割り当てることができ、実行時バインディングの関数に渡すことができます。」
というエラーになってしまう。

いろいろ調べてみたところCollection側からTの型情報を取得できない?のがエラーの
原因でTを構造体ではなくてクラスにしてObjectとして渡せばOKというのはわかったんですが
構造体が必要なたびにいちいちクラスモジュールを追加するのは正直面倒くさいです
Collectionに構造体を素直にAddできる何かうまい方法ってないんでしょうか?

56デフォルトの名無しさん:2007/05/30(水) 18:40:42
>>35
助かりました。ありがとうございます。
57デフォルトの名無しさん:2007/05/30(水) 19:49:34
>>55
構造体管理クラス作って構造体毎にセッタゲッタ作ればいいんじゃね?
58デフォルトの名無しさん:2007/05/30(水) 20:02:05
Enum T
code = 1
hoge = 2
hage = 3
End Enum

Sub abc()

Dim a(T.hage), c As New Collection
c.Add Item:=a

End Sub
59デフォルトの名無しさん:2007/05/30(水) 23:42:10
エクセルを使って各セルの画素の色の
数値データ(#FFFFFFといったRGB)を
色に変えるマクロなのですが
ttp://uploader.fam.cx/img/u3308.txt
これだと一応動くのですが256色になってしまいます。
フルカラーで出力させるプログラムは
どのようにすればいいのでしょうか?

まったくもって初心者なので
完成されたマクロを出してくれるとありがたいです。
どなたかよろしくお願いします。
60デフォルトの名無しさん:2007/05/31(木) 00:13:02
>>59
仕様
61デフォルトの名無しさん:2007/05/31(木) 08:33:51
Excelは計算ソフトなので、色数は区分けに使える分だけあれば充分ということで
多くの色数を使えることよりも、使える色数減らして軽快に動くように作られてる

つまり、やろうとしてることからして、Excel使うのが間違い
62デフォルトの名無しさん:2007/05/31(木) 09:39:27
>>59
htmlでも出力したら?
63デフォルトの名無しさん:2007/06/01(金) 10:16:09
質問です。下記のようにコードを書いたのですが、エラーが出て
先へ進めません。修正箇所のご指摘とできれば修正後のものをお願いします。
内容はワークシートの中身をプリントするかしないかだけなのですが。

Public Sub PrintWorksheets2()
'declare variables and assign address
Dim intPrint As Integer, intCount As Integer, wkbHours As Workbook, shtCurrent As Worksheet
Set wkbHours = Application.Workbooks("t9-ex-e9.xls")
'ask user if he or she wants to print the worksheet
shtCurrent = wkbHours
For intCount = 1 To wkbHours.Worksheets.Count
intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
If intPrint = vbYes Then 'if user wants to print
shtCurrent.PrintPreview
End If
Next intCount
End Sub
64デフォルトの名無しさん:2007/06/01(金) 10:35:34
83265 2007/5/29 20:00 17.206 41.677  *
83267 2007/5/29 20:00 17.206 41.677  *
83268 2007/5/29 20:10 17.162 41.635
83269 2007/5/29 20:20 17.157 41.638
83271 2007/5/29 20:30 17.162 41.642
83273 2007/5/29 20:40 17.147 41.625
83275 2007/5/29 20:50 17.153 41.637  **
83277 2007/5/29 21:10 17.16 41.645  **

こういった10分ごとのデータが大量にあります。
*の列にあるように、重複データがあったり、
**の列のように間が飛んだりしていいます。
*は重複を削除、**には空白行を挿入して、
完全な10分置きの時系列データにしたいのですが。

数か月分をやれといわれたのですが、一つずつ目で
追ってる状態です。この初心者厨に
書いていただけませんか?
スレ違いなら、スレ教えてくださいませ。
65デフォルトの名無しさん:2007/06/01(金) 11:43:03
行数分の配列用意して、
1行取得して、foreachで重複行チェック、
同じのがあったら配列のフラグたてる
データの行数分繰り返す。

あとは配列チェックしながら
削除するなり転記するなりでいいのでは?
66デフォルトの名無しさん:2007/06/01(金) 11:44:54
これじゃあ、空白行に対応してないわな。スマソ
67デフォルトの名無しさん:2007/06/01(金) 12:19:48
>>63
どこからつっこもうかと….
まず間違い箇所.
>shtCurrent = wkbHours ←型が違う上にオブジェクトにはSetステートメントがいる.
>intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
shtCurrent.Name て…

一応プログラムはWorkbooks("t9-ex-e9.xls") の全部のシートを対象にしてるみたい
なので,修正を書いておくね.
68デフォルトの名無しさん:2007/06/01(金) 12:22:07
Public Sub PrintWorksheets2()
'declare variables and assign address
Dim intPrint As Integer, wkbHours As Workbook, shtCurrent As Worksheet
Set wkbHours = Application.Workbooks("t9-ex-e9.xls")
'ask user if he or she wants to print the worksheet

For Each shtCurrent In wkbHours.Worksheets
 intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
 If intPrint = vbYes Then 'if user wants to print
 shtCurrent.PrintPreview
 End If
Next
End Sub

ちなみにWorkbooks("t9-ex-e9.xls")がそのマクロが含まれているブックなら
ThisWorkBookでOK. もっと短くなる。
69デフォルトの名無しさん:2007/06/01(金) 12:25:24
2024/7/5または45478の値を
2007/05/24または39226に変換するにはどうしたらいいですか?
70デフォルトの名無しさん:2007/06/01(金) 12:30:22
>>64
列の構成がどうなっているかわからないよ?どこまでが一つの列なのか。
あとは、最初の83265とかの意味も。
もう一つは重複している場合、その列は必ず連続しているか、10行あとに
あったりするのかとか。

>>69
???
意味が不明。 2007/05/24→39226に変換という意味じゃなさそうだね?
7169:2007/06/01(金) 12:39:54
>>70
2024/7/5→24/7/5
年/月/日→日/年/月になっていて
ほんとは07/05/24なんです
7264:2007/06/01(金) 12:48:39
>>70
説明がまったくもって馬鹿でした。
*列、**列ではなく、*行、*行でしたすみません。
重複している場合は必ず連続しています。

2007/5/29 20:00 17.206 41.677  *
2007/5/29 20:00 17.206 41.677  *
2007/5/29 20:10 17.162 41.635
2007/5/29 20:20 17.157 41.638
2007/5/29 20:30 17.162 41.642
2007/5/29 20:40 17.147 41.625
2007/5/29 20:50 17.153 41.637  **
2007/5/29 21:10 17.16 41.645  **

こういった10分ごとのデータが大量にあります。
*の行にあるように、重複データがあったり、
**の行のように間が飛んだりしています。
*は重複を削除、**には空白行を挿入して、
完全な10分置きの時系列データにしたいのですが。

数か月分をやれといわれたのですが、一つずつ目で
追ってる状態です。この初心者厨に
書いていただけませんか?
スレ違いなら、スレ教えてくださいませ。
73デフォルトの名無しさん:2007/06/01(金) 12:51:35
>>71
日/年/月の並びは面白いね…。
それを直せるエクセル関数はないかってこと?
それともVBA?
74デフォルトの名無しさん:2007/06/01(金) 12:54:52
>>72
64で書いていた最初の83265とかは無視していいの?
あと、どこまでが一つのセル?
75デフォルトの名無しさん:2007/06/01(金) 12:56:17
>>72
とりあえず重複なんか
フィルタ使えばいーだろ

わからなきゃ「Excel フィルタ 重複」とかでググれ
76デフォルトの名無しさん:2007/06/01(金) 13:04:55
>>74

83265 2007/5/29 20:00 17.206 41.677  *
83267 2007/5/29 20:00 17.206 41.677  *
83268 2007/5/29 20:10 17.162 41.635
83269 2007/5/29 20:20 17.157 41.638
83271 2007/5/29 20:30 17.162 41.642
83273 2007/5/29 20:40 17.147 41.625
83275 2007/5/29 20:50 17.153 41.637  **
83277 2007/5/29 21:10 17.16  41.645  **
    I       I   I    I     I

の値ごとにセルが分かれています。
データによってセルが増えるデータもあるのです。
最初のは整理番号なのでやはりあったほうがよいです。
77デフォルトの名無しさん:2007/06/01(金) 13:24:30
MyDate = Format(Sheets("Sheet1").Cells(GYOU1, 1), "mm/dd/yy")
Sheets("Sheet1").Cells(GYOU1, 1) = "20" & MyDate
78デフォルトの名無しさん:2007/06/01(金) 14:15:30
>>76
どっちの整理番号を残すとかは考えずにいきます.
このスレ的には問題あるかもしれないけど,一応動くので.
Private Sub Sample()
Dim targetCell As Range
Dim date1 As Date,date2 As Date,date3 As Date
Dim intervalMin As Integer

Set targetCell = Range("B1")  ←最初に日付が入っているセル
Do Until targetCell.Cells(2,1)=""
 date1=targetCell+CDate(targetCell.Cells(1,2))
 date2=targetCell.Cells(2,1)+CDate(targetCell.Cells(2,2))
 interval = DatePart("n",date2-date1)
 If interval=0 Then
  Rows(targetCell.Cells(2,1).Row).Delete
  ElseIf interval>10 Then
   Rows(targetCell.Cells(2,1).Row).Insert
   date3=DateAdd("n",10,date1)
   targetCell.Cells(2,1)=Format(date3,"yyyy/M/d")
   targetCell.Cells(2,2)=Format(date3,"hh:mm")
 End If
 Set targetCell=targetCell.Cells(2,1)
Loop
End Sub
7978:2007/06/01(金) 14:21:54
4行目,Dim interval As Integerの間違い
この場合,重複している時間のデータは2番目のデータが消える.
80デフォルトの名無しさん:2007/06/01(金) 14:24:59
>>64
Sub NURUPO()
Sheets("Sheet2").Range("A1:E65536").ClearContents
LastRow = Sheets("Sheet1").Cells.SpecialCells(xlLastCell).Row
GYOU2 = 1
For GYOU1 = 1 To LastRow
If Sheets("Sheet1").Cells(GYOU1, 3) <> Sheets("Sheet1").Cells(GYOU1 + 1, 3) Then
For RETU = 1 To 5
Sheets("Sheet2").Cells(GYOU2, RETU) = Sheets("Sheet1").Cells(GYOU1, RETU)
Next RETU
GYOU2 = GYOU2 + 1
End If
If Sheets("Sheet1").Cells(GYOU1 + 1, 3) - Sheets("Sheet1").Cells(GYOU1, 3) >= 0.006945 Then
GYOU = Fix((Sheets("Sheet1").Cells(GYOU1 + 1, 3) - Sheets("Sheet1").Cells(GYOU1, 3)) / 0.006944)
GYOU2 = GYOU2 + GYOU - 1
End If
Next GYOU1
End Sub
81デフォルトの名無しさん:2007/06/01(金) 14:32:00
>>78さん。
わざわざありがとうございました。動きました。
しかし、わたしの方の説明が悪く…。

83277 2007/5/29 21:10 17.16  41.645  
    I       I   I    I     I

ではなく

83277 2007/5/29 21:10 17.16  41.645  
    I           I    I     I

でした。日付と時刻は同一セルです。
申し訳ないです。見捨てずお願いします。
8278:2007/06/01(金) 15:05:11
>>81 それを早く(ry  そっちの方が簡単だから。
Private Sub Sample()
Dim targetCell As Range
Dim date1 As Date, date2 As Date, date3 As Date
Dim interval As Integer

Set targetCell = Range("B1") 'Range("B1")の所は最初の年月が入っているセル
Do Until targetCell.Cells(2, 1) = ""
 date1 = CDate(targetCell)
 date2 = CDate(targetCell.Cells(2, 1))
 interval = DatePart("n", date2 - date1)
 If interval = 0 Then
  Rows(targetCell.Cells(2, 1).Row).Delete
  ElseIf interval > 10 Then
   Rows(targetCell.Cells(2, 1).Row).Insert
   date3 = DateAdd("n", 10, date1)
   targetCell.Cells(2, 1) = Format(date3, "yyyy/M/d hh:mm")
   Set targetCell = targetCell.Cells(2, 1)
  Else
   Set targetCell = targetCell.Cells(2, 1)
 End If
  targetCell.Select
Loop
End Sub
8378:2007/06/01(金) 15:09:14
下から3行目のtargetCell.selectはあってもなくてもいい。
ちなみにこれは同時刻だったらあとのデータが一緒でもそうでなくても
消す。時刻以外の値も重複していないといけないのなら>>80さんのを参考に。

で、念のためシートをコピーしてそのシートで試したほうがいいよ。
マクロの画面でF8キーを押していくと動作をその都度動きを確認できる。
その場合はtargetCell.selectはあったほうがいいけど。
84デフォルトの名無しさん:2007/06/01(金) 15:22:19
>>78
ありがとうございました。しっかり動きました。
今までは、一時間に144データなので
隣の列に1〜144を貼り付けて目で追ってました。

ホント感謝します。ペコリ。

>>80さんもありがとうございます。
次への参考とさせてもらいます。
85デフォルトの名無しさん:2007/06/03(日) 10:45:26
いつもお世話になっています。
>>78さん、快適に動いています、
が、少し問題が出ました。

パターン1
84017 2007/6/1 9:50 17.111 41.619
84032 2007/6/1 12:00 16.977 41.501
分が連続していたらここは認識してくれない。

パターン2
84090 2007/6/1 16:50 17.056 41.605
2007/6/1 17:00
84099 2007/6/1 18:10 17.206 41.71
時間以上の欠落は無視する。

です。もしよろしければ教えてください。お願いします。

8678:2007/06/03(日) 13:19:43
>>85
休日にお疲れです。
えっと、>>82の「interval = DatePart("n", date2 - date1)」の部分を
       「interval = DateDiff("n", date1, date2)」に変えてください。
少なくとも俺のパソコンではうまくいってる。 ちょっとミスってしまった。スマソ。
87デフォルトの名無しさん:2007/06/03(日) 16:52:49
>>78さん

重ね重ねありがとうございます。
ばっちり動きました。がっつり空いたデータ間に
あっというまに行が空けられる所を見ていると、
とてもうれしげです。

ありがとうございました。ペコリ。
88デフォルトの名無しさん:2007/06/03(日) 18:58:35
すいません。質問です。
Linuxの改行コードを記述する方法はないでしょうか。
Linuxが出力したcsvファイルをWindows(excel)でFSOを用いて
加工しているのですが、改行コードが異なるようで、
読み込んで別のファイルに出力するとサイズが変わります。

excelで加工後、ファイルによってはもう一度Linuxに戻すため、
できればLinuxの改行コードを挿入したいのですが、方法が
ありましたら教えてください
89デフォルトの名無しさん:2007/06/03(日) 19:17:43
>>88
日本語とか入ってたら文字コード自体も変換しないとだめなんでは?
変換はlinuxのnkfなどでできる
90デフォルトの名無しさん:2007/06/03(日) 19:24:51
LinuxだとLFかな?
WriteLineを使わずに Fso.Write(string & vblf) とするとか。
91デフォルトの名無しさん:2007/06/03(日) 19:25:47
改行コードはWinの方が1バイト多いからLinuxなら読めるでしょ
余分なコードつきで
92デフォルトの名無しさん:2007/06/04(月) 14:34:37
すいません、ちょっと質問なんですが、EXCEL2007ってFileSearch使えないんですか?
93デフォルトの名無しさん:2007/06/04(月) 17:53:35
マクロ記録してみれば?
94デフォルトの名無しさん:2007/06/06(水) 01:06:41
透過画像(GIF)を表示させてデスクトップとかフォームの下が見えるようにしたいんですが、
フォームにGIFを表示させても単にフォームを透過するだけで、意図した表示ができません。

要するにフォーム自体を透過させる必要があるんだと思いますが方法が分かりません。
どなたかご教授願います。
95デフォルトの名無しさん:2007/06/06(水) 01:46:31
>>94
シェイプでやったらどうでしょう
今から変更は大変だろうけど
やり遂げた達成感はかなり得られるでしょう
96デフォルトの名無しさん:2007/06/06(水) 06:51:22
他のドロー系ソフトを使ってGIF→WMFもしくはEMF化すれば大丈夫か。
メタファイル系ならオートシェイプと同じ扱いになるので

試しに「GIF WMF 変換」や「GIF EMF 変換」でぐぐってみたら
フリーソフトが結構あるな。
97デフォルトの名無しさん:2007/06/06(水) 16:18:34
APIがあるんだけど難しいよ
98デフォルトの名無しさん:2007/06/06(水) 21:38:45
>>95-97
シェイプが何かすらわからないド素人ですが、何から始めたら良いかも
分からないと言う状況だったのでググって探す取っ掛かりになりました。

時間は掛かると思いますが挑戦してみます。
99デフォルトの名無しさん:2007/06/08(金) 10:27:05
ググってもわかりませんでした。教えてください。

テキストに
AA a: 01 b: 01,02,03,04 c:
AB a: 01,02 b: c:01





と書いてあるものがあります。
AA,ABともに、aの後に続く数字が全部でいくつあるのが、
bの後に続く数字がいくつあるのかという風に抜粋して、
数えた数字をエクセルに書き換えたいのですが
どうもがいてもわかりません。

どなたかおしえていただけませんでしょうか?
説明下手でごめんなさい。


100デフォルトの名無しさん:2007/06/08(金) 12:02:43
>>99
もう少し具体的なテキストと、その場合の要求する結果のサンプルをよろしく。
101デフォルトの名無しさん:2007/06/08(金) 12:56:28
Excel関係なく、単純なテキストファイル解析でしょ。
単にその結果をExcelシートに出力するってだけの話なので、セルへの代入以外はVBAの分野じゃないよな。>>16

ということで、このスレの範疇の部分だけ答えると、セルへの代入は、代入するセルのRangeオブジェクトに対して
「.Value = 代入値」ですよ、ってことで終わりだな。あとはスレ違いなのでよろしく。

他の人にも言っておくが、Excel付属のVBAでやるにしても、Excelのインスタンス使わずにVBScriptでもVB6でも出来るようなことは、
 VBA = [VB]言語による[A]pplication(Excel)操作
の分野ではなく、VB言語の分野なので、ここではスレ違いになるってことを覚えておいてね。
>>1に書いてある通り、VBA分野の話ならどんな事情でVBA使ってようと構わないけど、VBAの分野じゃないことをあえてVBAでやってるだけの奴はNGね。
102デフォルトの名無しさん:2007/06/08(金) 13:03:14
頭固いなぁ
103デフォルトの名無しさん:2007/06/08(金) 13:10:35
いや、そうでもないか
104デフォルトの名無しさん:2007/06/08(金) 13:11:12
>>99

まずテキストのまま正規表現使って全ての数字を消すと
AA a: b: ,,, c:
AB a: , b: c:
のようになる
エクセルにコピーして区切り文字を":"にすると
AA a|  b|,,, c|   |
AB a|, b|  c|   |
とセルが分かれ後は","の数を数えて+1する関数をVBAで
作ればOK
105デフォルトの名無しさん:2007/06/08(金) 14:43:43
>>104
それじゃ最初から数字がない場合と
数字が一つだけでカンマなしの
区別つかなくね?
106デフォルトの名無しさん:2007/06/08(金) 17:49:21
>>105
それではこんな感じで
a:->:に変換
[a-z]:->:

エクセルにコピーして区切り文字を":"にすると
|01  |01,02,03,04|   |
|01,02|        |01 |

Sheet2に
=CountData(Sheet1!A1)
=CountData(Sheet1!A2)
ドラッグして必要なとこまで埋める

関数
Function CountData(a As String)
sa = Split(a, ",")
b = UBound(sa)
If b < 0 Then
CountData = 0
Else
CountData = b + 1
End If
End Function
107デフォルトの名無しさん:2007/06/10(日) 18:48:31
Vista Ultimate, Excel2007です。

コントロールのボタンを作成(貼付け)したところ、
マクロ名を入力するダイアローグが出てきて、マクロ名を入力しました
(そのボタンに対応する処理のマクロを事前に作っていたので)。

その後、TextBoxの処理をする必要が出てきたため、
Private Sub CommandButton1_Click()の編集画面を表示するために
開発→デザインモードをクリックして、ボタンをクリックしたのですが
Private Sub CommandButton1_Click()の編集画面が表示されません。

どういう操作をすれば
Private Sub CommandButton1_Click()の編集画面が表示されるのでしょうか。

よろしくお願いします。

108デフォルトの名無しさん:2007/06/11(月) 00:57:26
複数列のセルをフーリエ解析したいのですが、
A列からD列まで一列一列手動でやってマクロを記録したら下記のようになったのですが、
これをA列からIV列まで一気に行いたい場合にはどうまとめれば良いですか?


Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$A$1:$A$256") _
, ActiveSheet.Range("$A$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$B$1:$B$256") _
, ActiveSheet.Range("$B$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$C$1:$C$256") _
, ActiveSheet.Range("$C$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$D$1:$D$256") _
, ActiveSheet.Range("$D$258"), False, False

End Sub
109デフォルトの名無しさん:2007/06/11(月) 01:57:51
普通にやればいいだけだよ
110デフォルトの名無しさん:2007/06/11(月) 07:58:33
VBAでFREQUENCY関数を使いたいのですが、
キーボード入力の時の”配列数式の入力”は、
VBAでは、どう記述すれば良いのでしょうか。

よろしくお願いします。
111デフォルトの名無しさん:2007/06/11(月) 08:05:38
つ FormulaArray

つーかVBAヘルプを 配列数式 で検索してみたらトップに出てくるじゃん
112110:2007/06/11(月) 14:09:22
>>111

レスありがとうございます
113107:2007/06/11(月) 14:48:11
現象の追加情報です。

デザインモードにして、コントロールにカーソルを合わせると、
ラベルやテキストボックスは、
カーソルが矢印付きの十字(コントロールを移動できる表示)に
変わるのですが、ボタンについては指の形のままです。

このデザインモード(ラベルにカーソルを合わせると矢印付きの十字に
変わる状態)のまま、カーソルをボタンの上に持って来てクリックすると
ボタンに関係付けられたマクロが実行されます。

これって正常な動作なんでしょうか?


114デフォルトの名無しさん:2007/06/11(月) 20:40:20
どうでもいい
115デフォルトの名無しさん:2007/06/12(火) 01:28:42
質問です。
Excel2000で以下のようにあるブックから新しいブックを作り
セルをCopyメソッドを使用してコピーしようとすると
「RangeクラスのCopyメソッドが失敗しました」と
エラーになってしまうのですが
CopyとPasteメソッドをつかってそれぞれのブックを
Activateにしてコピーしないと無理でしょうか?


Dim xlsApp As Excel.Application
Set newBook = Excel.Application

With newBook

Set newBk = .Workbooks.Add

〜編集処理〜

Workbooks(ブック1名称).Activate

Workbooks(ブック1名称).Application.Worksheets(シート名).Range("A1:A20").Copy _
.Workbooks(ブック2名称).Application.Worksheets(シート名).Range("A1")

End With
116デフォルトの名無しさん:2007/06/12(火) 02:40:26
>>115
Set newBk = Workbooks.Add

Workbooks(ブック1名称).Worksheets(シート名).Range("A1:A20").Copy _
newBk.Worksheets(シート名).Range("A1")

こういうことか?
117デフォルトの名無しさん:2007/06/12(火) 17:02:19
Excel2007です

新規ブックでシート上にシェイプを作成し、そのシェイプにマクロを登録します。
シェイプに登録したマクロはこれです。
sub a
thisworkbook.close
end sub

このシェイプをクリックするとエクセルが終了してしまいます。
「問題が発生したため・・・・」

この問題を回避する方法はありますか?
Excel2000のユーザーでVBAの入門者です。

[表]
列に最高気温、最低気温、平均気温という三つの項目を入れ 行に日付の項目を入れた表を
つくりました。下記はその具体例です。
A2 = "2007年1月1日", A3 ="2007年1月2日", A4 = "2007年1月3日",....(以後果てしなく続く)
B1 = "最高気温", C1 = "最低気温", D1 = "平均気温"

[VBAでやりたいこと]
例えば、2007年1月1日の最高気温の値をVBAで入力する場合に、A列の行から"2007年1月1日"
という値の入っているセル番号を探し、"最高気温"の項目と交わるセルをセレクトしたい。
セル番号で直接参照して選択させる方法だと汎用性がないので、項目によって参照させたいんです。
119デフォルトの名無しさん:2007/06/12(火) 19:54:23
>>117
そのマクロを実行しない
120デフォルトの名無しさん:2007/06/12(火) 20:05:58
>>118
A2を選択して
データ->フィルタ->オートフィルタ
>>120
助言して下さって、どうも有難う御座います。私の説明が間違っていたんでしょうか、
オートフィルタは私のやりたいこととはかなり違う気がします。
アクティブではなく「セレクト」という表現を使ったのがまずかったかもしれません。
正確な用語法が分からなくてすみません。
122デフォルトの名無しさん:2007/06/12(火) 22:59:16
>>121
セル番号で直接参照して選択させる方法って何?

項目で参照させたいならセルに名前をつければ?
123デフォルトの名無しさん:2007/06/13(水) 00:43:57
>>118
Find メソッドを使う
ワークシート関数のINDEX 、VLOOKUPを使う
124デフォルトの名無しさん:2007/06/13(水) 09:07:26
どなたかご存じでしたら教えてください。

VBAからJAVAのクラスを使用するための手順を
ご存じでしたら教えてください。
(JAVAのアプリを実行する手順ではないっす)
JNIを使ってJAVAを呼び出すのでしょうか?

当方、VBAもJAVAも初心者なもんで、一連の流れを書いてくれると
ありがたいです。

スレチだったらスンマセン
125デフォルトの名無しさん:2007/06/13(水) 09:22:55
>>124
スレ違いなのでさようなら
参考までに>>101の後半読んでおいてね
126ここでナット:2007/06/13(水) 09:49:13
ちょっとアホな質問かもしれないですが、

VBAのフォームのソースだけを変更して、

それ以外の標準モジュールやシートの内容は

そのままにする事をプログラム化する方法は

ありますでしょうか?

※ボタンを押すだけでソースだけ更新みたいな事です。

127デフォルトの名無しさん:2007/06/13(水) 09:59:13
VBAでグラフを描きたいのですが、第2軸の目盛の最大、最小の指定は
どうすれば良いのでしょうか。
(下記は主軸の場合ですが、どのように変えれば良いのでしょうか)

With .Axes(xlValue)
.MinimumScale = 0
.MaximumScale = 1
End With

よろしくおねがいします。
128デフォルトの名無しさん:2007/06/13(水) 10:17:52
>>127
操作をマクロに記録して睨めっこ。
129デフォルトの名無しさん:2007/06/13(水) 10:37:42
どこで聞いて良いかわからなかったんだが、
膨大な量の乗車案内を検索かけたいんだが、何か良い方法はないだろうか?
東京→上野
東京→新宿
東京→池袋
東京→・・・
   ・
   ・
   ・
130117:2007/06/13(水) 10:40:04
>>119
ありがとうございます。
現在はその回避方法を採用するつもりです。

ただ、その現象が当方の環境によるものかが判断できません。
みなさんの所でも同じ現象が起こりますでしょうか?

また、他の回避方法もありましたらお教えください。
131デフォルトの名無しさん:2007/06/13(水) 11:44:24
>>126
具体的には?
132ここでナット:2007/06/13(水) 11:59:54
>>131

ソースに不具合があったので、ソースだけ更新を行いたいです。

エディター画面を開いてソースを書き換える作業すれば良い事なのですが

その作業を行える人がいないので、簡単にソースだけを書き換える方法を探してます。

例えば、別のExcelマクロを用意してその中に新しいソースを入れて、

ボタンを押して実行すると、変更先のExcelマクロのソースだけが更新するみたいな

事がやれたらいいなと思っています。

133デフォルトの名無しさん:2007/06/13(水) 18:15:41
>>130
当該ブックのみ終了。再現しません
134デフォルトの名無しさん:2007/06/13(水) 18:26:31
135デフォルトの名無しさん:2007/06/13(水) 19:08:08
>>132
エクスポートインポート
136デフォルトの名無しさん:2007/06/14(木) 01:29:13
教えてください。
ボタンを押すと、C→File→にあるdata.csvを開いて処理開始なんですが、
データが無い場合にエラーメッセージを表示するよう仕組んでと言われまして。

ChDir "C:\File\data.Csv"
Workbooks.Open Filename:= _
"C:\File\data.Csv"

とこのあと、if then 文を書けばいいと思うのですが、
If Dir("C:\File\data.Csv") = "" Then
MsgBox "DataBook.xlsは見つかりません"
End If
Exit Sub
こんなん書いたんですが、勿論動きません。
IF文以下お教え願います。
137デフォルトの名無しさん:2007/06/14(木) 01:31:43
すみません、表記間違ってました。

MsgBox "DataBook.xlsは見つかりません"

  ↓

MsgBox "data.csvは見つかりません"  の間違いです
138デフォルトの名無しさん:2007/06/14(木) 01:35:16
あとじゃなくて先にしろ
139デフォルトの名無しさん :2007/06/14(木) 06:08:04
If Dir("C:\File\data.Csv") = "" Then
 MsgBox "data.csvは見つかりません"
 Exit Sub
End If
 ファイルオープン処理

動かなければどこのコードで動かないのか確認してから考えた方が…。
140127:2007/06/14(木) 10:54:26
>128

レスありがとうございます。それしかないですか^^;

141デフォルトの名無しさん:2007/06/14(木) 11:08:33
EXCEL2007のVBAで、複合グラフ(折れ線)を描いたのですが、
グラフの描画領域が、指定したセル範囲をオーバーして描かれます。
指定したセル範囲に収まるようにするには、どうすれば良いのでしょうか

列(縦)方向はぴったり合うのですが、
行(横)方向に幅がオーバーします(左端も少しセルの左端からズレます)。

<コード>
Dim dataRg As Range, graphRg As Range
Sheets("DATA1").Select
Set dataRg = Sheets("DATA1").Range(Cells(data_row_from, data_col_from), Cells(data_row_to, data_col_to))
Set graphRg = ActiveSheet.Range(Cells(graph_row_from, graph_col_from), Cells(graph_row_to, graph_col_to))
Sheets("CHART").Select

With ActiveSheet.ChartObjects.Add(graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height).Chart
.SetSourceData Source:=dataRg, PlotBy:=xlColumns
.ChartType = xlLine
.HasTitle = False
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.HasLegend = False

.SeriesCollection(1).Border.ColorIndex = 41
.SeriesCollection(2).Border.ColorIndex = 53
.SeriesCollection(2).AxisGroup = xlSecondary
End With
142デフォルトの名無しさん:2007/06/14(木) 13:39:11
>>140
With ActiveChart.Axes(xlValue, xlSecondary)
.MinimumScale = 0
.MaximumScale = 1
End With
143117:2007/06/14(木) 13:52:30
>>133
そちらの環境では再現しませんでしたか。
情報ありがとうございます。

もう一台、2007をインストールしたPCを用意したのですが、
そちらでも100%再現しました。

マクロを直接実行した場合は問題なく当該ブックのみ終了するのですが、
そのマクロをシェイプに登録し、そのシェイプをクリックすると
ブックが閉じたあとにExcelが異常終了してしまいます。

ブックを変更していた場合、保存を確認するダイアログがでますが、
「キャンセル」を選択した場合は問題なく、「はい」「いいえ」を
選択した場合は異常終了となります。

ただ、他のブックを開いている場合は当該ブックのみ終了し、
Excelの異常終了はありません。

前回質問時はUpdateしてませんでしたが、Updateした環境でも
同様でした。

とりあえず、他の掲示板などでも同じ質問をしてみてから
マイクロソフトに問い合わせをしてみようと思います。

ありがとうございました。
144デフォルトの名無しさん:2007/06/14(木) 15:20:06
>>132
VBE.CodeModuleのInsertLines(), DeleteLines(), ReplaceLine()あたり。
VBEを使うには、なにか制限なり手順なりがあったような気もする。
実行も、セキュリティレベルを下げる必要があるかも。

まぁ、そのような状況にならないように、アプリはアドインで作った方がいい。
145デフォルトの名無しさん:2007/06/14(木) 15:33:12
>>143
他の環境でも再現するんだ
何か共通でインストールしてるものに影響されてるのかな?
146144:2007/06/14(木) 15:37:08
ttp://sourceforge.jp/projects/vbaunit/から、vbaunitというのをダウンロードして、
新規Bookを開き、参照設定でVBAHelper.xlaと「Microsoft Visual Basic for Applications
Extensibility 5.3」を参照する。
新規にモジュールを作成し(Module1)、次のコードを貼り付け実行すると、3行目が修正される。
Option Explicit

Sub foo()
Dim cm As CodeModule
Set cm = VBAHelperModule.VBAHelperLookupCodeModule("Module1")
cm.ReplaceLine 3, "Sub bar()"
End Sub
147117:2007/06/14(木) 18:15:07
>>145
こちらのテスト環境ですが、どちらも XP Pro SP2 で Office 2007 Enterprise です。
ただ、一方は Virtual PC 上の XP に Excel2007 のみをインストールした状態です。

今のところ考えられる条件は
・シェイプにマクロを割り付けてクリックで実行
・現在のブックのウインドウが閉じられる
・他のブックのウインドウが開いていない

thisworkbook.close 以外にも、これらのコードでもだめでした。
 workbooks(1).close
 window(1).visible = false
148デフォルトの名無しさん:2007/06/14(木) 19:01:36
>>147
なるほど、おそらく2007固有の現象ということですな
2007持ってないんで他の持ってる人に試してもらいたいね
149140:2007/06/15(金) 09:13:16
>>142
レスありがとうございます
150デフォルトの名無しさん:2007/06/15(金) 16:13:53
Rangeの最初の位置を(左上)得たいのですが、どうするのが簡単なんでしょ。

ActiveSheet.Range("テーブル[列]").Offset(0, 0)

Offsetでよいのかな?うまくいっているみたいですけど
151デフォルトの名無しさん:2007/06/15(金) 16:19:45
ActiveSheet.Range("テーブル[列]")(1)

など

152150:2007/06/15(金) 16:26:32
Excel2007です。
>>151
サンクスです。

でじつは、Rangeオブジェクトを for で回そうと、

Dim StartCell As Range, LastCell As Range
Set StartCell = ActiveSheet.Range("テーブル[列]").Offset(0, 0)
Set LastCell = ActiveSheet.Range("テーブル[列]").End(xlDown)

' 資産に関連するもの更新
For i = StartCell.Row To LastCell.Row
   CalculateTable (ActiveSheet.Cells(i, 4))
Next i

としていたのですが、もっと簡単な書き方はないでしょうか?

Dim Cell As Range
For Each Cell In ActiveSheet.Range("テーブル[列]")
   CalculateTable (Cell)
Next
とすると、 CalculateTable (Cell) で、オブジェクトが必要です、と怒られてしまいます。 orz
153150:2007/06/15(金) 16:30:12
>>152
うああああ、
   CalculateTable (Cell)
じゃなくて、
   CalculateTable Cell
にしたら、エラーでなくなった orz
マジVBAわかんねえええええ。

なんだこら
154デフォルトの名無しさん:2007/06/15(金) 16:37:34
関数単体で引数()でくくるとなりますね
155デフォルトの名無しさん:2007/06/15(金) 21:01:14
たぶん配列とまぎらわしいからだろ
156初心者:2007/06/17(日) 13:50:18
はじめまして、VBAをやり始めたばっかりで全然わからないので教えて下さい。

(1)1+2+3+…+10を計算する
(2)1+3+5+…+19を計算する
(3)1+4+9+…+100を計算する
と言う問題で以下の空欄にあてはめるものを答える問題です。

Sub ex()
Dim x As Integer, sum As Integer
sum = 0
For x = 1 To 10
(空欄)
  Next x
Msgbox "合計=" & sum
End Sub

長々とすみません。よろしくお願いします。
157デフォルトの名無しさん:2007/06/17(日) 13:58:01
>>156
宿題だとばれると教えてもらえないから、もう少し、利き方変えた方がいいぞ

あと「よろしくお願いします」って、お前他力本願スギ。
どこが、わからなくて、どこで詰まっているかを質問しよう。
158デフォルトの名無しさん:2007/06/17(日) 14:01:01
(1) sum = sum + x
(2) sum = sum + (2*x -1)
(3) は自分で考えろ馬鹿
159初心者:2007/06/17(日) 15:52:53
すいません。(3)がわかりません
160デフォルトの名無しさん:2007/06/17(日) 16:36:26
sum = sum + (5*x -1)
161初心者:2007/06/17(日) 17:02:14
なぜそうなるのでしょうか?
162デフォルトの名無しさん:2007/06/17(日) 17:12:23
>>160
ワロタ
163デフォルトの名無しさん:2007/06/17(日) 17:48:13
>>161
悪いことは言わん。
算数からやり直せ。
164デフォルトの名無しさん :2007/06/17(日) 18:14:15
なんでまたVBAのスレに質問してくるの?
VBAどころか、ただのアルゴリズム…いや、算数か。の問題だろ。

法則を考えろよ…。
165デフォルトの名無しさん :2007/06/17(日) 18:27:48
言っておくけど160のは違うぞ。

ヒント。
sum=1+4+9+16+25+36+49+64+81+100
これで分からなければ終わってる。
166デフォルトの名無しさん:2007/06/17(日) 18:41:58
気がつかなかった俺オワタw
167デフォルトの名無しさん:2007/06/17(日) 18:46:23
わからない。答え教えてもらえないですか?
168デフォルトの名無しさん:2007/06/17(日) 18:56:47
(3)は
sum=sum+(x*x)
169デフォルトの名無しさん:2007/06/17(日) 18:57:32
>>156
(2)
For i = 1 To 19 Step 2: sum = sum + i: Next: Exit For

(3)
Select Case x
Case 1: sum = sum + 1
Case 2: sum = sum + 4
Case 3: sum = sum + 9
Case 4: sum = sum + 16
Case 5: sum = sum + 25
Case 6: sum = sum + 36
Case 7: sum = sum + 49
Case 8: sum = sum + 64
Case 9: sum = sum + 81
Case 10: sum = sum + 100
End Select

これでいーだろ







まじめに(3)のヒントだすなら「^2」
170デフォルトの名無しさん:2007/06/17(日) 19:06:07
コーディングより1+4+9+…+100が全くわからなかった。
オワテルwww
171デフォルトの名無しさん :2007/06/17(日) 19:30:52
をいをい…。

つうか>>156、その問題は学校の問題か?職場の問題か?
172デフォルトの名無しさん:2007/06/17(日) 20:30:10
>>169
ヒント:「For x = 1 To 10」部分は固定
173169:2007/06/17(日) 21:01:49
>>172
ん?
(2)のことならxでループさせてないんだけど?
試してないからわからんけど、ネストされたForで答えでない?

意味取り違えてたら堪忍
174初心者:2007/06/17(日) 21:49:26
2乗はどうあらわしたらいいのですか?
175デフォルトの名無しさん:2007/06/17(日) 21:55:05
176デフォルトの名無しさん:2007/06/17(日) 23:10:44
>>173
Sub ex()
Dim x As Integer, sum As Integer
sum = 0
For x = 1 To 10
(空欄)
  Next x
Msgbox "合計=" & sum
End Sub

の中で変えて良いのは(空欄)の部分だけ
単に(1)(2)(3)の計算ルーチンを作れば良いだけではなく
1 To 10のxのループを使った上で解かなければならないという条件
177デフォルトの名無しさん:2007/06/18(月) 00:10:28
偉そうに答えてる人の方がネタに見える…
(1) sum = x + sum
(2) sum = x * 2 - 1 + sum
(3) sum = x ^ 2 + sum
178デフォルトの名無しさん:2007/06/18(月) 00:55:34
>>177

ありがとうございました!独学なんで分からないところがたくさんですm(__)m
179デフォルトの名無しさん:2007/06/18(月) 01:03:28
>>178
Excelより先に算数の勉強をし直した方が良いぞ。
180169:2007/06/18(月) 01:14:50
>>176
あ〜ごめん
xを必ずループさせろとは書いてなかったから

ちなみに
俺が書いた(2)が空欄に入れるものだってわかってるよね?
sum = 0
For x = 1 To 10
For i = 1 To 19 Step 2: sum = sum + i: Next: Exit For
Next x
Msgbox "合計=" & sum
End Sub
ってことね

答えが先にかかれてたからふざけてみたんだけど
ふざけすぎたかw
普通なら当然>>177だわなw
181デフォルトの名無しさん:2007/06/18(月) 04:00:12
ネタなのはわかるがiはどこから出てきたんだw
182デフォルトの名無しさん:2007/06/18(月) 16:22:16
EXCEL2003です。
半角アルファベット文字列の先頭だけ大文字にしたいのですが、
適切なものが見つかりません。

ググってProperを見つけましたが、これは先頭を大文字にするだけでなく
先頭以外の大文字を小文字にしてしまいますよね。

helloWorld → HelloWorldとしたいのですが、適切な方法を
教えていただけますか?
183デフォルトの名無しさん:2007/06/18(月) 16:54:13
最初の一文字を取り出して大文字にすれば?
184デフォルトの名無しさん:2007/06/18(月) 17:31:56
s = "helloWorld"
Mid$(s, 1, 1) = UCase$(Mid$(s, 1, 1))
185デフォルトの名無しさん:2007/06/18(月) 21:59:57
Midステートメント使う人久しぶりに見た気がする
Midステートメント自体は自分で使いまくってるからよく見てるが
公開されたソース見ても、こういうところの回答見ても
使ってる人殆ど居ないからなぁ

ところで、Leftステートメントは無いから代入左辺はMidでいいが
右辺の関数はMidではなくLeftの方がいいのでは?
つ Mid$(s, 1, 1) = UCase$(Left$(s, 1))

まあ実はMidもLeftも無くてもOKなんだけどね
Midステートメント側で置換文字数指定していれば、何文字代入しようと指定文字数以外は置換されない
つ Mid$(s, 1, 1) = UCase$(s)

逆に代入する文字数を指定しておけば、置換する文字数は指定しなくても問題なかったりする
つ Mid$(s, 1) = UCase$(Left$(s, 1))
186デフォルトの名無しさん:2007/06/18(月) 22:32:41
>>185
横レスだが、勉強になった
187デフォルトの名無しさん:2007/06/18(月) 22:41:49
つかMidって参照だけかと思ってたw
188デフォルトの名無しさん:2007/06/18(月) 23:11:52
MSbasicからの伝統で、mid$は関数版とステートメント版がある。
189デフォルトの名無しさん:2007/06/19(火) 12:08:51
エクセルソフトを持ってないので、フリーソフトのOPENOFFICEを使用
ダウンロードしてVBAは作成できるんでしょうか?
190デフォルトの名無しさん:2007/06/19(火) 13:18:08
>>189
アレ使えばね
具体的な話はスレ違いなので伏せるけど
191デフォルトの名無しさん:2007/06/19(火) 14:45:55
日本語で書け
192デフォルトの名無しさん:2007/06/19(火) 14:54:14
全くだ
質問内容は察せるが、日本語じゃないよな
193デフォルトの名無しさん:2007/06/19(火) 21:26:28
みなさん、こんばんは。

とある事情により、エクセルのワークシート内に三角波のデータを埋め込みたくなりました。
サインカーブのデータだったら、sin関数でデータを作ったことはありますが、
三角波の場合、どうしたらいいですか?

私がエクセル上でやろうとすると、くどい if文のネストになりそうです。

どなたか、あっさりしたもの、できませんでしょうか?






194デフォルトの名無しさん:2007/06/19(火) 21:46:07
汎用アルゴリズムの話はスレ違い
VBAどころかVBも関係ないし
195デフォルトの名無しさん:2007/06/19(火) 21:58:39
ワークシート埋め尽くす方法ぐらい教えてあげたらw
196デフォルトの名無しさん:2007/06/19(火) 22:13:28
フーリエ展開してしまえw
197デフォルトの名無しさん:2007/06/19(火) 22:48:00
>>189
>エクセルソフトを持ってないので

ちょwww、当たり前だwww

エクセルソフト
http://www.xlsoft.com/jp/
198デフォルトの名無しさん:2007/06/19(火) 23:24:31
インテルのコンパイラ高いな
199使えない子:2007/06/20(水) 14:59:47
上司からいきなり「調べといて」
キタ───ヽ(´Д`;)ノ───!!!

既存ブックのシート構成は、
(シート1)・書類のテンプレ
(シート2)・いろんな調査項目
という感じで、シート2を開いてマクロを実行すると、
いろんな調査項目が大分類ごとに分けて、
書類のテンプレに記入してそれぞれシートを作る、
ということをしています。

今度は、それらの作られる大分類ごとのシートを
新しいブックに作りたい、ということです。
手作業であれば、
[シートの移動またはコピー]のダイアログで、
[移動先ブック名]に「(新しいブック)」を指定し、
[コピーを作成する]にチェックを入れて[OK]ですが、
これをマクロでやりたい、というのです。

[新しいマクロの記録]をしても記録されないので、
困ってしまいました。
マクロやVBA等でやるには、どうしたらよいでしょうか。
どなたかお力添えください。m(_ _)m
200デフォルトの名無しさん:2007/06/20(水) 15:33:41
>>199
やってみたら記録されたけど?
Sheets("Sheet1").Copy
201デフォルトの名無しさん:2007/06/20(水) 18:34:08
記録を停止してない
なんてオチだったりしてW
202デフォルトの名無しさん:2007/06/21(木) 00:02:18
前任の作ったエクセルファイル+VBAを別ファイルで再構築しているのですが、
errors(0).description の部分でエラー「コレクションが存在しません」になります。
元のファイルでは正常に動いているのですが、
新しいファイルではどのようにしたら回避できるのでしょうか。
203デフォルトの名無しさん:2007/06/21(木) 00:09:31
参照設定
204202:2007/06/21(木) 00:42:58
レスどもです。Excelは2000で、
Microsoft DAO 3.6 Object Libraryの参照設定はチェック済なのですが
それでもエラーが出てしまいます。
他にも必要な参照があるのでしょうか。
205デフォルトの名無しさん:2007/06/21(木) 00:46:51
エラーなければerrorsコレクションはないだろ
まずファイルの問題か環境の問題かはっきりさせること
206202:2007/06/21(木) 01:30:40
確かにそうですね。
言われてみればそもそもここはエラートラップなので
他の部分に問題がある可能性大です。切り分けに挑戦して見ます。
207193:2007/06/21(木) 02:00:10
>三角波のデータ

自分で作りました。
作ったのは関数です。(セルに直接記述するのでVBAとは関係ないですね...)

割とあっさりめの形になったと思います。

言わば、sin関数になぞらえるなら、三角波関数みたいなもんです。

1/(2π)*arcsin(sin(t/T*2π))/(1/4)


自分で自分を褒めてやりたいです。
208デフォルトの名無しさん:2007/06/21(木) 08:37:41
うわ、重そう。つーか、頭悪そう。
209デフォルトの名無しさん:2007/06/21(木) 14:47:30
お聞きしたいんですけど
コンボボックスのプロパティのLinkedCellに値が入らないのですが
どうやって入れるのか教えてください
210デフォルトの名無しさん:2007/06/21(木) 20:48:44
普通に=で代入するか、プロパティウィンドウに入力するかだよ
間違った値入れてなければそれでOK
211デフォルトの名無しさん:2007/06/22(金) 00:02:30
>>208

頭わるいやつに作れるわけねーだろ。

おめぇ、つくってみ?
ってか、つくれる?
212デフォルトの名無しさん:2007/06/22(金) 00:04:35
>>211
本人乙。
213デフォルトの名無しさん:2007/06/22(金) 00:38:54
>>211
煽ったら作って貰えると思って必死だな。
今宵は枕が涙で濡れてるんぢゃねぇの?
214デフォルトの名無しさん:2007/06/22(金) 00:48:37
バイナリーファイル(テキスト形式でないファイル)を開いて、
nバイト目の数字を読み込むっていうプログラムを組みたいのですが、
VBAでできますか?
215デフォルトの名無しさん:2007/06/22(金) 00:56:55
よゆう
216214:2007/06/22(金) 11:34:20
ちょっとしたヒントだけでも教えてつかわさい。
217デフォルトの名無しさん:2007/06/22(金) 12:47:31
open filename for random as #filenumber len=1
get #filenumber, n, buf
218214:2007/06/22(金) 15:54:48
えっ、まじですか。
N88BASICとまったく同じぢゃ・・・
219デフォルトの名無しさん:2007/06/22(金) 15:56:42
そりゃぁ、MicrosoftBasicの派生だからねぇ。どっちも。
220214:2007/06/22(金) 18:54:47
わしもスレに貢献しよう
arcsin(sin(t/T*2π))
って
t/T*2π
と同じでしょうw

つりか・・・まじか?
221デフォルトの名無しさん:2007/06/22(金) 23:32:39
教えて頂きたいです。△にぶつかった後に円を描くようにしたいのですが・・・
難しくて。ご教授下さい。
Sub seven() ' 弾けるボール
ActiveCell.Offset(5, 0).Value = "手" ActiveCell.Offset(5, 1).Value = "○"
ActiveCell.Offset(5, 7).Value = "▲" For i = 1 To 6 For J = 1 To 500
ActiveCell.Offset(5, i).Value = "○" ActiveCell.Offset(5, i).Value = ""
ActiveCell.Offset(5, i + 1).Value = "" ActiveCell.Offset(5, i + 1).Value = "○"
Next J ActiveCell.Offset(0, i + 1).Value = ""
Next i ActiveCell.Offset(5, 7).Select.Value = "☆"
For i = 1 To 3 A = ActiveCell ActiveCell = ""
ActiveCell.Offset(-1, 1).Activate For J = 1 To 500
ActiveCell = A Next J Next i For i = 1 To 3
A = ActiveCell ActiveCell = "" ActiveCell.Offset(1, 1).Activate
For J = 1 To 500 ActiveCell = A Next J Next i
For i = 1 To 3 ActiveCell = "" ActiveCell.Offset(1, -1).Activate
For J = 1 To 500 ActiveCell = A Next J Next i
For i = 1 To 3 A = ActiveCell ActiveCell = ""
ActiveCell.Offset(-1, 1).Activate For J = 1 To 1000
ActiveCell = A Next J Next i End Sub
222デフォルトの名無しさん:2007/06/22(金) 23:51:21
>>220
前者は周期関数になる。元レスは、それを使って三角波にできると悦に入っていたらしい。
223デフォルトの名無しさん:2007/06/23(土) 08:35:42
>>221
スレ違い。>>16
224デフォルトの名無しさん:2007/06/23(土) 13:52:35
>>223
スレ違いで拒否るのもいいが、いい加減過疎ってないか?このスレ
あと質問に答えても質問者もほったらかし多いし・・・
俺はわからんから答えんだけだが
225デフォルトの名無しさん:2007/06/23(土) 15:11:42
> いい加減過疎ってないか?このスレ
この板はこんなものだよ
一応ここは過疎板だから

当然、この板にもここより賑わってるスレはあるが
このスレでも平均以上どころか勢い上位1割に入るほど
もっと静かでもいいくらいだ
226デフォルトの名無しさん:2007/06/24(日) 08:44:32
あるRangeの一番左上のセルの情報を得たいのですが、
どうしたらよいでしょうか?
Offsetだと、Range全体が取得されてしまいます。
左上のセルのRangeだけを得たいのですが・・・

ActiveSheet.Range("資産表[資産]").Offset(0, 0).Select
227デフォルトの名無しさん:2007/06/24(日) 08:47:10
>>226
自己解決しました。

ActiveSheet.Range("資産表[資産]").Cells(1, 1).Select

Cellsでした。Rangeにないかと思ってました。
228デフォルトの名無しさん:2007/06/24(日) 09:49:10
すみません、質問です。

商品NO 値段 日付 〜
100 20 5/1
101 21 5/1

といったデータが600まである表があります。
修正や訂正をするため、月一で直さなければいけないんですが
一回別シートに抽出して,そこで変更をし、元あった行に上書きをする
そのように作れと上司にいわれてしまいました。

抽出し、別シートに移すことは出来たのですが、それを元の所に
上書きするのには、どうしたらいいのでしょうか?
切実に困っています。教えていただけたら嬉しいです。
229デフォルトの名無しさん:2007/06/24(日) 10:20:48
抽出した行と元の行を関連づければいいでしょ
方法はいくらでもあるけど
一番簡単なのは別のシートの同じ行に抽出するやり方かな
230デフォルトの名無しさん:2007/06/24(日) 12:15:43
>>228
商品Noをkeyにして.findメソッドで検索して
コピーするVBAをつくる
231デフォルトの名無しさん:2007/06/24(日) 12:16:46
同じ行への抽出だとわざわざ抽出する意味がないと言われます
関連付けっていうのはどのようにやるのですか?
232デフォルトの名無しさん:2007/06/24(日) 12:37:17
すみません、書き込みしている最中に書き込んで頂いてたみたいです。
わかりました、まだKeyとかFindメソッドの使い方が上手ではないのですが
月曜日にがんばってみます。

もしまた解らなかったら書き込みしにきます。
そのときもよろしくお願いします。
ありがとうございました。
233:2007/06/25(月) 23:05:08
マクロ使って初心者でも簡単に作れるプログラムって何かあります?
課題でなんでもいいから作ってこいって言われたんですけど何を作ればいいのやら。
参考書買うしかないんすかね〜お勧めのWEBサイトありますか?
234デフォルトの名無しさん:2007/06/25(月) 23:07:54
MsgBox "Hello World!"
235デフォルトの名無しさん:2007/06/26(火) 00:59:48
>>1の2番目です!
しつもん!
vlookupのプロパティ?に変数を使いたいんですがうまくいきません
どうすればいいでしょうか?

↓こんなふうにしたい

for count=1 to 10
   Cells(count,4).select
   Activecell.Value = "=Vlookup("count"1,B:C,2,False)
next count

A列とB列を比較して、同じのがあったらC列をD列にコピー、みたいな?
BC列も本当はRange("B65536").End(xlUp).Selectで取得した値を使いたいです。

というかそれ以前にRangeで変数を使う方法すらわからない・・・
236235:2007/06/26(火) 01:07:09
書きまちがいを発見

× Activecell.Value = "=Vlookup("count"1,B:C,2,False)
△ Activecell.Value = "=Vlookup(1"count",B:C,2,False)"
○ ?

ところで="〜"で書くのとApplication.WorksheetFunction .VLookup使うのって何か違うのでしょうか?
237デフォルトの名無しさん:2007/06/26(火) 01:08:48
ExcelVBAで、サブルーチンのネストはできますか?
238デフォルトの名無しさん :2007/06/26(火) 01:19:37
>>235
悪い、したいことが分からない。
>A列とB列を比較して、同じのがあったらC列をD列にコピー、みたいな?
これってVLOOKUPか?

ちなみに
ActiveCell.Value="=SUM(B2:B4)"
ActiveCell.Value=Application.WorkSheetFunction.Sum(Range("B2"),Range("B4"))
との違いは、最初の方は、マクロ実行後にB2からB4のセルの値が変われば、ActiveCell
の値も変わる。でも、下の方は変わらない。
それだけじゃないけどな。
239235:2007/06/26(火) 01:33:37
>>238
説明悪くてすまん

まずA1のセルを選択
B列のどこかにA1と同じデータがあったら(B10とする)C10をD1にコピー
これをA10まで繰り返し

vlookupじゃないの?


当初↓みたいなことをやってたのですが、データが各1万行とかになったら速度が恐ろしいことになりまして。
どうにかこれを高速化したいのです。

for count1=1 to Range("A65536").End(xlUp).Select
  for count2=1 to Range("B65536").End(xlUp).Select
    if Cells(count1,1).value = Cells(count2,2),value then
      Cells(count1,4).value = Cells(count2,3).value
    end if
  next count2
next count1
240デフォルトの名無しさん:2007/06/26(火) 01:47:48
>>239
ああ、確かにVLOOKUPだな。
この感じだと、セルD4に 「=VLOOKUP(A1,B:C,2)」って入るよな。
それをセルD10まで下にコピーするのじゃいけないの?

241235:2007/06/26(火) 01:58:26
>>240
各1万行くらいで行数が不定なのです
まとめて出来る(で、forより早い)方法があればvlookupでなくてもなんでもいいのですが
242デフォルトの名無しさん:2007/06/26(火) 02:17:26
>>241
もう頭が働かないんで…
とりあえず235で質問してたRangeを変数に代入する方法
 Dim targetRange As Range 
 Set targetRange = Range("A65536").End(Xlup)

これでtargetRange.Rowで最終行が何行目か分かる。

ちなみにforでも一万行くらいならあまり時間かからないような気がする。
forのネストにする意味が分からない。一致したらExit For でFor文を
抜ければいいのに。

243デフォルトの名無しさん:2007/06/26(火) 03:15:16
>データが各1万行とかになったら速度が恐ろしいことになりまして

実行中の画面描画をOFFにしてないんじゃない?
そこ変えるだけで解決することもあるよ
244デフォルトの名無しさん:2007/06/26(火) 03:20:47
Application.ScreenUpdating = False
処理の終了段階でTrueに戻して下さい。

Application.EnableEvents = False
処理の終了段階でTrueに戻して下さい。

Application.Calculation = xlCalculationManual
処理の終了段階でxlCalculationAutomaticに戻して下さい。

マクロ動作中にEscキーで止められるのを抑制する。
マクロ動作中に一切のキーやマウス操作を制限する。
Application.Interactive = False
処理の終了段階でTrueに戻して下さい。

但し、この状態で何らかの理由でマクロが停止してしまうと、Excel自体は何も操作できない状態になってしまい、タスクマネージャで強制終了させなければならなくなります。この記述だけは確実に動作検証が終わってから設定して下さい。

マクロ動作中はマウスカーソルを「砂時計」にする。
Application.Cursor = xlWait
処理の終了段階でxlDefaultに戻して下さい。

http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_090_040.html
245デフォルトの名無しさん:2007/06/26(火) 04:00:51
>>235
Range("D1").Resize(Cells(Rows.Count, "A").End(xlUp).Row).Formula = _
"=VLOOKUP(A1,B$1:C$" & Cells(Rows.Count, "C").End(xlUp).Row & ",2,FALSE)"

>>244
>何も操作できない状態になってしまい、タスクマネージャで強制終了させなければならなくなります。

イミディエイトウィンドに
Application.ScreenUpdating = True
で、エンターキー
246デフォルトの名無しさん:2007/06/27(水) 00:07:51
 A     B    C       D
東京  東京  東京  =LOOKUP(A1,B:B,C:C)
     大阪  大阪
     愛知  名古屋
     福岡  福岡
     北海道 札幌


とするとD1が名古屋になるんだけど気のせい?
247235:2007/06/27(水) 01:06:07
>>242,243,244,245さん、ありがとうございます。

>>242
逆でして、
for i=1 to Range("A65536").End(Xlup)
Range("A"i).select
next i
みたいなことがしたかったのです。

>>243,244,245
本日ぐぐりまくってとりあえずそこらへんの設定をしました。

やりたいことを綴ってたらえらい長くなってしまったので表にしました(とりあえずodsとxml)
見ていただければ幸いです
ttp://bebe.run.buttobi.net/up/src/be_1262.zip
248デフォルトの名無しさん:2007/06/27(水) 01:10:52
2003personalだとエラーが出て開けない
249235:2007/06/27(水) 01:21:05
うゆー

ってか、今更xlsを発見した。すまねぇ
ttp://bebe.run.buttobi.net/up/src/be_1263.zip
250デフォルトの名無しさん:2007/06/27(水) 01:27:13
なんか昔、これの横バージョンを総合相談所のほうでコード書いた気がする…
251デフォルトの名無しさん:2007/06/27(水) 01:52:19
横バージョンじゃなくて、似たような表の作成だった。
相談所55の部品表のをいじればなんとかなるんじゃないかな。
実行速度もシートをメモリに読み込んですれば大丈夫だろう。
もう寝る。
252245:2007/06/27(水) 17:46:50
'Microsoft Scripting Runtime を参照設定
'結果はG,H,I列の1行目以下に出力

'結果出力用配列 出力行数を上回る行数を確保。下回るとエラー
Dim ans(5000, 2) As String

Dim d As New Scripting.Dictionary
Dim v() As Variant
Dim buf As Variant
Dim vv As Variant
Dim i As Long
Dim n As Long

v = Range("D1", Cells(Rows.Count, "E").End(xlUp)).Value

For i = 1 To UBound(v)
  If d.Exists(v(i, 1)) Then
    d(v(i, 1)) = d(v(i, 1)) & vbTab & v(i, 2)
  Else
    d.Add v(i, 1), v(i, 2)
  End If
Next i

v = Range("A1", Cells(Rows.Count, "B").End(xlUp)).Value
253245:2007/06/27(水) 19:00:43
For i = 1 To UBound(v)
  If d.Exists(v(i, 1)) Then
    buf = Split(d(v(i, 1)), vbTab)

    For Each vv In buf
      ans(n, 0) = v(i, 1)
      ans(n, 1) = v(i, 2)
      ans(n, 2) = vv
      n = n + 1
    Next vv
  Else
    ans(n, 0) = v(i, 1)
    ans(n, 1) = v(i, 2)
    n = n + 1
  End If
Next i

Set d = Nothing
Range("G1").Resize(n, 3).Value = ans
254デフォルトの名無しさん:2007/06/27(水) 21:42:09
をいをいw
255デフォルトの名無しさん:2007/06/27(水) 23:38:13
>>254
どうした?
256デフォルトの名無しさん:2007/06/28(木) 09:32:06
>>252
>>245関連ではないのだが、

> 'Microsoft Scripting Runtime を参照設定
> Dim d As New Scripting.Dictionary

これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?
257デフォルトの名無しさん:2007/06/28(木) 17:31:08
すいません。質問です。
シート1のあるA1に「A」、A2に「B」、B1に「1」、B2に「2」が入っています。
シート2にはA1に「A」、A2に「3」、B1に「B」、B2に「4」が入っています。
シート1のA1の「A」を検索した上でその下のセルにある「1」をシート2の「A」の横にあるセルに入力し、且つそのセルにあった数値(ここでは3)を右にシフトしたいのです。
VBではどうすればいいですか?
258デフォルトの名無しさん:2007/06/28(木) 19:38:54
Shift:=xlToRight
259235:2007/06/29(金) 00:17:52
相談所55が見つからなかったので自力で作ったよ!

よく考えたら別に一枚のシートじゃなくていいじゃん、ということに遅まきながら気付いたので

for i,j=1 to 各行数
  If Cells(i,1).value = Cells(j,4).value then
    k=k+1
    Sheet("Sheet2").Cells(k,1).value = Cells(i,1).value
  Next j
  〜(マッチしなかったときの処理とか)〜
Next i

的な流れで完成したお!
遅いお!

>>252
何これ!チョー早い!
意味が全然分からないけど今から修行する!さんくす!


ところで=minute(now())とかsecond(now())とか並べてるとyear(now())だけ変になるんだけど何故?
260デフォルトの名無しさん:2007/06/29(金) 00:24:35
値のコピー貼付をワークブック間で行いたいのですが、
' @コピー元
Workbook("").Sheets("").Activate
Range("").Copy
' Aコピー先
Workbooks("").Sheets("").Activate
Range("").Select
Selection.Pastespecial Paste:=xlValues

ファイルをまたぎ、かつ値貼付の場合このような段階を踏まないとエラーになってしまいます。
同シート内での値コピーに使える Range("").Copy Range("").Pastespecial
またはRange("")=Range("") のような簡潔な記入法は無いものでしょうか?
261デフォルトの名無しさん:2007/06/29(金) 00:42:07
ですてぃねーしょん
262デフォルトの名無しさん:2007/06/29(金) 01:05:23
すみませんが、ひとつ教えてください。
階乗を計算する関数を作成したくて、
以下のようなプログラムを書いたのですが、
戻り値が0です。
なぜでしょうか?
(ちなみに、xxをkfactにすると、正常に動くようです)
ぜひ、ご回答お願いいたします。

Public Function kfact(n As Integer) As Integer

Dim i As Integer
Dim xx As Integer

i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop

End Function
263デフォルトの名無しさん:2007/06/29(金) 01:26:15
>>262

Public Function kfact(n As Integer) As Integer

Dim i As Integer
Dim xx As Integer

i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop
'↓これ追加(戻り値)
kfact = xx
End Function

ちなみに階乗なら=fact()って関数あるけど
それじゃダメなん?
VBAで使うならApplication.WorksheetFunction.Fact()ね
264デフォルトの名無しさん:2007/06/29(金) 16:35:16
>>256
わけ。特に珍しい手法ではない。

Dictionaryやfsoは便利なので結構良く使うと思う
265デフォルトの名無しさん:2007/06/29(金) 20:11:27
エクセル2003、ウィンXPです。
以下の様なマクロを作成しました。
データの抽出後に、可視セルの値を順に特定セルに入れて、
印刷したいのですが、思った様に動作しません・・・。
どなたか、お知恵を!


Sub 抽出と印刷()

'書類作成用にデータを抽出。
'シート1のBP列がゼロで無いものを抽出。

Sheets("シート1").Columns("BP:BP").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd

'抽出されたリストのBP列の値をシート2のD68に順番に入れて、2枚ずつ印刷する。
‘抽出から除外された行は印刷からも除外したいので、可視セルだけで処理したい。

Dim i As Long
For i = 2 To Worksheets("シート1").Cells(Worksheets("シート1").Rows.Count, 1).End(xlUp).SpecialCells(xlCellTypeVisible).Row
Worksheets("シート2").Range("D68").Value = Worksheets("シート1").Cells(i, 1).SpecialCells(xlCellTypeVisible).Value

'印刷処理をします。
Sheets("シート2").PrintOut copies:=2, Collate:=True, preview:=True

Next i

End Sub
266デフォルトの名無しさん:2007/06/29(金) 20:28:14
>>256,264
> これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?
正確には違う
Microsoft Scripting RuntimeはWSHのインストーラーパッケージに含まれてはいるが
Scripting.DictionaryはWSHのオブジェクトではなく、ActiveXの汎用コンポーネントに含まれるオブジェクト
WSHのオブジェクトじゃないから、WSHから使う場合もWSHのオブジェクトであるWScriptオブジェクトみたいに
いきなり使うことは出来ず、CreateObjectなどで外部参照してやる必要がある
267デフォルトの名無しさん:2007/06/29(金) 23:03:58
ShowしたUserFormってどうやって閉じていますか?

UserForm1.Close

こんなのないよね?

Unload Meってのはいまいち分からない。不便。
268デフォルトの名無しさん:2007/06/29(金) 23:08:07
Unload UserForm1
269デフォルトの名無しさん:2007/06/29(金) 23:24:03
>>268
サンクス
270デフォルトの名無しさん:2007/06/29(金) 23:25:06
>>265
どこが思ったように動作しないのか説明がないけど
抽出したあとCopy使えばいいよ

>>267
UserForm1.Hide
271デフォルトの名無しさん:2007/06/30(土) 00:04:38
>>270
Hideは見えなくなるだけ
272デフォルトの名無しさん:2007/06/30(土) 00:46:27
>>271
うん、でも>>268の人がもう答えてたから他のを書いた
あと一応はShowとHide、LoadとUnloadが対応になってるかなと思ってるし
273デフォルトの名無しさん:2007/06/30(土) 01:35:58
Accessではclose使えるのに
どうしてExcelではだめなのでしょう?
274262:2007/06/30(土) 01:50:26
263
ありがとうございます。
ワークシート関数ってオーバーフローするイメージがあるので、あんまり好きじゃないのです。
275デフォルトの名無しさん:2007/07/01(日) 00:50:52
>>92
Application.FileSearchは削除されたよ。
以前から挙動不信だったんで、存在そのものを抹消したのだと思われ。
276デフォルトの名無しさん:2007/07/01(日) 03:23:57
5人で30回じゃんけんをして、出した手をB〜Fに書き込み、勝敗をG〜Kに
書き込むマクロを短めで作りたいのですが、勝敗パターンを作る以外の方法が思いつきません。
よろしくお願いします。
277デフォルトの名無しさん:2007/07/01(日) 04:25:41
>>276
>>16
さようなら
278デフォルトの名無しさん:2007/07/01(日) 08:47:13
>>275
あー確かに挙動不振だな
279デフォルトの名無しさん:2007/07/01(日) 09:19:11
置換について質問です。
以下の様にすると、"さんま"という文字列を"魚"に置換できるのですが、
"さんま"、"タイ"、"いわし"のいずれかの場合に"魚"に置換する場合はどうやって指定しますか?

Selection.Replace What:="さんま", Replacement:="魚"
280デフォルトの名無しさん:2007/07/01(日) 09:31:10
>>279
with Selection
.Replace What:="さんま", Replacement:="魚"
.Replace What:="タイ", Replacement:="魚"
.Replace What:="いわし", Replacement:="魚"
end with
281デフォルトの名無しさん:2007/07/01(日) 09:38:53
>280
ありがとうございます!
282デフォルトの名無しさん:2007/07/01(日) 10:13:19
>>276
総合で訊いてる奴だよな?
283280:2007/07/01(日) 10:20:13
>>281
ぉぃ! まさか、こんなこと訊いてるんじゃないよなぁ...と思いながら、
答えてみたんだが、解決かよ(-_-#);
284デフォルトの名無しさん:2007/07/01(日) 10:57:24
釣りだろ
285デフォルトの名無しさん:2007/07/01(日) 11:57:26
シートAに以下のマクロ実行するボタンがあります。
シートBを選択した状態だと問題なく動作するが、
シートAから実行するとエラーがでます。
最終的にシートA以外は不可視にしたいので、
Worksheets("シートB").select
をしたくないです。
何か良い方法有りますか?

Worksheets("シートB").Range(Cells(1, 1), Cells(100, 100)).Sort Key1:=Range("a1"), Key2:=Range("d1"), Header:=xlYes
286デフォルトの名無しさん:2007/07/01(日) 14:11:49
Set ws = Worksheets("シートB")
With ws
.Range(.Cells(1, 1), .Cells(100, 100)).Sort Key1:=.Range("A1"), Key2:=.Range("D1"), Header:=xlYes
End With
287デフォルトの名無しさん:2007/07/01(日) 15:26:32
>286

有難うございます。
試してみましたところ、シートBが選択された状態では動作しました。
シートAが表示された状態で実行すると、
「アプリケーション定義またはオブジェクト定義のエラーです」となります。
288デフォルトの名無しさん:2007/07/01(日) 19:25:16
Σ(゚∀゚;) ?
289デフォルトの名無しさん:2007/07/01(日) 19:45:48
285です。
解決しました。

Worksheets("シートB").Range(Worksheets("シートB").Cells(1, 1), Worksheets("シートB").Cells(100, 100)) _
.Sort Key1:=Worksheets("シートB").Range("a1"), Key2:=Worksheets("シートB").Range("d1"), Header:=xlYes
290デフォルトの名無しさん:2007/07/01(日) 20:52:21
>>289
これって>>286と何が違うん?
291デフォルトの名無しさん:2007/07/01(日) 22:42:36
Excel2003なのですが、
VBエディターで編集したマクロをリロードするための
ファンクションキーってありますでしょうか?
292デフォルトの名無しさん:2007/07/01(日) 23:01:44
エクセルの2つのシートを比較するマクロを作っているのですが、
行と列のサイズが大きくなると処理が重くなります。

1000*256ぐらいで処理が重くなります。
これは、仕様なんでしょうか。

For i=0 To 65536  
  For j=0 To 256
    比較
  Next
Next

使われているシートの範囲を読み取るとか
範囲を設定するとかすればいいと思っています。
指摘などありましたらよろしくお願いします。
293デフォルトの名無しさん:2007/07/01(日) 23:19:53
>>292
Dim s As Range
Set s = ActiveCell.SpecialCells(xlLastCell)
MsgBox s.Column & " " & s.Row
294デフォルトの名無しさん:2007/07/02(月) 20:40:46
arry(あ,い,う,え,お)
を、
ExcelのセルA1〜E1に
一気に貼り付ける方法てないですかね。

For文で順番に
セルA1に「あ」を入れて
セルB1に「い」を入れて…
というのは分かるんですが。
なんかもっとこう効率良いやり方ないかな。
295デフォルトの名無しさん:2007/07/02(月) 21:05:35
>>294
おしい、そこまでいけて何故できないw
Range("A1:E1") = Array("あ","い","う","え","お")

是非感想を。
296デフォルトの名無しさん:2007/07/02(月) 21:14:58
>>295
で、できたー!!

ありがとう。これでよかったのか…
Pasteにばっか気をとられてたわ。
297デフォルトの名無しさん:2007/07/03(火) 00:16:07
VBAのコードを含んだブックを余所にあげたりするとき、デジタル署名とか
どうしてますか?

律儀にベリサインから買ったりしてるんでしょうか?
298デフォルトの名無しさん:2007/07/03(火) 06:33:52
SelfCert
外に出すときは、署名壊れたとき用に対応策(向こうで再署名)を書いておく
# ソースは見られるが管理者だけなら問題なかろう
2000ならこれでOK

それ以降なら我慢して使ってもらうしか。
一応、毎回署名を確認してもらう事に…

既に署名を持っているならともかく、予算的にExcelの為に申請なんて出せないし。
299デフォルトの名無しさん:2007/07/03(火) 09:15:58
売る場合はともかく、あげる場合は向こうで勝手に対応してもらう
300デフォルトの名無しさん:2007/07/03(火) 11:31:57
Set objIE = CreateObject("InternetExplorer.application")
で、IEを起動しています。
なんらかの操作で、IEのウインドウが最小化された場合に備えて、それを「元のサイズに戻す」の
処理を行いたいのです。
検索してみたところ、VBでは、SW_SHOWNA の利用で良いみたいですが、
同様の処理をVBAで行いたいのです。
ojbIEに対して処理を加える方法は無いでしょうか?
他に考えたのは、API32を参照しobjIEとは関係なく処理を行うですが、そうした方が良いのでしょうか?
よろしく御願いします。
301デフォルトの名無しさん:2007/07/03(火) 12:10:35
302デフォルトの名無しさん:2007/07/03(火) 12:41:01
厳しいなあw
303300:2007/07/03(火) 16:21:57
Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

If objIE.Top < 0 Then
ShowWindow objIE.hWnd, 9 'SW_RESTORE アクティブにもなる。
End If

で解決しました。objIE.Top < 0 は怪しいですが、良しとします。
304デフォルトの名無しさん:2007/07/03(火) 18:42:33
>>295
それ、A1:E1ならできるけど
A1:A5だとうまくいかない。なんでだろ?
305デフォルトの名無しさん:2007/07/03(火) 20:17:56
>>302
× スレ違い指摘が厳しい
○ 質問者がVBAの範疇を理解してない
306デフォルトの名無しさん:2007/07/04(水) 17:34:35
VBAというか、プログラミングの初心者です。
変数のスコープ(有効範囲?)のことでハマッっています。

UserForm1のなかの冒頭でPublicとして宣言した変数aの値を
(この値は同じくUserForm1内にPublicとして記述されたプロシージャによって代入される)
UserForm2のなかのプロシージャ内でmsgbox(a)として表示しようとするのですが、
値が空白になってなにも表示されません。
UserForm1 UserForm2のすべてのプロシージャをPublicにしても同じです。

こんなボケに対する、どなたかツッコミをお願いします。
307デフォルトの名無しさん:2007/07/04(水) 17:47:03
Msgbox(UserForm1.a)

理由:ユーザフォームはモジュールではなくクラスだから
308304:2007/07/04(水) 19:03:53
自己解決。
これでいけた。

Range("A1:A5") = Application.Transpose(Array("あ", "い", "う", "え", "お"))
309306:2007/07/04(水) 22:42:37
>>307
助言くださったとおり、うまくいきました。理由を書いてくださったのがヒントになり、
Public変数をUserFormではなく標準モジュールのほうで宣言すればいいことに
気がつきました。どうも有難うございました。
310デフォルトの名無しさん:2007/07/05(木) 12:37:25
>Public変数をUserFormではなく標準モジュールのほうで宣言すればいい

死ね
311デフォルトの名無しさん:2007/07/05(木) 21:18:05
あの子ったら、また私のパンティを……。
 
息子の康彦を学校へ送りだし、洗濯にかかろうとした美沙緒は、
洗濯機のなかに無造作に放りこまれた自分のパンティを見て、大きく溜め息をついた。

困ったわ。どうすればいいのかしら?……
 パンティを手に持ったまま、美沙緒は考えこんでしまった。
 
康彦は十四歳の中学二年生。七つ年上のいまの夫と大恋愛に落ちた美沙緒が、
周囲の猛反対を押しきって、十八歳のときに産んだ子だ。
 
その康彦の不可解な行動に美沙緒が最初に気づいたのは、もう一年近くも前のことになる。
312デフォルトの名無しさん:2007/07/05(木) 21:23:27
小学生の頃、同じクラスのヤシんちに行った。ソイツの姉ちゃんは高校生でキレイだった。

化粧してるのをボケーと見てた。
「何で見てるの?」
やさーしく微笑んでくれた。
「ち、ちゅーしたい!」
おいら、とっさに言った。
姉ちゃん、頭なぜなぜして、オデコにちゅーしてくれた。
「口紅ついちゃったわね」
コットンでキレイにしてくれた。
おいら、コットンを奪って逃げた。

次の日、姉ちゃんに告った。
「お姉ちゃん、彼氏いるの」
おいら「ならば、貴様を殺して永遠に我と共に」
姉ちゃん「よかろう。来るが良い」
虚空を突き破る轟音。空気を切り裂く甲高い音。
おいらの口から鮮血があふれ出す。
おいらの拳は僅かに届かず、逆に手刀が胸に突き刺さっている。崩れ落ちるおいら。
おいら「・・・これで、貴様は俺を忘れないだろう。ぐ・・」
姉ちゃん「忘れはせぬ。貴様の魂我が心と共に。悲しき男よ。誰よりも愛深く、拳でしか愛を語れぬゆえに」
死してなおその男の顔に浮かぶ表情は喜びであったか悲しみであったか。
その時、一陣の風が吹いた。
愛に死んだ修羅の魂を運び去るように。
313:2007/07/06(金) 22:24:01
     00年  01年 02年 03年
     売上高 

キャベツ 500  400 300  200
ニンジン 600  300 400  500
トマト  400  400 500  400
レタス  300  500 600  300

年代別に最も多い売上高の野菜を調べるためのアルゴリズムってどうすればいいんですか?
上の例で言うと00年の売上高がもっとも高いのはニンジンなのでマクロをつかって00年
ニンジン、01年レタスというようにセルに順番に出していきたいんですがどうすればいいんで
しょうか?
314デフォルトの名無しさん:2007/07/06(金) 23:04:40
>>313
VBAを使うまでもない。よってスレ違い。
315デフォルトの名無しさん:2007/07/06(金) 23:18:00
>>310
>死ね

って、どういう意味ですか?
316デフォルトの名無しさん:2007/07/06(金) 23:24:52
>>315
つ[辞書]
つ[goo.ne.jp]
317:2007/07/07(土) 01:04:04
>>314
課題でどうしてもVBAを使ってやらないとだめなんです。
まだはじめたばかりで普通にやったほうが早いんですけど。
せめてどのような文法を使ったらいいのかだけでも教えてもらえませんか?
318デフォルトの名無しさん:2007/07/07(土) 01:54:03
>>317
ここは宿題スレじゃない
319デフォルトの名無しさん:2007/07/07(土) 11:55:37
     00年  01年 02年 03年
     売上高 

キャベツ 500  400 300  200
ニンジン 600  300 400  500
トマト   400  400 500  400
レタス   300  500 600  300
      ニンジン レタス レタス ニンジン
320>314:2007/07/07(土) 14:28:49
Sub CHEATFROM2CH()

For c = 2 To 5
val1 = 0
val2 = ""
For r = 2 To 5

If Cells(r, c) > val1 Then
val1 = Cells(r, c)
val2 = Cells(r, 1)
ElseIf Cells(r, c) = val1 Then
val1 = val1
val2 = val2 & "と" & Cells(r, 1)
ElseIf Cells(r, c) < val1 Then
val1 = val1
val2 = val2
End If

Next r
Cells(12, c) = val1 & "円の" & val2
Next c

End Sub


もっと削れるけど、このままの方がわかり易くていいだろ…
321デフォルトの名無しさん:2007/07/07(土) 16:26:12
シート2に顧客番号と名前のリストを置いて、
シート1のA1に、例えば「10」と入力した時にそれに対応するシート2の
顧客番号10番の名前を、シート1のA2に表示させたいんですが。
初心者の俺でもできるかなと思いましたが分かりませんでした。 orz

よろしくお願いいたします。
322デフォルトの名無しさん:2007/07/07(土) 16:56:22
>>321
それを何故VBAでやりたい?
シートだけでできるっしょ。
323デフォルトの名無しさん:2007/07/07(土) 17:06:56
B列にhh:mm:ss形式で入っている時刻をまず文字列(’シングルクォーテーションをいれるみたいなイメージなんですが)にして、
次にA列の文字列と連結してC列に表示していきたいのですが、
B列のhh:mm:ss形式をそのままの形で文字列にするにはどうすればよいのでしょうか?
324デフォルトの名無しさん:2007/07/07(土) 17:28:31
しょうがねぇなぁ……
手元にOpenOfficeしかないから適当に読み替えて試してくれ。

>>321
顧客番号がA列、名前がB列として、
A2
=vlookup(a1;シート2.a1:b9999;2)

>>323
C5
=a5&text(b5;"hh:mm:ss")
325321:2007/07/07(土) 17:59:42
>>324
早速のレスありがとうございました!
試してみてエラーが出たので悩みましたが、
=VLOOKUP(A1,Sheet2!A1:B9999,2,TRUE)
でうまくできました!

2人でやっているお店で店長が入院してしまい、自分1人ですべてこなすために
手書きでやっていた部分の仕事をどうしても合理化しなくてはいけなかったので
とても助かりました。ありがとうございました。
326321:2007/07/07(土) 18:56:36
すみません、追加で質問させてください。

顧客が9999人だった時に、10000以上の数字を誤入力してしまうと
9999番目の人が表示されてしまいます。データの入力規則で縛ろうにも、
毎日顧客は増えていきますのでその度に手直しできません。
良い知恵がありましたらよろしくお願いいたします。
327デフォルトの名無しさん:2007/07/07(土) 18:57:55
数式を穴があくまで見つづけろボケ
328:2007/07/07(土) 22:05:29
>>320
まじでありがとうございます。
自分もこんなふうにできるようになりたいです
329デフォルトの名無しさん:2007/07/07(土) 22:09:53
>>328
1週間くらい勉強すれば、このくらい出来るようになるよ
330:2007/07/07(土) 22:29:29
お世辞だよ
331デフォルトの名無しさん:2007/07/07(土) 22:44:56
初心者なのですが、質問させて下さい。
環境はWinXP+Excel2003です。

VBAでFor文を使ったネスト構造を作っています。
3階層のネスト構造の場合、
各変数x,y,zとして以下のロジックを作ってみました。

For i = 1 to 3
For j = 1 to 3
    if i = j then exit for

    For k = 1 to 3

if j =k then exit for
if k=i then exit for

      <処理>

Next k
Next j
Next i

期待としては、同じ数が出たときだけスルーするロジックになって欲しかったのですが。
実際には、そうはならず、9パターン中、1-2-3と1-3-2と2-1-3と2-3-1と3-1-2と3-2-1の
6パターン処理されるつもりだったのに、2-3-1と3-2-1の2パターンしか処理されませんでした。

ロジックのどこがおかしいのでしょうか。
おそらく、exit for の設定を私が判っていないせいの様な気がするのですが…
332デフォルトの名無しさん:2007/07/07(土) 23:03:30
そりゃぁ、exitでforから抜けちゃってるからねぇ。
333デフォルトの名無しさん:2007/07/07(土) 23:06:37
うすうす気付いてるようだけど、ループのスキップではなく、ループの終了(Exit For)をしてるから
1=1でExit Forすると、以後の2〜3は処理されない

For i = 1 To 3
  If i = 1 Then Exit For
  Debug.Print i
Next i

で、2と3が出力されませんと言ってるようなもの

一致条件でExitではなく、不一致条件内に内部ループや処理を置けばいい
334デフォルトの名無しさん:2007/07/07(土) 23:32:36
>>332
>>333

迅速なレスをありがとうございました。
やはり、Exit Forが悪いと言うことで、
当該部分を削除し、以下のように変更したところ、期待通りの結果が出来ました。

if i = j then
elseif j = k then
elseif i = k then
else

<処理>

endif

適切なヒントを下さり、本当にありがとうございました。
335>326:2007/07/08(日) 01:15:38
引数に"TRUE"を使うからそうなる。
"TRUE"だと完全一致しなくてもデータを読んでしまうので
"FALSE"(完全一致必須)にするのが一般的

蛇足すると、Sheet2がデータ専用なら行数を限定する必要は無い
VLOOKUPのデータ元参照式には、参照範囲のズレを防ぐため普通$を付ける。
てことでこんなんが妥当かな。
=VLOOKUP(A1,Sheet2!$A:$B,2,FALSE)

ところでここVBAスレなんだけど…
336321:2007/07/08(日) 02:56:27
>>335
詳しく解説していただき本当に感謝です。
正直、TRUEやFALSEの意味もろくに分かっていなかった自分です。
スレタイだけ見てここで質問してしまい、大変お邪魔しました。
337デフォルトの名無しさん:2007/07/08(日) 07:08:08
>>335
ExcelとVBAの質問スレらしいよ
338デフォルトの名無しさん:2007/07/08(日) 07:55:16
×ExcelとVBAの質問スレ
○ExcelのVBAの質問スレ

例えスレ立て主の意図が前者だろうと、2chの規則的には
プログラム技術板でExcelのVBA以外の話は板違いになるからね
339デフォルトの名無しさん:2007/07/08(日) 11:08:17
すこしスレ違いだが、皆さん大丈夫?

ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070620/275328/
Excelレガシー問題
340デフォルトの名無しさん:2007/07/08(日) 12:02:44
SOXで大変なのは全体最適を考えてこなかった
その記事で言う情報システム部門の方なんじゃね?

未だ運用もはっきりしないのにあと半年少々でどうするんだろ。
341デフォルトの名無しさん:2007/07/08(日) 15:40:12
80以下なら赤
90以下なら黄色
100以下なら緑

といったようにセルに入力された値によって
背景色が変わるという列を作りたいのですが
どうすればいいのでしょうか?
342デフォルトの名無しさん:2007/07/08(日) 16:35:29
それをVBAでしたいの?
そうでなければスレ違い。条件付き書式ググれ。
343デフォルトの名無しさん:2007/07/08(日) 16:57:28
現在、Excelファイルが60,000ファイルほどあります。
その全ファイルから、一部分(一番上の5行ほど)だけ別のエクセルファイルにコピーするロジックを作りました。
ロジックの概要は以下の通りです。

処理の内容としては、すでに開いているブックから他のブックを開いて、必要な部分をコピー後にクローズさせています。

Set wb2 = Workbooks.Open(Filename:="aaa.xls")
Set ws2 = wb2.Worksheets("Sheet1")

      <処理>

ActiveWorkbook.Close saveChanges:=False

Set newbook = Nothing

上のロジックでコピーを行っていると、最初の1,000ファイルぐらいはサクサクオープン/クローズの処理が出来るのですが、
段々オープン/クローズの時間が遅くなってきて、最期は「xxx.xlsはファイルが読み取り専用か、読み取り専用フォルダにあります(略)」
と表示され、ファイルオープンが出来なくなります。

なお、エラーが出るファイルも、一回Excelを閉じると、正常に表示できるので、ファイルが壊れているわけではなさそうです。

この場合、問題の原因がVbaなのか、ハードウェアなのか、OSなのかよく分かりません。
もし何かご存じのことがありましたら、教えていただけませんでしょうか。

344デフォルトの名無しさん:2007/07/08(日) 19:15:00
問題の原因はおまえのプログラム
345デフォルトの名無しさん:2007/07/08(日) 21:04:23
>>343
お望みのことでなくて、恐縮ですけど、
60,000個のファイルから、それぞれ5行を別のエクセルファイルに
コピーしていくと、300,000行になりますよ。
エクセルって、65,536行までないですけど...
それに、何万行もあるファイルの操作は、それだけで、
処理がのろのろ...になるのは、避けようが無いと思ふ...

346デフォルトの名無しさん:2007/07/08(日) 21:41:41
大丈夫、今のExcelはもっと長い。

それはさておき、5行ずつ選択して選択範囲だけcsvで保存して、後でまとめてマージってのはどうだろう。
347デフォルトの名無しさん:2007/07/09(月) 00:32:33
>>344
その可能性が高いとは思うのですが、どうも納得できない部分もあります。
具体的な原因をお教えいただけますか?

>>345
私の説明が悪くて申し訳ないです。
実際には、5行分の内容を配列でまとめて、1行に流し込んでいます。
そのため、実際には1ファイル1行のサイズでコピーをしています。

ご指摘のあったとおり、確かに全てをコピーすると行が足りなくなる可能性が有ります。
私が欲しいデータは、全データ中の一番上と一番下の部分だけなので、
レスを頂いた後で、if文で一番上と一番下だけコピーするようにしたら、コピー行はほとんど無くなりました。

けれど、やはり1000ファイルを超えた当たりから、読み込みが遅くなり、
最期に読み込みエラーが出てきてしまいます。

>>346
おっしゃられるとおり、CSVにした方が良いのかも知れません。
とはいうものの、気になる問題が二つあります。

一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、
また、数千ファイルを読み込んだ時点でエラーが発生するかも知れないという不安です。
難易度はどれくらいでしょうか?
348デフォルトの名無しさん:2007/07/09(月) 01:23:02
>>347
ひとつのsheetにまとめるかわりにcsv形式でまとめる
openとwrite使えばOK
エラーの原因はリソースを食いつぶすからだろ
おそらくこれでだいぶリソースの使用が減ると思うが
全部処理できるかはわからない
349デフォルトの名無しさん:2007/07/09(月) 07:11:07
> 一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
知らなければ勉強すればいいだけ。生まれたときからこの世の全てを知ってる人間なんて居ない。

> もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、
問題ない。
以前約 6'140'000 個のcsvを扱ったことがある。(時間は掛かったけど、放置して置いたらエラーも出ずに無事完了)
キミが扱う 60,000 個程度ならなんてことないはず。
当然csvはExcelにブックとして開かせるんじゃなくて、348も言ってるように直接ファイルにアクセスすること。
それについても解らなければ勉強しよう。

難易度は「入門者→初心者」の移行レベルくらい
これが出来たら、VBA入門者(門を潜っただけ)ではなくVBA初心者(初歩的なことなら出来る)を名乗っても良い
350デフォルトの名無しさん:2007/07/09(月) 10:13:29
>>343
newbookは開放してるけど、wb2やws2は開放しないのか?
351デフォルトの名無しさん:2007/07/09(月) 19:34:56
Excel2003でユーザフォームをもちいて抽出フォームを作成しているのですが
コマンドボタンを押すと
配列(多次元)のデータをユーザフォーム上に表示させるには
どのパーツを使えばいいのでしょうか?
352デフォルトの名無しさん:2007/07/09(月) 20:59:27
>>351
Grid系
353デフォルトの名無しさん:2007/07/09(月) 21:42:18
>>352
Webで検索してもあまり情報が出てこないのですが
オススメな参考書とかありますか?
354デフォルトの名無しさん:2007/07/09(月) 22:01:16
>>351
listbox
355デフォルトの名無しさん:2007/07/09(月) 23:21:22
>>348
>>349

レスをありがとうございました。

今日、超巨大書店でVBAの辞典を買って来て、OPENとかCSV形式での保存方法を勉強しました。

おかげさまで、今バックグラウンドでエクセルファイルをCSVファイルに変換するマクロ流してます。
23:15の時点で5,000ファイルほど変換できました。
変換スピードはあまり落ちていないので、余計なリソースを食うアプリを立ち上げないようにしておけば、
何とか最期まで行けるかも知れないと思い始めました。

で、今気がついたんだけど、エクセルのファイル数が実は600,000ファイルだったw

ぶっ続けで処理を流しても4日位、電源OFFの時間を考えれば1週間位かかりそうです。
CSVファイルを読み込むのも出来ましたので、まだ問題はいくつか残ってますが、
何とか頑張れば出来そうな光明が見えてきました。

プライベートPC上でやっていると(今はホットゾヌ上から書いていますが)あちこちのアプリも重くなるので、
折を見て、変換&計算処理専用のマシンを購入した方が良いのかも知れないと思い始めました。


色々とヒントを下さって、ありがとうございました。
356デフォルトの名無しさん:2007/07/09(月) 23:45:14
VBAはvariant使わずにきちんと宣言するのとしないのでは実行時間がかなり違ってくるよね。
膨大な処理をするときは1ファイルあたりの処理時間をきちんと計ってコードを組むとかなり早くなったよ。
10倍ぐらいは変わった。
357デフォルトの名無しさん:2007/07/10(火) 01:06:57
Sub JoinTime()

Cells(2, 3) = Cells(2, 1) & Text(Cells(2, 2), "hh:mm:ss")

End Sub

これを実行すると、
「コンパイルエラー::Sub またはFunctionが定義されていません。」
とエラーが出てしまいます。
どう対処すればよろしいでしょうか?
358デフォルトの名無しさん:2007/07/10(火) 01:17:06
>>357
↓を付け足す
Function Text(a, b)
 Text = Format(a, b)
End Function
359デフォルトの名無しさん:2007/07/10(火) 01:25:40
>>358
できました。
すばやい、レスありがとうございました。
360デフォルトの名無しさん:2007/07/10(火) 01:34:50
超初心者の質問で申し訳ないです。。
VBAを使って、画面に表示された方向キー(↑↓←→)を押して、1分間にどれだけ成功できるか・・・
のような感じのゲームを作ることはできないものでしょうか?
頭の中でふと浮かんだのですが、プログラムを組もうとすると進めなくて困っています。
もしわかる方おりましたら、可能か不可能かだけでも結構ですので教えてくださいm(_ _)m
361デフォルトの名無しさん:2007/07/10(火) 01:42:30
362デフォルトの名無しさん:2007/07/10(火) 01:48:41
>>361
誘導ありがとうございます。
スレ違いでした。失礼しました。
363デフォルトの名無しさん:2007/07/10(火) 11:57:18
>>361
スレチだが、そこのCell雀の完成度の高さにびっくりした。
364デフォルトの名無しさん:2007/07/10(火) 22:35:57
ExcelとVBAでマインスイーパー作ったりできますか
365デフォルトの名無しさん:2007/07/10(火) 22:39:42
やる気と根気があればできるはず
がんばれ
366デフォルトの名無しさん:2007/07/10(火) 23:20:05
暇で作った事あるけど同等のゲームならすぐ出来るよ。
UIまでコピーしようと思うとそれなりに大変だろうけど。
367デフォルトの名無しさん:2007/07/11(水) 00:10:18
>>339
excelをそのまま基幹で使う会社
なぞ、どうぞ逝ってくれ
368デフォルトの名無しさん:2007/07/11(水) 18:47:02
medianをVBAで使ってたら特定の数列で無限ループしやがるorz
しかも同じ数列単体で検証しても問題なし
しょうがないからロジックくんだがこんな経験したことある人いる?
XPでも2003でも再現した
数列ったってこんなんだぞ。0, 0, 0.6, 0
369デフォルトの名無しさん:2007/07/11(水) 21:55:59
携帯から失礼します。 
VBAはユーザーフォームを勉強し始めたレベルなのですが 
Win32 API の存在を知り、エラー音とかに使ってみたくなりました。 
具体的にどのように記述すれば良いでしょう? 
ご教授いただけますか?

370デフォルトの名無しさん:2007/07/11(水) 22:31:45
>>369
スレ違いもここまで来るか…
http://pc11.2ch.net/test/read.cgi/tech/1181645965/

嫌味ではなくVBAを勉強し始めたレベルでは意味不明だと思われ。
ざっと教授するだけで数百ページの本になる。
371デフォルトの名無しさん:2007/07/11(水) 22:48:02
mciくらいならVBAでもすぐできるだろうに
372デフォルトの名無しさん:2007/07/11(水) 23:10:39
ハマりました〜どなたか助けてください〜(´Д`;)

開発環境:
Windows 2000, Excel 2000

要件:
ダイアログ(フォーム)を使い、フォルダ名で、または新しいファイル名で、
後に使うファイル保存先パスを取得、変数に格納しておきたい。

追加事項:
保存先を指定してパスを取得するだけで、その時点ではファイルを開かない。

そこで、DialogオブジェクトやFileDialogについて調べているのですが…
・今一般的で情報の多いApplication.FileDialogは、2000にはないっぽい。
・MSDNでは、Dialogオブジェクトについての説明が極端に少ないっぽい。
・xlOpenFileでは、実現できないっぽい。xl〜定数は使えたり使えなかったり。
等などで、どっぷりハマッてしまいました。

タスケテー
373デフォルトの名無しさん:2007/07/11(水) 23:28:36
>>372
ちょっと邪道だけどこんなのでどうかな?
動いたらBrowseForFolderのオプションは調べてくれ。

Dim Shell
Dim Ret

Set Shell = CreateObject("Shell.Application")
Set Ret = Shell.BrowseForFolder(0, "選ばないか", 0)

If Not Ret Is Nothing Then
Debug.Print Ret.Items.Item.Path
End If
374デフォルトの名無しさん:2007/07/12(木) 11:54:13
ごめん
範囲Aと範囲Bの重なっているセルの取得って
どうやるんだっけ?

プロパティかなんかであった気がしたんだけど
ヘルプ見てもみつからなかった(´・ω・`)
375デフォルトの名無しさん:2007/07/12(木) 13:22:36
>>374
Intersect(範囲A,範囲B)
376374:2007/07/12(木) 13:38:04
>>375
おぉありがとん(`・ω・´)
377デフォルトの名無しさん:2007/07/12(木) 22:58:16
>>373
遅ればせながらレスありがd(・∀・)
なんか、GetSaveAsFileNameっていうまんま直球どストレートな
メソッド発見しますた〜お騒がせしました〜
378デフォルトの名無しさん:2007/07/12(木) 23:35:57
Sub Bound()
ActiveSheet.UsedRange.Clear
Columns("A:AO").ColumnWidth = 2

n = 1
Range("A1").Select
Do While IsEmpty(ActiveCell.Offset(n, 0))
x = ActiveCell.Offset(n, 0).Row
If x < 2 Or 30 < x Then n = -n
For chien = 1 To 30
ActiveCell = ""
ActiveCell.Offset(n, 0) = "○"
Next chien
ActiveCell.Offset(n, 0).Activate
Loop
End Sub

上下運動を2回繰り返して止めるにはどうしたらよいでしょうか?
ご教授願います。
379デフォルトの名無しさん:2007/07/13(金) 00:11:06
exit do
380デフォルトの名無しさん:2007/07/13(金) 00:36:18
378です。
どういう風に入れたら良いでしょうか?
すみません、宜しくお願いいたします。
381デフォルトの名無しさん:2007/07/13(金) 02:19:26
>>378
なにげに試したら楽しくなってきたので俺も適当に作ってみた

'API
Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)

Const UpperBound As Long = 2 '1以下はエラー
Const LowerBound As Long = 30
Const SleepTime As Long = 50
Const ico As String = "○" 'バウンドさせる文字
Const Col As Long = 1 '列(この辺は定数にしない方が斜めとかいけるから指定しない方が良さげ)

Private Sub Down(ByVal Speed As Long)
Dim r As Long
For r = UpperBound To LowerBound
Cells(r - 1, Col) = ""
Cells(r, Col) = ico
DoEvents
Sleep SleepTime + Speed
Next
End Sub


Private Sub Up(ByVal Speed As Long)
Dim r As Long
For r = LowerBound To UpperBound Step -1
Cells(r + 1, 1) = ""
Cells(r, Col) = ico
DoEvents
Sleep SleepTime + Speed
Next
End Sub
382381の続き:2007/07/13(金) 02:33:11
Private Sub bound2()
Dim BoundCount As Long
For BoundCount = 1 To 10
Down -(BoundCount * 4)
'Downで表示されっばなのを削除
Cells(LowerBound, Col) = ""
Up -(BoundCount * 4)
'Downで表示されっばなのを削除
Cells(UpperBound, Col) = ""
Next
End Sub

updownの引数で加速と減速可能にっ!
この調子でいけばブロック崩しとかできんのかね?


で、378の質問に全く答えない俺w
なんてのは可愛そうなんで、
>>380
上下した時に「1回上下したとカウント」して
カウントが2になったらExit Doすればok
どこで1回上下したかを判断する場所は
自分でコード組んだならわかるっしょ?

383デフォルトの名無しさん:2007/07/13(金) 09:46:41
>>381さん・・・
>378です。

学校の課題で・・・
for nextを使用して動いたマス目で2回動いた事にしていたのですが、
それでは不十分と言う事で・・・(TT)

試行錯誤して早7日目・・・
どうしようもなく、皆様にお知恵を拝借しようとした次第です。

宜しければ教えて下さいませ。

384デフォルトの名無しさん:2007/07/13(金) 10:30:54
不十分の意味がわからない、どうしたいんだ
385デフォルトの名無しさん:2007/07/13(金) 11:28:40
>>383
>If x < 2 Or 30 < x Then n = -n
反転の判定をしている、ここで処理してもらいたかったんじゃないのか?
386384:2007/07/13(金) 14:36:56
俺は>>381じゃないが、そういうことならこれで
If x < 2 Or 30 < x Then n = -n: i = i + 1
If i > 3 Then Exit Do
387デフォルトの名無しさん:2007/07/13(金) 20:01:34
会社での昼休み、
ウイルスバスターが動いててすごく重いけど、
どうしても直したいマクロがあって、開いていじってた。

PCがフリーズした。

PCの電源を切って再起動したら、マクロもろともExcelファイルが破損してた。
「アプリケーションの回復」でも回復できない、深刻な破損との事。修復不可能。
こういう時に限ってバックアップとってない。
マクロもエクスポートしてない。
仕方ないので、いちから作り直した。

バックアップは、きちんと取りましょうという教訓でした…
388デフォルトの名無しさん:2007/07/13(金) 21:53:28
教訓というか初心者以外では常識だよね
というか、うちでは世代別バックアップを取るマクロをExcel起動と同時に自動で回しっぱなし
\backup\yyyy_mm_dd\FileName\[yyyy_mm_dd-hh_mm__ss]FileName.xls
にバックアップが自動保存され、前日以前の物があれば日付単位で個別圧縮(cab)して
退避ディレクトリにコピー、更に1週間以上前の物は退避ディレクトリの書庫は残して
バックアップディレクトリのファイルは削除
ここまでは自動で、退避ディレクトリの書庫を定期的にメディアに焼くのだけは手動

まあメディアに焼いたところで、トラブル時もHDD上の1週間分だけで復旧は事足りることがほとんどだけどね
389デフォルトの名無しさん:2007/07/13(金) 21:55:37
FolderShareをつかって他のパソコンと同期させておくだけでも最低限のバックアップにはなると思う。
390デフォルトの名無しさん:2007/07/13(金) 22:24:26
俺はソフトで差分バックアップしてる
重要なデータExcelだけじゃないし楽だし早い
391デフォルトの名無しさん:2007/07/13(金) 23:27:17
>>381さん
>>386さん

>378です。

ご教授頂き有難うございます。
>>386さんのを使用して出させて頂きました。

有難うございました!
392デフォルトの名無しさん:2007/07/14(土) 09:54:31
>>390
外部からだと作業の途中経過のバックアップは取れないからな
問題が起きたときに前回保存時まで戻されるのは勘弁してほしいってデータは
外部の汎用バックアップソフトではなく、内部のマクロで途中経過のバックアップを取った方がいい
393デフォルトの名無しさん:2007/07/14(土) 12:56:32
バックアップとは言え、マクロ動かしっぱなしにしてたらメモリ食わない?
394デフォルトの名無しさん:2007/07/14(土) 13:32:56
>>392
俺の使ってるソフト、圧縮機能はない
http://www.forest.impress.co.jp/lib/sys/file/syncbackup/bunbackup.html
開いているファイルでもバックアップできるし作業途中で保存していればその分更新される
Officeのように自動保存機能があるソフトならより万全
途中経過が保存される前にPC固まったら駄目だけど、そのマクロも同じだろ?
395デフォルトの名無しさん:2007/07/14(土) 18:04:44
>>393
当然食うよ
搭載メモリ量の10000分の1以下だから気にならないけどね


>>394
マクロの場合
> 作業途中で保存していれば
なんて条件は付かない
保存もマクロでやるからね
Officeの自動保存機能はバグあるし
396デフォルトの名無しさん:2007/07/15(日) 10:15:02
VBA画面だとスクロールボタンが使えなくて不便だな。
ぐぐったら「Intelipoint 4.1を入れると直る」と出てきたけど、
うちのMicrosoftマウスはこのバージョンに対応してないしな。
397デフォルトの名無しさん:2007/07/16(月) 12:01:06
Excel2000のVBAプログラミングでウィザード形式のユーザーフォームって
つくれますか? StarSuiteのBasicにはその仕様があるのですが、
VBAに関してはググってもなかなか直に解説してあるページがみつからなくて。

現在、同じサイズのユーザーフォームをいくつか用意してそれを順番に表示させる
ことで「ウィザードもどき」にしているんですが・・・・
398デフォルトの名無しさん:2007/07/16(月) 20:33:23
>>397
コンテナになるコントロール使えば良いだけの話
これで解らなければあとはVBAではなくVBの分野なので
そっちの方向で勉強してね
399デフォルトの名無しさん:2007/07/17(火) 00:11:19
>>398
どうも有難うございます。調べてみます。
400デフォルトの名無しさん:2007/07/17(火) 10:11:14
学校の課題で、セルA1〜A10 にそれぞれ10,20,30……100と表示し、その和をB1に表示するプログラムを作成せよ。
という課題が出て、試行錯誤してたのですが、詰まってしまいました。
ヒントとして、↓が出ていて、その通りにやったつもりなのですが、セルA1〜A10にはゼロしか出てこなくてorz

1.次元数10の配列を宣言し、Forループを利用して数値(10~100)を作成する。
2.Forループを利用して和を計算する
3.Forループを利用して数値(10〜100)を表示する。
4.和を表示する。

↓がいま現在のプログラムです。

Sub 課題1()
Const N = 10
Dim A(N)

For T = 1 To 10
A(N) = A(T) * 10
Next T

S = 0
For j = 1 To N
S = S + A(j)
Next j

For C = 1 To 10
Cells(C, 1) = A(N)
Next

End Sub

どなたかご教授願います。
401A(T) * 10じゃなくてT * 10:2007/07/17(火) 10:40:03
>>400
それのどこがVBAの質問なのかと。basicの基本以下のレベルジャマイカ。
402デフォルトの名無しさん:2007/07/17(火) 11:21:45
>>400
debug.printから出直せ。その方が君の為だ。
>>400
ループ制御変数と個数の定数が混在しているぞ。
404デフォルトの名無しさん:2007/07/17(火) 14:52:21
最近の学校の課題はエクセルVBAをやらせるのか…。
>セルA1〜A10にはゼロしか出てこなくてorz
 ↑当たり前だ。403の名前欄を参照。
>Cells(C, 1) = A(N)
 ↑全部のセルに同じ値が出るに決まってるだろ。

まさかプログラマを目指してるとか言わないよな?
405400:2007/07/17(火) 18:14:05
400です。皆さんのレスを参考に17:00から試行錯誤し直してやっと完成したので報告します。
下のプログラムで表示させることができました。本当、ありがとうございました。

Sub 課題1()
Const N = 10
Dim A(N)

For T = 1 To 10
A(T) = T * 10
Next T

S = 0

For j = 1 To N
S = S + A(j)
Cells(j, 1) = A(j)
Next j

S = 0
For c = 1 To N
S = S + A(c)
Cells(1, 2) = S
Next c

End Sub
406デフォルトの名無しさん:2007/07/17(火) 18:19:26
Dim a(10)
For i = 1 To 10
a(i - 1) = i * 10
Next
s = a(0)
For i = 2 To 10
s = a(i - 1) + s
Next
For i = 1 To 10
Range("A" & CStr(i)) = a(i - 1)
Next
Range("B1").Value = s

407デフォルトの名無しさん:2007/07/18(水) 09:54:41
>>405
どう見てもこの後ループを纏めることになるので、先回りしておけ。
408デフォルトの名無しさん:2007/07/18(水) 13:21:11
開いていないファイルのセルデータをVBAで直接取得する方法ってありますか?

現状はセルに式を入力してから変数に代入、セルを削除
または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
409デフォルトの名無しさん:2007/07/18(水) 13:27:58
バイナリ解析して直接描くならひらかずにどうぞ
410デフォルトの名無しさん:2007/07/18(水) 13:44:57
>>408
そのファイルがCSVならそれほど難しくないでしょう。
411408:2007/07/18(水) 14:12:48
>>409
難しくて私には分かりません

>>410
ファイルはCSVではなくEXCELブック形式です

ファイルを開けば
A = Workbooks(ファイル名).Sheets(シート名).Range(範囲)
で取得できるのでどこかを少し弄ればどうにかなるのかなと思ったんですけど・・・
412デフォルトの名無しさん:2007/07/18(水) 14:21:39
内部的に開いていいなら(表示はしない)簡単だけど、全く開かずとなると無理っす
バイナリ解析するにも先ずはファイルをOpenしないと始まらないし
413デフォルトの名無しさん:2007/07/18(水) 16:03:15
>>412
どうやら無理そうですね

開かずに済むセルに入力して・・・ の方法で処理しようと思います
ありがとうございました
414デフォルトの名無しさん:2007/07/18(水) 18:48:05
>>408
VBAじゃないけど参照で良ければ。
='c:\Documents and Settings\hoge\My Documents\[book1.xls]Sheet1'!a1
とか
415デフォルトの名無しさん:2007/07/18(水) 20:21:15
>>413
VBA以前のExcel4マクロ(だっけ)なら簡単にできるはず。
Excelの関数と同じくVBAから使用することも可能
ヘルプは英語版ならMSから無料で落とせる。
416デフォルトの名無しさん:2007/07/18(水) 20:29:52
とりあえずサンプル見つけたので>Excel4マクロ

Cells(1, 1) = Application.ExecuteExcel4Macro("'C:\My Documents\[Book2.xls]Sheet1'!R1C1")

ttp://oshiete1.goo.ne.jp/qa373903.html
417デフォルトの名無しさん:2007/07/18(水) 21:21:50
そのExecuteExcel4Macro使う方法が>>412も言ってる
> 内部的に開いていいなら(表示はしない)簡単だけど
の方法でしょ。でも、これだって開いてないわけではないので、この方法では嫌なんだとさ。
内部的に開いて良いなら他にもいくつか方法はあるんだけどね。

因みにExecuteExcel4Macroを使ってセルの値を取得する方法は
かなり有名で解説サイトはいっぱいあるから英語版ヘルプなんて必要無いが
空セルを取得すると空文字やEmpty値ではなく0が返ってくるという不都合がある。
つまり、数値の0が入ってるセルと何も入ってないセルを区別出来ない。
418デフォルトの名無しさん:2007/07/18(水) 22:05:36
皆さん、MSOfficeのスキル高そうですけど、関係する資格などはお持ちですか?

私の勤める会社は、持っている資格を全て棚卸して一覧にまとめよ、なんて御触れが出ました。

ひけらかしたい奴は全部書くし、変なプロジェクトに引っ張られたくない人は応分に隠し、
こんなに資格もってんならウチにいなくてもなんとかなるだろう、とリストラの対象になりたくない人は適当に描いていました。

スキルを保有するのはいいが、ヘタに見せると悪影響があるなんて、初めて知った2007年の夏でした。
419デフォルトの名無しさん:2007/07/18(水) 22:11:08
>>417
> この方法では嫌なんだとさ。

たぶん内部的に開くの意味よくわかってないだけだと思うが

>または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
これが嫌なんだろう
420デフォルトの名無しさん:2007/07/19(木) 00:00:30
VBAで配列の宣言時に初期化ってできないのですか?
下のようにできると聞いたのですが、実際やってみると「=」が駄目なのか
コンパイルエラーになってしまいます。

Dim Moji() As String = {"ABC", "DEF", "GHI"}
421デフォルトの名無しさん:2007/07/19(木) 00:37:15
VBならできるけどVBAは駄目です
422デフォルトの名無しさん:2007/07/19(木) 11:03:09
そんなことはない
423デフォルトの名無しさん:2007/07/19(木) 11:06:18
正確にはVBの2002以降ね
VBでもVB6では出来ないし、当然VB6準拠のVBAでも出来ない

VB6で出来ることはコントロールと特殊なオブジェクト絡み以外ほとんどVBAでも出来るから問題ないが
VB2002で大きく変わったので、VB2002以降用の解説読んでそれをVB6やVBAでやろうとして
出来なくて混乱しちゃう奴って結構居るみたいだね
424デフォルトの名無しさん:2007/07/19(木) 11:13:42
Dim Moji() As Array("ABC", "DEF", "GHI")
425デフォルトの名無しさん[:2007/07/19(木) 21:44:55
VB6でもArray使えば、配列の初期化できるのか。でも、多次元は無理なのかな
426デフォルトの名無しさん:2007/07/19(木) 22:25:34
VBAでSub プロシージャでは値渡しも参照渡しもできるのですが
Func プロシージャでは値渡ししかできません。参照渡しのやり方ってどうやるのでしょうか。
427デフォルトの名無しさん:2007/07/19(木) 23:29:02
ByVal?
428デフォルトの名無しさん:2007/07/19(木) 23:29:40
ごめんちがた
429デフォルトの名無しさん:2007/07/20(金) 00:00:33
>>426
普通にできるだろ
430426:2007/07/20(金) 00:25:26
↓こんな感じの作ってやってみたけど、表示されるのは"A"
ちなみにFunction→Subに変えたらちゃんと"B"が表示されます。
使い方がまずいのでしょうか?

Sub test()
Dim tmp As String
tmp = "A"
func1 (tmp)
MsgBox tmp
End Sub

Function func1(ByRef tmp As String)
tmp = "B"
End Function
431デフォルトの名無しさん:2007/07/20(金) 00:31:45
Sub test()
Dim tmp As String
tmp = "A"
c=func1(tmp)
MsgBox tmp
End Sub

Function func1(ByRef tmp As String)
tmp = "B"
End Function


432426:2007/07/20(金) 00:45:38
>431氏の通りにしたらできました。
式にしないと駄目ということなんですかね。
433デフォルトの名無しさん:2007/07/20(金) 00:46:22
func1 tmp
434429:2007/07/20(金) 00:47:32
>>430

  136 デフォルトの名無しさん  mail:sage  2007/02/02(金) 00:10:24

> VBAは自分で作った関数を使う際、
> 引数にかっこをつけてはいかんのです。
ハズレ

自作関数の場合ではなく、基本的にSub、Functionプロシージャ(メソッド)を呼ぶ場合、
戻り値を取る場合とCallで呼ぶ場合以外は()を付けない。MsgBox関数の場合だとこんな感じで使う。
[1] MsgBox "test", vbOkOnly
[2] Call MsgBox("test", vbOkOnly)
[3] ret = MsgBox("test", vbOKCancel)

自作関数の場合でも戻り値を取る場合とCallで呼ぶ場合は()付けなきゃダメだし
自作関数じゃなくても、[1]のように使うときは()付けてはいかんのです。
ややこしいのは、引数一つの関数の場合。
[4] Inc hoge
[5] Inc (hoge)
Sub Inc(Value As Long)
  Value = Value + 1
End Sub
[4]の方だと変数hogeが+1され、[5]の方だと変化しない。
引数一つの関数をCallを省略し引数に()を付けて呼ぶと、引数は値渡しになる。
基本的に参照渡し値渡しは呼び出される側で指定するので、[5]は殆ど使われない。
意味も知らずに間違って使ってる奴は居そうだけどな。。
435デフォルトの名無しさん:2007/07/20(金) 01:12:19
回答ありがとうございます。
VB独特の仕様なんで覚えるしかないみたいですね。
また間違えそう・・・

436デフォルトの名無しさん:2007/07/20(金) 01:20:28
func(tmp)
func (tmp)
とは違うだろ
下はc=func((tmp))
のようなもの
上のような書き方は存在しない
437デフォルトの名無しさん:2007/07/20(金) 02:51:18
>>430
引数に何もしなければ参照渡し
()でくくると値渡し

Sub test()
Dim tmp As String
tmp = "A"
func1 tmp
MsgBox tmp
End Sub

Function func1(tmp As String)
tmp = "B"
End Function
438デフォルトの名無しさん:2007/07/20(金) 06:55:09
つまり、外せる括弧は外せと言うことだな。
439デフォルトの名無しさん:2007/07/20(金) 17:44:58
func1 -tmp
としたら誰もtmpで値が受け取れるとは思わないだろ
同じことだよ
440デフォルトの名無しさん:2007/07/21(土) 18:13:02
つまり、外せる演算子は外せと言うことだな。
441デフォルトの名無しさん:2007/07/22(日) 01:49:28
エクセルの処理を一瞬だけ止める命令ってどんなのがありますか?
調べたところ、waitを使って、現在時間を調べてそこから1秒待ちをする、などは分ったのですが、
私がやりたいのは、コンマ1秒だけ処理を止めるというものをやりたいんです。

ですが、いまいちコンマ何秒だけ処理を一時停止させるという方法が分かりません。
初歩的な質問で申し訳ないのですが、教えていただけないでしょうか。
442デフォルトの名無しさん:2007/07/22(日) 02:44:42
>>441
Win32APIのSleep使えばいいだけだよ
_秒指定なので、コンマ1秒なら100_秒指定で
443441:2007/07/22(日) 07:24:57
解決しました。ありがとうございます。
444デフォルトの名無しさん:2007/07/22(日) 12:21:00
444
445初心者☆:2007/07/22(日) 16:04:23
DataAdd関数のところで
「コンパイルエラー:
SubまたはFunctionが定義されておりません」
と出るのですが、なぜエラーになるのかがわかりません。
わかる方おしえてください。
ちなみに、
DataAdd("d", data_length, Now)
みたいなカンジで使ってます。
446デフォルトの名無しさん:2007/07/22(日) 16:50:00
そんな関数あるのか?
447デフォルトの名無しさん:2007/07/22(日) 16:56:25
>>445
クリティカルで答えを言ってやる。おまいさんが参考している本が分かった

DataAdd ×
DateAdd ○

こういうこった
448デフォルトの名無しさん:2007/07/22(日) 17:10:15
教えて下さい。

10品目 月の入荷から各個人に日々の払い出しを行い。
入荷数から払い出しを引いた在庫数がわかるようなマクロはどうすればいいでしょうか?
シートを分けたいです。
449デフォルトの名無しさん:2007/07/22(日) 19:24:12
エスパーじゃない普通の人間に判るように書け。
450デフォルトの名無しさん:2007/07/23(月) 14:55:39
VLOOKUPで検索して参照している値を変更したいのですが
どうやったらいいのでしょう?

-------------
1  AAA
2  BBB
3  CCC
4  DDD
-------------

3  CCC

3って入力すると右にCCCって出てくる
そのCCCをXXXって変えると元のデータのが

1  AAA
2  BBB
3  XXX
4  DDD

ってなるようにしたいです。VBA使わないと出来ないですかね?
なるべくExcel関数だけで作りたいのですが・・・
451デフォルトの名無しさん:2007/07/23(月) 19:12:45
>>450
ここはVBAでやりたい人の為のスレだよ
まあExcelの本スレにも書かれている通り、関数では値の書き換えは出来ないので
どっちにしろVBAでやるしかないけどね
452デフォルトの名無しさん:2007/07/23(月) 20:51:08
このスレ初めて見つけたときエクセルとVBAの質問スレだと思った。
スレタイいじったほうがいいんじゃないスかね
453デフォルトの名無しさん:2007/07/23(月) 20:58:14
板見りゃわかるっちゃわかるけど、スレタイだけ見るとそうだね。
454デフォルトの名無しさん:2007/07/23(月) 21:53:41
まあExcelでプログラム技術系の話と言ったらVBAしか無いもんな
455デフォルトの名無しさん[:2007/07/23(月) 22:05:50
バイナリファイルを作るマクロ作成したんですが
常に新規作成で作ることできますか?
Open "ファイル名" For Binary As #1
↑こんな感じで最初やってみたんですが、新規ファイルがある場合でも
単純に頭から上書きするみたいで困っています。
456デフォルトの名無しさん:2007/07/23(月) 22:49:33
kill
457デフォルトの名無しさん:2007/07/23(月) 23:12:51
>>454
いやいやExcelとプログラムを絡めるだけなら、
オートメーションで他言語から操作するなんてこともあるぞ。

まあその言語特有の事情を除けば、VBAでやるのと何も変わらないが。
458デフォルトの名無しさん:2007/07/23(月) 23:36:53
UserFormのUserForm_Initializeで変数と画面の
初期化をしていますが、ここのロジックを通ってUseeFormが
表示されたあと、画面をUnload Meしてブックを保存して閉じると、次回起動時に

「問題が発生したため、Microsoft Office Excelを終了します。
ご不便をおかけして申し訳ありません。」
と出て、強制終了してしまいます。

ただし、次の場合はエラーが出ずに起動できます。
・保存せずに閉じた場合。
・マクロを無効にして起動し、保存した場合(orしない場合)
・VBEを表示させて実行した場合。

デバッグしたらエラーにならず実行されるので、原因がつかめず困っています。

いろいろ手探りでやってみたところ、2回目の起動の時、
UseeFormにあるコントロールにアクセスすると落ちてしまうようです。
例えば、、
 UserForm.lb_KUBUN.Caption = "" とか、
 cb_Save.Enabled = True といった感じです。

UseeFormには200近いラベルがあります。
あとは22のフレームと、14のコマンドボタン、リストボックスとコンボボックスが1つずつで、
テキストボックスはありません。ブックの大きさは1Mくらいです。
Office Updateは最新状態にしてます。

最初は起動できるので、実行後の保存の時になんか悪いもんが残ったりしてるのかなぁという感じです。

みなさま、お心当たりあればどうぞご教示ください。
459デフォルトの名無しさん:2007/07/23(月) 23:53:34
そのフォームをいい時と悪いときでエクスポートして比べてみたらいいんじゃ
460458:2007/07/24(火) 00:24:55
エクスポートして比べてみたけど、同じでした。。
461デフォルトの名無しさん:2007/07/24(火) 07:16:30
最小限の再現出来るソースを出せ
462デフォルトの名無しさん:2007/07/25(水) 23:45:28
検索をするプログラムをもっと簡潔にしたいのですが。
いま2次元配列NK_ryuu(1 To 50, 1 To 15)で
NK_ryuu(x.1)にID
NK_ryuu(x.2)に項目A
NK_ryuu(x.3)に項目B
NK_ryuu(x.4)に項目C
と入っていてxは1から50まであります。
ここであるシートの中から項目ABC全部を持っている行を抜き出すのですが、
今は下のようになっていてforとifを2重3重に使っていてちょっと見た目が汚いです。
しかも項目やxが増えた場合に処理がものすごい勢いで重くなりそうです。
もうちょっと賢いやり方ありませんでしょうか?お願いします。
配列honban()に取得した行番号を格納しています。

463462続き:2007/07/25(水) 23:46:08
Sub test()
With ActiveSheet
For x = 1 To 50
For i = 1 To 500
If .Cells(i, 2).Value = NK_ryuu(x, 2) Then
If .Cells(i, 3).Value = NK_ryuu(x, 3) Then
If .Cells(i, 4).Value = NK_ryuu(x, 4) Then
honban(j) = i
End If
End If
End If
Next i
Next x
End With
End Sub
464デフォルトの名無しさん:2007/07/26(木) 08:24:32
すいません、質問をさせてください。
VBAではなく普通の関数なんですが、
3人の1ヶ月の勤務表があるとします。
   A   B   C   D   E
1     Yさん Mさん Aさん 
2  1日   0   2   休 
3  2日   0   休   休 
:  :
31 30日   休   0   1 
とした時、(勤務表の数字は出勤時間を意味しており、0が朝、1が昼、2が夕方から出勤)
E列にその日の出勤が1人の場合のみ名前を出力するようにしたい場合、
現在は=IF(COUNT(B2:D2)=1,INDEX($B$1:$D$1,1,MATCH(0,B2:D2,0)),"")
と入力しておりますが、
これを一つの関数で行うことはできるのでしょうか?
VLookupの場合テーブルでないとエラーがでるので、
あれば教えていただけないでしょうか。

よろしくお願い致します。
465464:2007/07/26(木) 08:31:02
追記です。
出勤する人が1人の場合は、
必ず勤務は朝からになります。(勤務表には0が入ります。)
466デフォルトの名無しさん:2007/07/26(木) 12:16:14
>>465
>464では何故いけないの?
つーか、「1や2が存在しない」ことと「0の人の名前を得る」ことの
両方を同時に満足するような関数なんてあるわけないじゃん。
467デフォルトの名無しさん:2007/07/27(金) 01:13:41
VBAはいつまで存続するんでしょ
468デフォルトの名無しさん:2007/07/27(金) 01:39:11
>>467
キミが痴呆になるまで
469デフォルトの名無しさん:2007/07/28(土) 10:08:25
エクセルで、
テキストファイルの印刷
を実行する方法を
教えてくれませんか?
pdfと同じようにシェルでやろうとしたらダメでしたorz
470デフォルトの名無しさん:2007/07/28(土) 19:38:44
Private Sub CommandButton1_Click()
For i = 1 To 48
If Cells(1, 1) = Cells(i, 4) Then Cells(1, 2) = Cells(i, 5)
If Cells(3, 1) = Cells(i, 4) Then Cells(3, 2) = Cells(i, 5)
If Cells(5, 1) = Cells(i, 4) Then Cells(5, 2) = Cells(i, 5)
If Cells(7, 1) = Cells(i, 4) Then Cells(7, 2) = Cells(i, 5)
If Cells(9, 1) = Cells(i, 4) Then Cells(9, 2) = Cells(i, 5)
If Cells(11, 1) = Cells(i, 4) Then Cells(11, 2) = Cells(i, 5)
If Cells(13, 1) = Cells(i, 4) Then Cells(13, 2) = Cells(i, 5)
If Cells(15, 1) = Cells(i, 4) Then Cells(15, 2) = Cells(i, 5)
If Cells(17, 1) = Cells(i, 4) Then Cells(17, 2) = Cells(i, 5)
If Cells(19, 1) = Cells(i, 4) Then Cells(19, 2) = Cells(i, 5)
If Cells(21, 1) = Cells(i, 4) Then Cells(21, 2) = Cells(i, 5)
If Cells(23, 1) = Cells(i, 4) Then Cells(23, 2) = Cells(i, 5)

Next
End Sub


セルの値があらかじめ用意しているリストのと一致すると、
特定の文字を入力しようと こういうのを作りました
で、うまくいったのですが、
これだとそれぞれ1つのセルにしか記入できません。
たとえば1列目で、Cells(1, 3)にも何か書きたい場合はどうしたらよいでしょうか?
質問の意味が分かりづらかったらスマソ
471デフォルトの名無しさん:2007/07/28(土) 19:48:59
For i=1 To 48
For m=1 To 12
j=2*m-1
If Cells(j,1)=Cells(i,4) Then Cells(j,2)=Cells(i,5):Cells(j,3)="何か"
Next
Next
472デフォルトの名無しさん:2007/07/28(土) 19:53:23
>>471
速攻レスありがとうございます。
今仕事中でこっそり送信してるんで、時間ができたらやってみたいと思います。
473デフォルトの名無しさん:2007/07/28(土) 20:18:42
記法とかオブジェクトの基本的な質問がちょくちょく出てくるのを見るに
VBAからプログラミングに入った人はある程度理解出来てきたなと思う頃
初心に返ってヘルプを一通り眺めてみるのが良さそうだね。

ランゲージリファレンスのメソッド・キーワードあたりの意味が一通りわかった時とか、
ウォッチウィンドウの使い方を理解した時涙出そうになったのを思い出した。

チラ裏スマソ。
474デフォルトの名無しさん:2007/07/28(土) 20:25:55
>>471

For m = 1 To 12
j = 2 * m - 1



For j = 1 To 23 Step 2
475デフォルトの名無しさん:2007/07/28(土) 21:10:24
470ですが
>>471 >>474氏 サンクス
今やって見たら解決しました。
:(コロン)を使うというのを初めて知りました。

特に仕事でVBAが必要というわけではないので、1年に一回くらいしか使わないのですが
たまに使うと初歩的なことも忘れてしまいます。

ちなみに競馬のデータ分析に使いましたw
1万レース近くあるのでVBAというかマクロというか分からんけど役に立ちます。
476デフォルトの名無しさん:2007/07/29(日) 00:26:53
>>473
割と共感した
477デフォルトの名無しさん:2007/07/29(日) 23:01:37 0
0〜11までの数字をランダムに、かつかぶらないように代入したいんですが
以下のコードだと数字が代入されない場合があるんです。何が原因なんでしょう・・
__________________
n1k = Int(Rnd * 12)
Do
n2 = Int(Rnd * 12)
Select Case n2
Case n1k
Case Else
n2k = n2
End Select
Loop Until n2k = n2
Do
n3 = Int(Rnd * 12)
Select Case n3
Case n1k
Case n2k
Case Else
n3k = n3
End Select
Loop Until n3k = n3
478デフォルトの名無しさん:2007/07/29(日) 23:09:29 0
書ききれないので・・実際はn8kまであります。
479デフォルトの名無しさん:2007/07/29(日) 23:29:12 0
Empty = 0がTrueになるから。
その冗長的なコーディングにはやむを得ない事情があるの?

あと抜粋でもせめて宣言部は書こうよ。
480デフォルトの名無しさん:2007/07/29(日) 23:37:30 0
n*kが数値型変数やVariant型変数の場合
Int(Rnd * 12)の結果が0ならCase Elseでの代入を行わなくても「n*k = n*」がTrueになるからでは?

そういうのは配列に順に数値を代入してからランダムソートするといいよ
というか、そうするのが普通だろ
481デフォルトの名無しさん:2007/07/29(日) 23:51:51 0
{0,1,2,3,4,5,6,7,8,9,10,11}
{0,1,2,3,4,5,7,8,9,10,11}
{0,2,3,4,5,7,8,9,10,11}
{0,2,3,4,5,7,8,9,11}
こういうイメージで配列を操作せよ
482デフォルトの名無しさん:2007/07/29(日) 23:51:52 0
>>480

>>477に便乗で悪いんだけど、

0〜11までの数字をランダムに、かつかぶらないように代入したい

て時に俺は

Dim RndNum As Long
Dim NumCnt As Integer
'抜き出す数字の個数
NumCnt = 3
Set Dic = CreateObject("Scripting.Dictionary")
RndNum = Int(Rnd * 12)
Dic.Add RndNum, RndNum

Do While Dic.Count < NumCnt
RndNum = Int(Rnd * 12)
If Not Dic.Exists(RndNum) Then
Dic.Add RndNum, RndNum
End If
Loop

みたいなやりかたするんだけどダメ?
483デフォルトの名無しさん:2007/07/30(月) 00:40:48
ダメではないけどDictionaryなんて使う必要ない
484482:2007/07/30(月) 01:43:37
>>483
そか。
ちとランダムソートについて調べてみるよ

レスさんくす
485デフォルトの名無しさん:2007/07/30(月) 02:31:58
全然詳しくないので質問させてください。
いつも仕事中にWebばかり見てる派遣クンが
「VBAがプログラムどおりに動かない原因を調べるのは僕の仕事ではありません。」
と言っています。
彼のVBAプログラムが動かないのを調べるのは誰の仕事でしょうか?
486デフォルトの名無しさん:2007/07/30(月) 02:39:18
プログラムが失敗作と確定してるのだったら
そういうやつは辞めてもらえ
487デフォルトの名無しさん:2007/07/30(月) 03:17:02
>>485
契約内容に因る
派遣ではなく業務請負なら間違いなくそれも彼の仕事のうちだけどね

一般的にはその派遣クンが悪いように見る人が多いかも知れないけど
契約内容によっては正しいことを言ってるかも知れない
それとこの質問において「Webばかり見てる」なんて情報は全く持って不要
彼の印象をなるべく悪くしようとしているようで浅ましい限りだ
488デフォルトの名無しさん:2007/07/30(月) 10:34:02
vba おすすめ参考書は?
489デフォルトの名無しさん:2007/07/30(月) 19:54:34
参考書とは言えないかもしれんが 「Excel VBA 実用サンプルコレクション」
異常にオブジェクト偏重なサンプル集だけどこの考え方は持っておくべきだと思う。
完全な入門ならちょっと敷居が高すぎるだろうけどね。

>>485って日本語の問題?動く物を作れで終了なんじゃw
490デフォルトの名無しさん:2007/07/30(月) 19:59:21
セル範囲を画像化して保存する方法はありますでしょうか?
491デフォルトの名無しさん:2007/07/30(月) 20:29:53
あるよ
492デフォルトの名無しさん:2007/07/30(月) 22:57:49
素人な聞き方でスマソ
たとえば、
セルD1に「=A1&B1&C1」と入力したら「あいう」と表示されるとします。
(A1, B1, C1 にそれぞれ、あ、い、う が入っている)
セルD1 をセルD2に、paste spacial → values(*英語エクセルです)で
コピペしたら、セルD2には「あいう」というテキストが入ります。
このpaste spacial → values の作業を省略できるような関数があったら教えてください。
例えば、A1の値を「わ」に変えるだけで、自動的に 「わいう」というテキストの入ったセルを
ゲットできるようにしたいのです。
493デフォルトの名無しさん:2007/07/30(月) 23:07:07
質問させてください。

UserForm上にComboBoxを配置して
Initializeで初期値とRowsourseによってリストを与えるようにしています。

ComboBoxのリストを開くと最初は一番上のリストの値から順に表示され、
一度リストから値を選択してComboBoxに入れ、
再度リストを開くとその値があらかじめ選択されており、
その値の前後が表示されるようになってます。
( 1 〜12月がリストにあり、5月を選び再度リストを開くと 5月が選択された状態で
リストをスクロールせずとも 3〜 7月の値が選択可能な範囲にある
 ような状態です。)

最初からComboBoxの初期値の付近のリストを表示させるようにしたいのですが、
方法はありますでしょうか?

説明が不十分で分かりにくいかと思いますが、宜しくお願いします。
494492:2007/07/30(月) 23:19:05
自己解決しそうです。
PASTE.SPECIAL 関数っていうのがあるみたいですね。
でも手元にある 2003 のエクセルにはないみたいですが・・・
調べてみます。
495492:2007/07/30(月) 23:27:31
やっぱり分からなかった。
たぶんマクロでやるんですかね。素人レベルには難しいことならば諦めます。
496デフォルトの名無しさん:2007/07/30(月) 23:28:20
Private Sub UserForm_Initialize()
ComboBox1.Value = "5月"
End Sub
497デフォルトの名無しさん:2007/07/30(月) 23:30:30
>>496
ただ単にValueで値を持たせてもできないのですが・・
498デフォルトの名無しさん:2007/07/30(月) 23:31:24
>>492
d2に=d1じゃだめなん?
499デフォルトの名無しさん:2007/07/30(月) 23:34:48
>>497
五月になってない?
500デフォルトの名無しさん:2007/07/30(月) 23:43:09
>>499
正確には1〜12の値のみで初期値に5を入れて
ComboBoxの値は5になっている状態でリストを見ても
1(リストの一番上の値)から5くらいまでが表示された状態になってます。

要は値は入っていてもリスト上は何も選択されていない状態です
501デフォルトの名無しさん:2007/07/30(月) 23:45:30
>>500
それは値は入っていても値は入っていない状態だからお手上げだな
502デフォルトの名無しさん:2007/07/30(月) 23:55:44
>>501
お手上げですか

なにか手はないものでしょうか・・
503デフォルトの名無しさん:2007/07/31(火) 00:03:14
>>498
はい。
家計簿を作ってるんですが、
1〜12月までの費目別合計の推移を DSUM 関数で出しています。
=DSUM('1'!A:H,'1'!F1,分類!A1:A2) ←1月
=DSUM('2'!A:H,'2'!F1,分類!A1:A2) ←2月
=DSUM('3'!A:H,'3'!F1,分類!A1:A2) ←3月
(以下12月までつづく)

>>492 の例に当てはめると、セルD1に
=DSUM('1'!A:H,'1'!F1,分類!A1:A2)
と表示されています。
この数式を使えるようにするために、paste spacial → values の作業をしています。
「A1:A2」の部分だけを何度も変更できるように、
セルD1は複数のセルを&でつないでおり、「A1:A2」の位置には特定のセルを指定し、
そのセルに好きなセル範囲を書くだけでいいようにしています。
504デフォルトの名無しさん:2007/07/31(火) 00:16:55
>>502

Private Sub UserForm_Activate()
Me.ComboBox1.DropDown
Me.ComboBox1.Value = 5
End Sub

こうゆうこと?
505503:2007/07/31(火) 00:51:56
当初考えていたやり方じゃないけど解決しました。
有難う御座いました。
506デフォルトの名無しさん:2007/08/01(水) 13:38:16
Excelからメールを送ろうとCDOで組んだのですが宛先があっていれば普通に送れるのですが、アドレスが間違っていて存在しないアドレスに送っていてもエラーが帰ってきません。

このエラーを得る方法はありますか?
507デフォルトの名無しさん:2007/08/01(水) 18:43:08
あります
でもExcelの話じゃないので、ここでは聞かないでね
508デフォルトの名無しさん:2007/08/01(水) 19:06:24
CSVをADOの「Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=〜」で扱うのは
office2000以上だと標準で利用できますか?
参照設定の設定も不要でいいんでしょうか?
509デフォルトの名無しさん:2007/08/01(水) 19:07:12
当然参照設定は必要
510デフォルトの名無しさん:2007/08/01(水) 19:15:24
>>509
マジ?なんも設定しなくても使えたんだけど・・・
ちなみに何を設定すればいいんですか?
511デフォルトの名無しさん:2007/08/01(水) 19:18:37
もしかしてCreateObjectで参照してる?
512デフォルトの名無しさん:2007/08/01(水) 19:28:25
Private Sub CommandButton1_Click()
Set rs = CreateObject("ADODB.Recordset")
Con = ""
Con = Con & "Driver={Microsoft Text Driver (*.txt; *.csv)};"
Con = Con & "DBQ=C:\Documents and Settings\Administrator\デスクトップ\新しいフォルダ;"

strSQL = "select * from test.csv"
rs.Open strSQL, Con, 0 '0=adOpenForwardOnly

cols = rs.Fields.Count
Do Until rs.EOF
Line = ""
For i = 0 To cols - 1
Line = Line & rs(i) & vbTab
Next
Debug.Print Line
rs.MoveNext
Loop

End Sub
513デフォルトの名無しさん:2007/08/01(水) 19:29:32
こんなん書いて 今家でも試したけど出来た

CreateObjectだね

CreateObjectだと参照設定しなくても出来るということでおk?
514デフォルトの名無しさん:2007/08/01(水) 20:05:43
515デフォルトの名無しさん:2007/08/01(水) 22:14:09
エクセルを開こうとするといきなりインストールしだしてエラー表示がでました。
プロパティを開いてプログラムを見ると不明なアプリケーションとなっております。
これは何故でしょう?
またこれを解決する方法はどうすればいいのでしょうか?
516デフォルトの名無しさん:2007/08/01(水) 22:17:30
>>513
そうだよ。それが遅延バインディング。
欠点として、参照設定してきちんと型を指定して使う早期バインディングより
速度が遅いと、確かヘルプに書かれているはず。
517デフォルトの名無しさん:2007/08/01(水) 22:18:02
初心者です。
if,do,for等の分岐式や繰り返しコードを使うと必ずバグが出ます。
バグが出ないように皆さん何か心がけている事ってありますか?
518デフォルトの名無しさん:2007/08/01(水) 22:21:59
参照設定しないと遅いのもあるけど、コーディングしにくくない?
519デフォルトの名無しさん:2007/08/01(水) 22:55:03
参照設定ってexcelファイルにするの?
excel環境にするの?
520デフォルトの名無しさん:2007/08/01(水) 23:05:13
ブック単位だな。
ちなみに、普通のVBだとプロジェクト単位。
521デフォルトの名無しさん:2007/08/01(水) 23:47:31
>>515
VBA関係ねえ
522デフォルトの名無しさん:2007/08/01(水) 23:53:15
>>520
d
523デフォルトの名無しさん:2007/08/02(木) 07:40:47
ADOで
csvテーブル(Microsoft Text Driver接続)と
Excelシートテーブル(Microsoft Excel Drive?接続)の
SQLでの連結ってできる?
524デフォルトの名無しさん:2007/08/02(木) 18:21:00
VBAでListViewとかTreeViewを組み込んで OLEDragDropとか使うのは、
VBがある環境じゃないとライセンス違反とか聞いたんだけど、ほんと?
なんかMSのページ見に行ってもどこに情報があるのか良くわからん。。

使えるのに使っちゃダメとかなんだったらひどい話だよなあ。
525デフォルトの名無しさん:2007/08/02(木) 18:24:58
vbaでSQLite使う方法ある?
526デフォルトの名無しさん:2007/08/02(木) 18:28:46
あるよ
527デフォルトの名無しさん:2007/08/02(木) 18:33:07
どうやるのか教えて
528デフォルトの名無しさん:2007/08/02(木) 21:21:54
>>524
> ライセンス違反とか聞いたんだけど、ほんと?
うん、ライセンス違反だよ

ListViewとかTreeViewはVB6ランタイムを入れるとVBAからも使えるようになるが、本来VB6ランタイムというのは有料ソフトの付属品
VB6で作ったソフトを動かす為に必要なので、特定条件下で無料再配布が許可されているが、当然、使用はライセンスに縛られた範囲になる

で、使用して良い範囲が、VB6を持ってない人(VB6ランタイムを借りてる人)ではVB6で作られたソフトからの利用のみで
VB6を持ってる人(VB6ランタイムを購入した人)は自分の環境内で好きなように使って良くて
VB6Proなどを持ってる人(VB6ランタイムとその再配布権を購入した人)は自環境内で好きなように使って良いのに加えて
自作ソフトに同梱して配布することも出来る

無料で配布されているとは言え、VB6を持ってない人には有料ソフトの一部を条件付きで貸してるだけということをお忘れなく

> 使えるのに使っちゃダメとかなんだったらひどい話だよなあ。
世の中、出来るけどやっちゃいけないことで溢れかえっているけど、こんな事にも気付いてないほどお子ちゃまなの?
おそらくピッキングが出来れば君の家にある君が所有権を持つ物品類を盗むことも「出来ること」だが
この「出来ること」をやっちゃダメだと法的に定めるのはひどい話なのかな?
君の所有物に対して、所有権において他者の使用を制止・制限出来るのと同じで
MSの著作物に対しても、著作権において他者の使用を制止・制限してるだけのことなんだけど
529デフォルトの名無しさん:2007/08/02(木) 21:47:51
>>528
> 特定条件下で無料再配布が許可されているが、
おー、そういうからくりなのか。ぜんぜん知らなかった。
勉強になるなあ。ありがとう。

> 世の中、出来るけどやっちゃいけないことで溢れかえっているけど、
> こんな事にも気付いてないほどお子ちゃまなの?
お子ちゃまレベルなのは認めるよ。
趣味でスクリプト組んでいるんであって、
プロで開発やってるわけじゃないもん。

もうちょっと「だめであること」がわかりやすくなっていても
いいんじゃないか?と思ったよ。だめならだめでさ。
530デフォルトの名無しさん:2007/08/02(木) 21:56:24
それを言うなら鍵あいてた家のトイレでウンコしていいかとかそんな所だろ。
どっちもどっちだし窃盗みたいにものすごく悪いって程ではないけど、一応ダメ。
見つかって話がこじれたり目に余るような有様だと裁判沙汰にもなるわなw
531デフォルトの名無しさん:2007/08/02(木) 23:37:16
>>529
技術や知識レベルとかプロ意識の問題じゃなかろう
約束やルールを守れないのは子どもだってこと

ただまあ524がそこまで言われるようなことかと言うと
「そういうもんなんだから諦めな」で済むような気もする
532デフォルトの名無しさん:2007/08/03(金) 00:20:16
そんなことよりvbaからSQLite使う方法教えろ
533デフォルトの名無しさん:2007/08/03(金) 04:43:19
ググれカス!
534デフォルトの名無しさん:2007/08/03(金) 21:25:19
vba sqlite odbc でぐぐって判らんかったら諦めれ
535デフォルトの名無しさん:2007/08/03(金) 21:26:25
ブレークポイントでプログラム中断した時、変数にマウスポインタあてると
内容が表示されるのが表示されなくなりました
設定とかいじってないのに何ででしょう?
536デフォルトの名無しさん:2007/08/03(金) 22:14:43
VBAを記述中にカーソルが勝手に戻ったり、コメントを記入中に勝手に変換確定されるのですが
どうすれば回避する事が出来るのでしょうか?

例えば

Sub | ←このような時に Sub| ←このようにカーソルが戻ってしまうんです。
わーくしー ←このように入力中に勝手に確定されるのです。

よろしくお願いします。
537デフォルトの名無しさん:2007/08/03(金) 22:29:04
スペースが全角だから自動で半角になってるんじゃないか
538106:2007/08/04(土) 07:49:36
'Sub |
539デフォルトの名無しさん:2007/08/04(土) 10:42:33

助けてください。2列目以降をソートしたいのですが、

Range("A1").Sort _
Key1:=Columns("B") _
, Order1:=xlAscending _
, Header:=xlGuess _
, Orientation:=xlTopToBottom

だと、
実行時エラー'1004'
RangeクラスのAutoFilterメゾットが失敗しました。


Range("A1:L100").Sort _
Key1:=Columns("B") _
, Order1:=xlAscending _
, Header:=xlGuess _
, Orientation:=xlTopToBottom

だと、
エラーはでませんが、まったくソートがされません。
F8を叩くと、セルはA1を指しています。
同じファイルをマクロで実行したソースを貼っても駄目でした…。
よろしくお願いします。
540539:2007/08/04(土) 10:45:32
↑すいません。

○RangeクラスのSortメゾットが失敗しました。
×RangeクラスのAutoFilterメゾットが失敗しました。

です。
541デフォルトの名無しさん:2007/08/04(土) 15:47:25
決められた範囲内(セル内)のデータをcsvファイル形式でセーブしたいのですが…
どんなプログラムになるでしょうか?
542デフォルトの名無しさん:2007/08/04(土) 16:10:48
>>542
マクロ記録でSaveAs...してみれば判ると思う。
543542:2007/08/04(土) 16:11:49
>542は>>541ね。
544536:2007/08/04(土) 19:19:49
最初にOption Explicitを入れたので、原因はそれっぽいのかな。
まだ、検証してませんが
545デフォルトの名無しさん:2007/08/04(土) 19:51:05
>Option Explicitを入れたので、原因はそれっぽいのかな。

Option Explicitは常に入れているが、そんな話聞いた事が無い。
546デフォルトの名無しさん:2007/08/04(土) 23:56:25
Sheet1
□ りんご
□ みかん
□ いちご
□ ぶどう

Sheet2
┌─────┐
│りんご    │
│みかん   │
└─────┘

図のようにシート1にあらかじめ入力されているデータを選択し
シート2にあらかじめ作成しておいた表の特定のセルに自動転記され
表が完成する。 という動作を行いいたいのですが
まずシート1でチェックボックスで選ばれた項目だけを
表に反映させるというのがわからないです。。
547デフォルトの名無しさん:2007/08/05(日) 00:43:42

くそ天皇 くそ天皇 くそ天皇 くそ天皇

いい加減死ねっつってんだろ屑ニートくそ天皇が

相変わらず病的な粘着っぷりだな屑ニートくそ天皇が

毎日毎日毎日粘着出来て良いでちゅねくそ天皇

くそ天皇さっさと死にやがれゴミが

東京に在住している精神病珍米糞ニートくそ天皇君の末路

さっさと精神病院逝くか首吊って逝くか選べや糞天皇が

早く死ねよ糞ニート天皇が

粘着精神病屑ニート天皇君は自らニートくそ天皇であると公言しました
さっさと死ねやくそ天皇が

早く死ねっつってんだろ屑ニートくそ天皇が

お前みたいなゴミクズ天皇は息してるだけで空気が汚れるからさっさと死ねや

とっと死に晒せや糞ニート天皇が
548デフォルトの名無しさん:2007/08/05(日) 01:09:41
>>546
Sheet1.CheckBox1でプロパティ値にアクセスできるし
changeイベントもあるからお好きなように
549デフォルトの名無しさん:2007/08/05(日) 16:42:45
タスクみたいなタイマーで2時間に1回プログラムを実行させるにはどーすればいいの?
550デフォルトの名無しさん:2007/08/05(日) 20:56:56
タスクを使えばいいんじゃね?
551デフォルトの名無しさん:2007/08/06(月) 03:44:01
OSはVistaです。

エクセルで完成させた表を印刷しようとするとエラーになります。
通常のインターネットなどのページを印刷するのは可能なのですがエクセル・ワードだけはエラーがでてしまいます。
パソコンでプリンターの状態を見たら「アイドル」になったままで何をしても変わりません。

だれか助けてください。
552551:2007/08/06(月) 03:45:26
スマソ。
板違いだった。
総合相談所スレにいってきます。
553デフォルトの名無しさん:2007/08/06(月) 15:13:05
お世話になります。

accessからodbcを利用してプロシージャを実行させようとしているのですがエラーになって実行できません。

--ソースの一部----------------------------------
 Dim tmp_qd As QueryDef

 SQL = "exec プロシージャ_hoge"

 tmp_qd.SQL = SQL

 Set tmp_rs = tmp_qd.OpenRecordset()
------------------------------------
vbは良く分からない(初めて3日くらいです)のでこれでソースが足りるか分かりませんが、
上記の「tmp_qd.OpenRecordset()」でエラーが発生しています。
内容は
 「 ODBC--呼び出しは失敗しました。 」
とダイアログに表示されます。

エラーの原因がなんだかわかりません。
お手数ですが、お願いいたします。
554デフォルトの名無しさん:2007/08/06(月) 15:28:04
動いたら奇跡
555デフォルトの名無しさん:2007/08/06(月) 15:53:57
>>554
他のコードです。
Dim db As Database
Dim qd As QueryDef
Dim rs As Recordset

Set db = CurrentDb()
qd.Connect = glcnst_ODBCConnect
qd.ReturnsRecords = True
qd.ODBCTimeout = 0

SQL = "exec pro_hoge"

qd.SQL = SQL

Set rs = qd.OpenRecordset()

何か文法等間違っている箇所があるのでしょうか?
お願いします。

556デフォルトの名無しさん:2007/08/06(月) 17:39:57
currentdbはaccessでしか使えないし
sqlが何かわかってないし
どこが間違ってるかとかいうよりも
ちょっとずつしっかり勉強したほうがいいよ
557デフォルトの名無しさん:2007/08/06(月) 18:58:04
>>556
了解しました
558デフォルトの名無しさん:2007/08/06(月) 19:44:23
初めてカキコします。
スキルもないのに仕事を押し付けられた入社1年目の者です。
日報なのですが、日付を入力したら、その日の売上、仕入を表示できるようなプログラムはあるのでしょうか?
ご教授お願い致します
559デフォルトの名無しさん:2007/08/06(月) 19:47:29
作ろうと思えば作れる。
ここは、そういうものを作る側のスレッド、板。
560558:2007/08/06(月) 20:37:56
>>559
期限はないので勉強して作ってみます。
ありがとうございます
561デフォルトの名無しさん:2007/08/06(月) 20:49:01
そんなん関数でやればいいじゃない
562デフォルトの名無しさん:2007/08/06(月) 21:56:57
>>561
>日付を入力したら、その日の売上、仕入を表示できるようなプログラム

を関数で出来んのか?
563デフォルトの名無しさん:2007/08/06(月) 22:20:15
>>562
横からだけど
関数で引っかかるのはどこだろう?
セルに日付を入れると別のシートにある売り上げと仕入れ
VLOOKUPでは駄目なのだろうか?
564デフォルトの名無しさん:2007/08/06(月) 22:54:58
VBAを使って自分自身にジェクトのロック・アンロックをかけたいのですが
可能ならば教えてください
565デフォルトの名無しさん:2007/08/06(月) 22:55:40
>>564
プロジェクトのロック・アンロックでした
566デフォルトの名無しさん:2007/08/07(火) 09:43:03
>>564
可能だけど、それを自分で調べられないレベルの奴は
プロジェクト自体やモジュールをコードで弄るのはやめた方がいい
あと、やるならプロジェクトへのアクセス許可出さないとだめだからね
567558:2007/08/07(火) 19:02:10
VLOOKUP関数で出来ました!
検索値を日報の日付の部分にしたら解決しました。
568デフォルトの名無しさん:2007/08/07(火) 19:12:56
初めて質問させていただきます。

XML文書の妥当性チェックをXMLスキーマで行うため、以下のようにXMLSchemaCacheにaddしようとしたところ、Aの段階でエラーが発生します。

@スキーマキャッシュオブジェクトの生成
Dim objScm As New MSXML2.XMLSchemaCache
Aスキーマをキャッシュに追加
objScm.add "urn:bookList","C:\book.xsd"

実行時エラー スキーマのルート要素に対する定義が無効です。

どのようにすれば@ITの記事を参考にしてやっているのですが、どのようにして回避できるのかわかりません。環境はExcel2000, MSXML2.6を使用しています。よろしくお願いします。

569デフォルトの名無しさん:2007/08/07(火) 20:55:54
MSXML2使うなら、これはExcelとは関係ないものなのでスレ違い
570デフォルトの名無しさん:2007/08/07(火) 21:22:30
>>569
小さい野郎だな、静かにしろ
571デフォルトの名無しさん:2007/08/07(火) 21:47:36
何でも斜に構えて、規律なんて糞食らえ、俺は大きな人間さ
というスタンスで居るのがカッコイイと思ってる年頃ってあるよねw
572デフォルトの名無しさん:2007/08/07(火) 22:00:20
ゆとりはもう一度文章を読み返してから書き込もうぜ
573568:2007/08/07(火) 22:01:44
>>569
XML総合と迷ったのですが、Excelマクロを用いてのXML操作ということで、ここはひとつお目こぼしを。

>>570
わたしのほうもスレ違いと言われて当たらずとも遠からずかもしれません。原因の一端は確実にわたしにありますので、あまりお責めにならないよう。

>>571
そういう時期は確かにありました。実際にカッコイイことはないと思うのですが、根拠レスに自分で自分をカッコイイと思える平和な時期だったのだと思います。
574デフォルトの名無しさん:2007/08/07(火) 22:18:13
>>566
そー言わずになんかヒントちょうだい
575デフォルトの名無しさん:2007/08/07(火) 22:25:08
>>573
だまってろカスブタ
576デフォルトの名無しさん:2007/08/07(火) 23:25:53
Dim a, b
dim r as range

a = Split(Replace(r.Value, "@", " "), " ")

b = Split(Replace(r.Value, "a(0)", "*"), "*")

bはaで分割した最初の文字列を*に変換、*で分割といった感じにしたいのですが、
素人でよく分りません。よろしくお願いします。
577デフォルトの名無しさん:2007/08/07(火) 23:30:25
"a(0)" -> a(0)
じゃだめか?
578デフォルトの名無しさん:2007/08/07(火) 23:44:11
>>577

おお、できましたぁ!!!ありがとうございます〜ペコリ
579デフォルトの名無しさん:2007/08/07(火) 23:56:01
ただ、それだったら
a = "*" & mid$(r.Value,instr(r.Value,"@"))とかのが何ぼか軽いんじゃない?
(注:offsetの誤差は考慮してない)
580デフォルトの名無しさん:2007/08/07(火) 23:57:13
あ、*でsplitしてるのか、ごめん勘違い
581デフォルトの名無しさん:2007/08/08(水) 09:40:48
>>573
> Excelマクロを用いてのXML操作ということで
それはVBAの範疇じゃない
VB言語で[A]pplication(Excel)を操作するからVBA
これからAを取ったらVBなので、Excel付属のVBE使ったとしてもVBの分野
582573:2007/08/08(水) 12:00:35
>>581
わかりました。他スレで質問させていただくことにします。お騒がせしました。
583デフォルトの名無しさん:2007/08/09(木) 21:09:41
excelのvbaを使ってます。

ユーザーフォームで作成した複数のtextboxについて、コードを入力するとき

例えば
if textbox1 = 〜 then
end if
if textbox2 = 〜 then
end if
if textbox3 = 〜 then
end if
などとせず
textboxの連番をうまいこと使ってまとめることってできないでしょうか?
584デフォルトの名無しさん:2007/08/09(木) 21:21:27
あらかじめオブジェクト配列にでもセットしておけば?
585デフォルトの名無しさん:2007/08/09(木) 21:21:57
>>583
〜の内容とThenからEnd Ifの間次第なのに肝心な所を略してどうするの。

for i = 1 to 3
if Controls("textbox" & i) = 〜 Then Stop
next

こういう事?
586デフォルトの名無しさん:2007/08/10(金) 02:31:18 BE:703008239-2BP(218)
SolverAdd CellRef:=constraintCell.Address, Relation:=2, FormulaText:="1.00"

これで 拘束条件が 追加されないびょん
しかも、あるブックだけ・・・
どいうこと?
587デフォルトの名無しさん:2007/08/10(金) 02:35:35 BE:390559853-2BP(218)
しかも、同じブックの その他のSolverAddは 動作するし・・・ なんなの? いやがらせ? > Excel 2003

For Each r In changeRange
SolverAdd CellRef:=r, Relation:=3, FormulaText:=0.0002
SolverAdd CellRef:=r, Relation:=1, FormulaText:=0.9998
Next r
は 動作するw
588デフォルトの名無しさん:2007/08/10(金) 04:29:33 BE:1458089478-2BP(218)
"1.00" の代わりに "R1C10" にすると追加されたw
なんで0.0002や0.9998は問題ないのやら?w
589デフォルトの名無しさん:2007/08/10(金) 04:44:49 BE:104149722-2BP(218)
"1.00"の代わりに 1 や 1# でも追加されないびょんw 0.999は追加されたw
変な ブックw
590デフォルトの名無しさん:2007/08/10(金) 04:48:30 BE:416596782-2BP(218)
"1.00"の代わりに"0.999"にしたら追加されたw そんなに 1が嫌いなのか!
591デフォルトの名無しさん:2007/08/11(土) 01:19:24
あまりにも単純な質問で申し訳ありませんが質問させてください。

VBAでユーザーフォームのテキストBOXにセルの内容を表記
させる事は普通には出来るのですが、セル内容が時刻の場合
上手くいきません。

セル(A1)がActiveとして10:00と入力されています。
それをtexttbox1に表記させるため

Userform1.textbox1.value = Activecell

とすると、表示されるのは「0.416666666666667」という不可解な
表記なんです。

「10:00」と表記させる方法をご教示下さい。
592デフォルトの名無しさん:2007/08/11(土) 01:46:00
>>591
Userform1.textbox1.value = Activecell.Text
593デフォルトの名無しさん:2007/08/11(土) 02:59:16
>>592
> >>591
> Userform1.textbox1.value = Activecell.Text

ありがとう御座います。セル側にtext指定するとは気がつきません
でした。本当に助かりました。
594デフォルトの名無しさん:2007/08/11(土) 17:42:24
すみません、質問です。

マクロの閲覧などをロックしても、ある種のツールで解除出来たりしますが
これを回避する方法は、他のツールソフトなどを利用するしか、
手段は無いのでしょうか?

その場合、出来ればフリーで良いツールは有りませんか?
595デフォルトの名無しさん:2007/08/11(土) 18:00:28
変数名をランダム&グローバルにして
クラス使わずすべて標準モジュールに記述
標準モジュールもランダムな名前で100個ぐらい作る
関数も全く関連性のないものを各々10個ぐらい用意
さらに関数もgoto文多用で1000ステップ
このくらいやれば自分も解析する気にならない
マジおすすめ
596デフォルトの名無しさん:2007/08/11(土) 18:54:45
>>594
VBAプロジェクトの保護は、初心者の不用意な改変を防ぐ「ロック」であって
閲覧や漏洩を阻止する「セキュリティー」ではありません

そもそも、Excelは開発環境ではないのでソースの漏洩を防止しようとすること自体が間違い
Microsoftは強固なセキュリティーを付けることよりも、万が一パスワードを紛失しても、
膨大な時間を掛けて製作したマクロコードを失う結果に繋がらないように配慮しました
開発環境ではないExcelでは、ソースを書いたモジュール自体が、パスを付ける対象に組み込まれているので
モジュールのエクスポートなどをしていない状態でパスを紛失してパス外しが出来なかったら
コードを全て失うことになってしまうからね

その結果、普通にパスを掛けただけはもちろん、パス解除防止ツールでロックしても、
ちょっと面倒になるだけでパス外し自体は出来るようになっています
君が言う「ある種のツール」はコレ( ttp://passmaster.fujigoma.com/passmas/index.htm )
じゃないかもしれないけど、コレで「VBAパスワード保護」した程度ならちゃんと外せます
因みにコレくらいならVBAでも作れますよ

そして、コードが漏洩しない形でアドインなどを作りたい人には専用ソフトを用意しています
(Visual Studio Tools for Office)

あとは、専用ソフトを使ってでもセキュリティーを付けたいか、専用ソフトを使うくらいなら、
解除できる状態でも良しとするかはあなた次第なので、どうぞお好きなように
597デフォルトの名無しさん:2007/08/11(土) 20:41:21
質問させてください。

会社で、エクセルを使って報告用紙の作成を命ぜられたのですが、
エクセルの知識は一般常識的なものしか持ち合わせていないので、
どなたかご教授願います。

C1の値が、A1〜A5のいずれかの値と一致したならば、
E1に、その一致したA1〜A5のいずれかのセルの右隣のセルに入力されている値(B1〜B5のいずれか)
を表示する。

というような内容の関数を作りたいのですが、ネットで検索して1日悩みましたが、結局分かりませんでした。
私の予想では、IF関数とOR関数を使うような気がするのですが。。。
ちなみに関数は今まで使ったことがありません。プログラムの知識もありません。

どうぞ宜しくお願い致します。
598デフォルトの名無しさん:2007/08/11(土) 20:54:08
>>597
E1に式を突っ込むだけでできると思うのだが。よって、スレ違い。
599597:2007/08/11(土) 20:58:50
>>598
この板ははじめて来るので、よく分かりませんでした。
どこで質問すれば良いでしょうか?
600デフォルトの名無しさん:2007/08/11(土) 21:12:30
>>599
さぁ? Excelの使い方の質問ができるのならどこでもどうぞ。
#あ、鼬害か。
601597:2007/08/11(土) 21:21:27
他の板で聞いて解決しましたのでwww
お前らダッセwww
602デフォルトの名無しさん:2007/08/11(土) 22:49:41
セルに関数入れるのを
プログラムと呼べなくもないような
603デフォルトの名無しさん:2007/08/11(土) 22:51:42
>>602
それでもスレ違いであることには変わりない。
604デフォルトの名無しさん:2007/08/11(土) 23:55:49
>>596
質問した香具師じゃないが
VSに何故VBAの開発環境があるんだ?と不思議に思ってたが
そーゆー事なのかぁ、ためになった
605デフォルトの名無しさん:2007/08/11(土) 23:57:38
>>604
VBAと書いたが、確か違う名前だったね
606デフォルトの名無しさん:2007/08/12(日) 19:08:40
質問です。
エクセルで、印刷ダイアログを表示させて、そのときの印刷のページ範囲を任意で決めたいのですが、VBAで制御できますか?

一応、PrintOutメゾットは知っているのですが、このメゾットを実行させると印刷が自動的に行われてしまうようで、今回の利用の用途には合いませんでした。
あらかじめページ設定に印刷の範囲を指定できればいいのですが・・・ ご教授願います。
607デフォルトの名無しさん:2007/08/12(日) 19:16:56
printpreview
608デフォルトの名無しさん:2007/08/12(日) 22:02:15
>>607
いや、それだとダイアログが出ないから合わないんです。

詳しく書くと
1.何かしらの計算をして、ページ範囲(ページの枚数:1〜3ページまでとか)が既に決まっている。
2.印刷する前にダイアログを出す。
3.ページ範囲は、1.より範囲を代入する。
4.ダイアログから印刷プレビューを出す。
5.印刷をする。

この場合、PrintOutメゾットだとFromとToで範囲を決めれたけど、このメゾットだと自動的に印刷までいくので、今回の目的に合わなかったわけです。
一応printpreviewもやってみたけど、このメゾットだと範囲をあらかじめ決めれないらしいので、どうしたものかと困ってしまってます。
609デフォルトの名無しさん:2007/08/12(日) 22:25:21
>>606-608
Application.Dialogs(xlDialogPrint).Show 〜
610デフォルトの名無しさん:2007/08/12(日) 22:56:53
>>609
おおなるほど、これなら思い通りに行けそうです。 ありがとうございます!
611デフォルトの名無しさん:2007/08/13(月) 17:34:19
教えて下さい。

マクロで、「エクセルのメニューを操作(開いてる)」 という状態を
判断する方法って有りますか?
612デフォルトの名無しさん:2007/08/15(水) 01:03:01
InputBoxとかでとりあえず何かを入力させて、
その中にある文字列が入っているかで
分岐させるのはどうすればいいんですか?

ある文字列が入っているか調べる関数とかあれば教えてください。
613デフォルトの名無しさん:2007/08/15(水) 01:08:29
>>612
InStr関数

ある文字列の位置を返す関数だが
含まれてなければ0を返すので、0が返ったか1以上が返ったかで
含まれてるか否かを判断できる
614612:2007/08/15(水) 01:27:20
>>613

ありがとうございます。参考にします。
615デフォルトの名無しさん:2007/08/15(水) 03:12:18
散布図のグラフで、Y軸の範囲を1つ右の列にずらすVBAを作りたいのですが
方法がわかりません。例で示すとY軸の値
=Sheet1!$B$2:$B$11

=Sheet1!$C$2:$C$11
=Sheet1!$D$2:$D$11
=Sheet1!$E$2:$E$11
:
と実行するたびにずらしていくマクロです。

固定値でよければ、Y軸を指定するには
 ActiveChart.SeriesCollection(1).Values = "=sheet1!R2C2:R11C2"
などとすればよいことがわかりましたが、相対移動のためにたとえば、
 ActiveChart.SeriesCollection(1).Values = ActiveChart.SeriesCollection(1).Values.Offset(0,1)
とはできません。

調べたところ、.Values を参照するとバリアント型で配列が返るところまではわかったのですが、
そこで力尽きました。。
616デフォルトの名無しさん:2007/08/15(水) 05:28:39
自己レスです。

その後、検索したところ指定範囲が .SeriesCollection(1).Item(1).Formula で
文字列で得られることがわかりました。ですので、文字列処理をひたすらやって、
.SeriesCollection(1).Values
に突っ込むことでなんとかできるようになった感じです。
お騒がせしました。
# 結局、これで徹夜になったなぁ。

617nanashi:2007/08/15(水) 14:09:52
以下のことがしたいのですが、VBAで対応可能でしょうか?
シート1で文字列を検索して、検索した文字を違うシート2のB1セルに貼り付けます。
続いて検索した文字の一つ上のセルを違うシート2のA1に貼り付けます
さらに検索した文字の一つ下のセルを違うシート2のC1に貼り付けます。
検索された文字をA2,A3...と貼り付けていくようなものをつくりたいです。
できればシート1でのセル情報(セルの色や取り消し線)もあわせてもってこれると
うれしいです。
よろしくお願いします
618デフォルトの名無しさん:2007/08/15(水) 14:57:08
>>617
マクロの記録結果見て考えろ
619デフォルトの名無しさん:2007/08/15(水) 14:58:51
充分可能ですね。
620デフォルトの名無しさん:2007/08/15(水) 15:46:47
phpでいうところの変数展開「var_dump()」みたいなものって、vb(vba)にはないのでしょうか?


PHPは2年ほど触っているのですが、仕事でvbaをしなければならなくなりました。
質問自体はそれほど難解なことではないのですが、なにしろ、基本的な知識をぶっ飛ばして作成に入っているため、つまらないことで躓いています。
よろしくお願いいたします。
621デフォルトの名無しさん:2007/08/15(水) 16:05:41
ウォッチ式のことかね
622デフォルトの名無しさん:2007/08/15(水) 17:27:02
>>620
PHPと違ってデバッガがあるので、それを使えばvar_dumpなんぞ不要。
ブレークポイント、ウォッチ式、イミディエイトウインドあたり調べてみ。
623デフォルトの名無しさん:2007/08/15(水) 17:34:42
>621さん
簡潔なお答え、ありがとうございます。笑
(上段はさておき、そんな言葉すら知りませんでした。)

頂いたヒントをもとに調査した結果、「現在変数に入っている値を見る方法」がわかりました。
「ローカルウインドウ」なるものの存在を知ったので、たぶん、問題は解決。

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

624デフォルトの名無しさん:2007/08/15(水) 17:38:01
>622さん

立て続けに申し訳ありません。
解決しましたので、そのご報告です。

ずっとphpを触ってきたので、すっかりvar_dumpのトリコになっていました。
開発をしていると値の内容を知ることが重要で、それをもたらしてくれるvar_dump、なんて素敵な関数なんだろう、と感動していたところです。

よくよく考えると、結果を表示する画面というのもエクセルにはなく(たぶん、ないですよね)、結果、ローカルウインドウを使うことに決めました。

ご回答、ありがとうございました。
625デフォルトの名無しさん:2007/08/15(水) 22:11:00
Debug.Printをフラグ管理して、イミディエイトウインドに値を表示させるのもひとつの手かと
コードは多少汚くなるけど、必要な値だけ取り出せる。
626デフォルトの名無しさん:2007/08/15(水) 22:28:10
すいません、VBA初心者なんですが、2点程質問があります。
どなたか教えて頂けたら幸いです。

1、Application.GetOpenFilenameにてファイル名を取得するんですが、
  この時、「ファイルを開く」ダイアログボックスに自分が指定した
  フォルダが最初から開かれているようにしたいんですが、可能なのでしょうか?

  例えば C:\test のフォルダを指定したら、ダイアログボックス
  を開いた時に、testフォルダ内のファイルが見れている状態です。



2、1つの列にロックをかけた場合、他のセルの右クリックの「挿入」、
  「削除」、「セルの書式設定」と言ったメニューが使えず、
  制限されてしまうんですが、その列をロックをしたまま、上記メニュー
  を使えるようにする事は可能なのでしょうか?


自分で解決できなかったので、
どなたかご存知の方いましたら、宜しくお願いします。
627デフォルトの名無しさん:2007/08/15(水) 22:57:19
>>626
ChDrive()やChDir()でカレントフォルダを変更。
ただし、例外の処理をちゃんとしないとうまく動かない。

別に、Application.GetOpenFilenameをやめてWindowsAPIを使う方法もあるが、
ややスキルが必要。

>>1つの列にロックをかけた場合、

これ意味不明。kwsk。
628デフォルトの名無しさん:2007/08/15(水) 23:17:33
>>627さん
ありがとうございます。

今までカレントフォルダを変更しただけで、例外の処理をしてませんでした。
ちょっと例外処理とAPIについて自分で調べてやってみます!

>>1つの列にロックをかけた場合、

というのは、例えばB列のセルの内容を編集をできないようにロックした場合、
という意味です。(B列のセルをダブルクリックしたら編集不可のメッセージが出ます。)
このB列をロックしてしまうと、他の編集可能なセルにも影響が及んでしまうんです。

編集可能なセルだけ、通常の右クリックのメニューを使えるようにする
事はできるのでしょうか?

629デフォルトの名無しさん:2007/08/16(木) 00:15:03
>>628
「ロック」というのはデフォルトで全部のセルにチェックがついてる。
おまえさんが言ってるのは「シートの保護」のことか?
630デフォルトの名無しさん:2007/08/16(木) 01:10:49
無理してShellコントロールでやってみたがSetdirectoryしてからダイアログ呼ぶ方が綺麗で簡単だわな

'Shellを使うには Microsoft Shell Controls And Automation をインクルードしておくこと
Dim objShApp As Shell
Dim strPath As String
Dim objFld As Folder2
Set objShApp = New Shell

Set objFld = objShApp.BrowseForFolder(0, "フォルダを選択してください", _
BIF_SHAREABLE + BIF_NONEWFOLDERBUTTON + BIF_NEWDIALOGSTYLE + _
BIF_RETURNFSANCESTORS, ThisWorkbook.Path)
If objFld Is Nothing Then
Exit Sub
End If

strPath = objFld.Items.Item.Path
MsgBox strPath

Set objFld = Nothing
Set objShApp = Nothing
631デフォルトの名無しさん:2007/08/16(木) 02:58:56
かなりの初心者です
セルに格子の表を作りたいのですが、メッセージボックスなどで表示・入力させて、毎回、表の大きさを自由に変えられるような、マクロは作れますか?

"A1:J10"と指定して表作れとかなら、何とかわかるのですが・・・

ご指導、よろしくお願いします
632デフォルトの名無しさん:2007/08/16(木) 03:33:11
マルチページやタブストリップで、ページの背景をかえても、
タブがグレーのままなのです。
タブにも背景色を設定することは出来ないでしょうか
633デフォルトの名無しさん:2007/08/16(木) 06:01:24
>>631
REFEDITコントロールを使うとか
634デフォルトの名無しさん:2007/08/16(木) 11:05:41
>>631
言ってる事判んないけど、例えば次のような感じなら簡単だと思う

1 マウスで左上のセルを指定

 *** ここからマクロ ***
2 inputbox関数で大きさを指定。例えば、5-10
3 マクロで5行10列の格子を引く
 *** マクロ終り ***
635631:2007/08/16(木) 11:51:07
>>633-634

これから、やってみます
本当に有難うございました
636デフォルトの名無しさん:2007/08/16(木) 12:32:47
>>631
以前、同じことやろうとして、判らなかった。
自分しか使わないマクロだったんで、
マクロ起動前に、処理したいセル範囲を選択しておく、という方法にしてしまった。
お望みの解ではないですが、参考まで。
637デフォルトの名無しさん:2007/08/16(木) 13:39:16
inputbox関数じゃ無くinputboxメソッド使えばいいじゃん?
638デフォルトの名無しさん:2007/08/16(木) 13:50:51
inputboxメソッドで始点(左上)と終点(右下)をマウスで指定すれば、
キーボードで入力しないでも出来そうな気がするのだが...。
639デフォルトの名無しさん:2007/08/16(木) 18:46:59
できた(力作)
Sub セルに格子の表を作りたいと思った時のマクロ()
Const colwidth = 3 '枠の幅0-
Const colcount = 9 '枠の列数1-
Const RowHeight = 4 '枠の高さ0-
Const rowcount = 3 '枠の行数1-
Const セル = "C7"
topline = ""
bottomline = ""
centerline = ""
charline = ""
topline = "┌" '***
For i = 1 To colcount
For m = 1 To colwidth
topline = topline & "─"
Next
If i < colcount Then topline = topline & "┬"
Next
topline = topline & "┐" '***
centerline = "├"
For i = 1 To colcount
For m = 1 To colwidth
centerline = centerline & "─"
Next
If i < colcount Then centerline = centerline & "┼"
Next
centerline = centerline & "┤"
640デフォルトの名無しさん:2007/08/16(木) 18:47:43
For i = 1 To colcount '***
charline = charline & "│"
For m = 1 To colwidth
charline = charline & " "
Next
Next
charline = charline & "│"
bottomline = "└" '***
For i = 1 To colcount
For m = 1 To colwidth
bottomline = bottomline & "─"
Next
If i < colcount Then bottomline = bottomline & "┴"
Next
bottomline = bottomline & "┘"
myspread = topline
For i = 1 To rowcount
For m = 1 To RowHeight
myspread = myspread & vbLf & charline
Next
If i < rowcount Then myspread = myspread & vbLf & centerline
Next
myspread = myspread & vbLf & bottomline
Set rf = Range(セル).Font
rf.Name = "MS ゴシック": rf.FontStyle = "標準": rf.Size = 11
rf.Parent = myspread: rf.Parent.ColumnWidth = (2 + colwidth * colcount) * 3
rf.Parent.RowHeight = (2 + RowHeight * rowcount) * 15
End Sub
641デフォルトの名無しさん:2007/08/16(木) 23:51:00
vlookupの関数でできると思います。
詳細はHELPを参照してください。


642デフォルトの名無しさん:2007/08/17(金) 22:54:06
とりあえず、客の名前と住所が入力されたシートがあるんですが、
膨大な数が入力されてます。

例えば、

「東京都新宿区西新宿」

などと住所を入力したら、その文字が含まれる列、行だけが
表示される、みたいな事って出来ますか?
643デフォルトの名無しさん:2007/08/17(金) 23:55:20
できます。
644デフォルトの名無しさん:2007/08/17(金) 23:56:45
>などと住所を入力したら、
どこに入力するの?
複数該当する時はどうするの?
もっと詳しく具体的に!
ってゆうか目的は何ですか?

いずれにしても、VBAじゃないと出来ないと思う
645デフォルトの名無しさん:2007/08/18(土) 00:05:36
目的はわかるだろw
646デフォルトの名無しさん:2007/08/18(土) 00:50:13
顧客リストから自分の土地勘のある場所に住んでいる客を抽出して、ストークするんですね?
647デフォルトの名無しさん:2007/08/18(土) 12:03:37
何故Accessを使わない
648デフォルトの名無しさん:2007/08/18(土) 21:18:47
何故オートフィルタを使わない
649デフォルトの名無しさん:2007/08/19(日) 13:39:36
一つの列に順に大量のデータ(人名)を入力していくのですが
その際、遊びで一人分入力するのにかかる時間を計るタイマーを
ユーザーフォームで表示するというマクロを作っています
タイマー部分はOnTime関数を使って基本はできたのですが
セルに入力中はタイマーの時計表示が止まってしまいます
入力中はマクロの実行自体が止まってるようなんですが
これを動かし続けることはできませんか?
(入力して確定「後」にかかった時間を表示するのはできました)
650デフォルトの名無しさん:2007/08/19(日) 14:14:45
Excelから切り離して動かせばいい
操作はウィンドウメッセージを使うことになるがそう面倒でもあるまい
VBAの範疇を出る話なので、あとはご自分で
651デフォルトの名無しさん:2007/08/19(日) 14:16:25
ユーザーフォームから入力すれば良いかも?
652デフォルトの名無しさん:2007/08/19(日) 18:50:37
Dim time As Variant
Function settime() As Variant
time = Timer
End Function
Function gettime() As Double
gettime = Timer - time
End Function
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
mytime = Format(gettime, "####.00")
ThisWorkbook.Application.Caption = mytime
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
settime
End Sub
653649:2007/08/19(日) 21:34:16
>>650
ありがとうございます。Excelから切り離すってことはVBかなんか使って別アプリにしてしまう
ということですよね?VBA以外やったことないんですが・・・これを機に勉強しようかな
>>651
ありがとうございます。
あくまで入力作業中のおまけというかアクセサリ的なものとして表示させておくつもりだったので
その発想はなかったです。試しにやってみたらフォーム上のtextboxへの入力中ならちゃんと
タイマーを表示するマクロも動き続けますね。とりあえずこの方法でやってみます。
>>651
わざわざコードまで書いてもらって恐縮です。
言葉足らずで申し訳ありませんでしたが、入力確定後にかかった時間を表示するだけじゃなく
入力中もかかってる時間を表示させ続けたいのです。
654デフォルトの名無しさん:2007/08/19(日) 21:45:48
>>639
エラーでます
655デフォルトの名無しさん:2007/08/20(月) 02:39:20

こんな有用なスレがあったんですね。
早速ですが、1つ教えてください。

Excelで、次のようなことがしたいのですが、どのようにしたら良いでしょうか。
・事前に、ユーザーが新規ブックを開いておく
・そのままの状態で(ボタンなどを押すことなく)
・PCのCOMポートから送られてくる文字を、順番にセルに書き出す。
   ボタンを押して....のようなイベントの発生による関数の起動ではなく、
   COMポートの受信割込発生をイベントとした関数の起動がしたいのです。

現在は、
シート上に作ったボタンを押すことで、セルに書かれた数字/文字を、PCのCOMポートからRS232Cで送り出したり、
同じくシート上に作ったボタンを押すことで、COMポートを開いて受信状態となり、
数字/文字を受信したら罫表に書き込んだり などは、結構何度も作っているのですが、
今回は、「ボタンを押さなくても」自動的に受信できないかと思うのです。

何か特別な方法が必要でしょうか、あるいは、VBAの関数にすでに用意されているのでしょうか?
宜しくお願いします。
656デフォルトの名無しさん:2007/08/20(月) 06:35:04
Private Sub Workbook_Open()
処理
End Sub
657デフォルトの名無しさん:2007/08/20(月) 21:11:30
1,エクセルの左側にあらかじめ設定している列を折りたためる、ボタンがあるシートがあるんですけど、
どのように設定すればいいのでしょうか?
2、functionを使用して、同じ計算式をマクロに計算させようとすると、5倍位時間がかかるようになりました。
どのような対策を取ればいいのでしょうか?
658デフォルトの名無しさん:2007/08/20(月) 21:21:42
1 そのまんま。そのボタンに列の表示非表示を切り替えるマクロを登録すればいいだけ。
2 ワークシート関数よりユーザー定義関数の方が遅いのは当然だが、そういうことじゃないのか?
 違うなら日本語で質問してくれ。あとそのFunctionの内容も書くこと。
659デフォルトの名無しさん:2007/08/20(月) 22:26:26
>>657
1.グループ化の事か?
660631:2007/08/21(火) 01:22:25
本やみなさんの意見を参考にしながら一応、出来たのですが

Sub セル範囲を指定して格子罫線を引く()

Dim Rng As Range
Set Rng = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
Rng.Borders.LineStyle = xlContinuous
End Sub

少し、改造すれば、セル範囲を指定してセルの色を塗り替えるにもできます(せっかく、作ったので、良かったら参考にして下さい)
これに、キャンセルしたときに「入力されませんでした」と表示するようにしたいのですが、どうもわかりません

Sub セル範囲を指定して格子罫線を引く2()

Dim jis As Range
Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
If jis <> "" Then
Rng.Borders.LineStyle = xlContinuous
else
msgbox"シート名が入力されませんでした"
End If
End Sub

上のソースだとエラーになってしまいます
お手数ですが、ご指導お願いします。
661デフォルトの名無しさん:2007/08/21(火) 06:33:33
サンプル

Dim returnData As Variant
returnData = Application.InputBox("データを入力してください", Type:=1)

If VarType(returnData) = vbBoolean Then
MsgBox "キャンセルされました"
Exit Sub
End If

MsgBox "処理を続行します"

662デフォルトの名無しさん:2007/08/21(火) 06:58:45
>>660
インプットボックスメソッドはエラー処理が必要
On Error Resume Next
Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
On Error GoTo 0
こんな感じ。ヘルプ見てね!

あと入力されなかった時はキャンセルにしてしまう場合
If jis Is Nothing Then Exit Sub


663662:2007/08/21(火) 11:16:43
こんな感じかな?

Sub セル範囲を指定して格子罫線を引く662()
Dim Rng As Range

Application.DisplayAlerts = False
On Error Resume Next
Set Rng = Application.InputBox( _
prompt:="セル範囲を指定後 [ OK ] を押して下さい。" _
& Chr(13) _
& "【セルを選択しないと [ OK ] は無効です。】", _
Title:="罫線を引くセル範囲を指定してください", _
Default:="", _
Type:=8)
On Error GoTo 0
Application.DisplayAlerts = True
If Rng Is Nothing Then
MsgBox "中止します"
Exit Sub
Else
Rng.Borders.LineStyle = xlContinuous
End If
End Sub
664デフォルトの名無しさん:2007/08/21(火) 17:59:15
>>660
あなたにとって自慢したい自信作かもしれないけど?敢えて苦言を

>本やみなさんの意見を参考にしながら一応、出来たのですが
何もしないで、OKまたはキャンセル押したらエラーになるよね?
これは「出来た」には程遠い!糸口がみつかった程度。
エラーが出るうちは未完成ですね

>(せっかく、作ったので、良かったら参考にして下さい)
恐らく参考にならないでしょう


Sub セル範囲を指定して格子罫線を引く2() ←コンパイルした?
宣言してない変数があるんだけど。

>If jis <> "" Then
これはマズイよね、"" は文字列だから、変数 jis が String じゃないとエラー起こす。
665657:2007/08/21(火) 22:49:15
>>658
回答ありがとうございます。
1、については、>>657さんの回答で要領を得ました。
2、ワークシート関数よりユーザー定義関数の方が遅くて当然との事ですが、
なんらかの方法で、処理速度を上げられないだろうかとかんがえております。
内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。)
666デフォルトの名無しさん:2007/08/21(火) 23:28:34
>なんらかの方法で、処理速度を上げられないだろうかとかんがえております。
ワークシート関数を使え。
マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。
667デフォルトの名無しさん:2007/08/21(火) 23:39:03
>マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。
遅いんじゃない?
ワークシート関数をVBA上で使うと速いけど。
必要なデータは配列に格納し一気に処理(セル参照を頻繁にしないこと)が最速!
668デフォルトの名無しさん:2007/08/22(水) 00:13:58
>>667 そうだね

速度重視ならワークシート上で計算しない設定に。もちろん数式は使わない

セル参照も最小限に。理想は、
シート上の必要なデータを配列に一気に格納、
結果は全て配列に格納し一気にシート上に書き込む
669631:2007/08/22(水) 00:30:23
>>661-663 わざわざ、ソースを全部書いて頂いて、本当に申し訳ありませんでした

お騒がせしました
670デフォルトの名無しさん:2007/08/22(水) 06:36:51
>>665
>内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。)
実際のコード晒してみれば?

具体的には、Cells( i ,j ) がコードに頻繁に出ると遅くなります。特にLoopの中は避けるべき。
私が始めて作った物は、データ取る為に2万回、書くために30万回、頻繁にCells( i ,j ) が...
おまけに Selectしまくってましたので
処理が終るまで30分以上かかってましたが、つくり直したら20秒ほどで出来た!
671デフォルトの名無しさん:2007/08/22(水) 11:45:58
エクセルでバイナリエディタって作れますか?
672デフォルトの名無しさん:2007/08/22(水) 12:30:58
もちろん作れるよ
673デフォルトの名無しさん:2007/08/22(水) 18:03:10
>>672
ありがとう!
674657:2007/08/22(水) 21:00:20
>>666
出来れば、マクロ内で処理したいと考えております。
シミュレーションファイルを作成中でして、他セルにも複雑な式が入っているので、
単純な関数なら、マクロに放り込んでしまいたいのです。
>>667>>668
配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。
>>670
function A(b,c,d,e)
 b=(c+d)/2
 A=b*e
end

こんな単純な計算を、10〜20個織り込み、かつシート上で近似値を算出する計算式を使っているので、
時間がかかります。
675デフォルトの名無しさん:2007/08/22(水) 21:20:16
>配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。
理由になってないんじゃない?
配列を拒否するなら私は手を引くよ!
676デフォルトの名無しさん:2007/08/22(水) 21:31:34
すみません。どなたかご存知でしたらお教えください。
VBAでsleepに該当する命令ってなんでしょうか?
WSHで、WScript.sleep(250)みたいな感じでやっているんですが、
これをVBAでやりたいです。
677デフォルトの名無しさん:2007/08/22(水) 21:44:35
319 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 16:08:34 ID:aEA9W/2t
ttp://kissho2.xii.jp/20/src/2yoshi2512.7z.html 目欄
344 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 18:55:20 ID:YevU/rPG
>>319はウイルス。拡張子が怪しすぐる

らき☆すた 27
http://sakura03.bbspink.com/test/read.cgi/ascii2d/1187586266/
678デフォルトの名無しさん:2007/08/22(水) 21:56:37
>>676
標準モジュールに
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
679デフォルトの名無しさん:2007/08/22(水) 22:07:05
>>678
ありがとうございます。できました。
こんなテクあるんですね。勉強になりました。
680デフォルトの名無しさん:2007/08/22(水) 22:08:37
>>657
オレも

>>656
Timer関数
681デフォルトの名無しさん:2007/08/22(水) 22:10:12
↑誤爆
682デフォルトの名無しさん:2007/08/22(水) 22:39:11
恐れ入ります、質問を失礼します。

Dim st4 As String
Dim r1 As Range,

st4 = Mid(r(1).Offset(2).Value, 5, 10) & "-" & Mid(r(1).Offset(3).Value, 2, 10)

こんな感じで13-1とか2-9といったst4にしたいのですが、
-の後が空欄の時があります。
そういったときは13-のようになってしまいますが、
-の後が空欄の時は13といったように-も表示させたくないです。
こういったことは可能でしょうか?

683デフォルトの名無しさん:2007/08/22(水) 23:03:57
可能です
- は変数ハイフンに入れる 
Dim ハイフン As String
3個の文字列を無条件で&で結合せず
IFで条件分岐してから結合すればよい

ハイフン = "-"
If Mid(r(1).Offset(3).Value, 2, 10) = "" then ハイフン = ""
st4 = Mid(r(1).Offset(2).Value, 5, 10) & ハイフン & Mid(r(1).Offset(3).Value, 2, 10)
684デフォルトの名無しさん:2007/08/22(水) 23:12:03
>>683
おお、できましたぁ!!ありがとうございます!!!
これでボクの仕事がかなり減りました、感謝です♪
685デフォルトの名無しさん:2007/08/22(水) 23:16:40
while ブロックで breakって出来ないの?
686デフォルトの名無しさん:2007/08/22(水) 23:47:11
Exit使えよカス
687デフォルトの名無しさん:2007/08/22(水) 23:53:55
か、かすう?
この俺様に向かって!
688デフォルトの名無しさん:2007/08/23(木) 00:06:25
いつもお世話になります、1点質問を失礼します。無理やり上司から頼まれましたが、自分には無理難題です。
@もし○○○○の後7文字全てが半角英数字だったら、このセルの5文字目〜半角スペースに当たるまでをコピー、「α」とする

○○○○0120123456 ○

α=0120123456

○○○○の後7文字に1文字でも全角文字が入っていたら、○○○○の一つ下の行の先頭から半角スペースに当たるまでを全てコピー「α」、さらに2つ下の行の先頭から「か」という文字に当たるまでをコピー、さらに○○○○から先の文字全てを繋げ「β」とする

○○○○あい12うえおあい
0120789123 ○○
Aか

α=0123789123
β=Aあい12うえおあい

できればifでやりたいんですが、
Dim α As String, β As String
Dim r(1) as range '○○○○の行がr(1)とします

If Mid(r(1).Value, 5, 7) = 全部半角英数字 Then  α=Mid(r(1).Value, 5)から" "まで

Else α=r(1).Offset(1).の先頭から半角スペースに当たるまで全て
   β=r(1).Offset(2).の先頭から「か」に当たるまでをコピー&Mid(r(1).Value, 5, 99)

End if

すいません、自分ifの文に弱いものでかなり違うかもしれませんが、こんなマクロにしたいのです。宣言とかの理論は理解してます。お手数ですが、よろしくお願いします。
689デフォルトの名無しさん:2007/08/23(木) 00:21:56
>>688
>>7文字全てが半角英数字
これって、記号類や半角カナはどうする?
とりあえず、半角・全角の判定だけでいいか?
それとも、英数字に限定?

690デフォルトの名無しさん:2007/08/23(木) 00:30:25
とりあえず、半角・全角の判定のやり方だけど、

VBAには文字列の長さを調べる関数が3つある。
Len()、LenB()、LenMbcs()
の3つ。

Len()とLenMbcs()の結果が同じ→全部半角
Len()とLenMbcs()の結果が違う→全角を含む

と判定できる。
ただし、LenMbcs()はVBAには実装されてなくて、自分で書かないといけない。
書き方はMSDNに紹介されてる。

http://office.microsoft.com/en-us/access/HA012288741033.aspx
Function LenMbcs (ByVal str as String)
  LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

LenMbcs()は、半角で1、全角で2を返す関数。
691デフォルトの名無しさん:2007/08/23(木) 00:35:39
>>689
失礼しました。
半角数字のみの時です、全角や記号や半角カナは×です。
692デフォルトの名無しさん:2007/08/23(木) 00:50:08
'とりあえず、文字列strが数字かどうか判定する関数。
もっと少ない行数の書き方もあるんだが、あえてわかりやすく書いてみた。

Function IsNumberString(str As String) As Boolean
Dim i As Integer
Dim c As String
Const Number = "0123456789"

For i = 1 To Len(str)
c = Mid(str, i, 1)
If InStr(1, Number, c, vbBinaryCompare) > 0 Then
'c が数字だったので何もしない
Else
'c が数字ではなかった
IsNumberString = False
Exit Function
End If
Next i
IsNumberString = True
End Function
693デフォルトの名無しさん:2007/08/23(木) 00:57:23
'strの中にある半角スペースを探して、
'その手前までをコピーする関数。

Function LeftEx(str As String) As String
Dim i As Integer
i = InStr(1, str, " ", vbBinaryCompare)
LeftEx = Left(str, i - 1)
End Function
694デフォルトの名無しさん:2007/08/23(木) 21:25:50
今週からエクセルを使う仕事に就いて昨日マクロにはじめて触れた
初心者で申し訳ないのですが

ワークシートが2〜32まであり
各ワークシートのたとえばB5に以下のように入力したいのですが

ワークシート2のB5に2007/8/1
ワークシート3のB5に2007/8/2

ワークシート32のB5に2007/8/31



For sht = 2 To 32
Worksheets(sht).Select
Range("B5").Select
ActiveCell.FormulaR1C1 = "8/1/2007" + (sht-2)
Next sht
End Sub

これでは当然駄目でした。
今週末になれば自分で勉強しますが
できれば明日使いたいので
よろしければ教えてくださいませ何卒
695デフォルトの名無しさん:2007/08/23(木) 22:03:21

俺の都合に合わせて、即答しやがれ糞共!!

ってわけですか
まぁそういうこと言う奴でも、こういう簡単な質問は
答えたくてウズウズしてる教えたがり厨が答えてくれるだろうけどw
696デフォルトの名無しさん:2007/08/23(木) 22:08:02
Microsoft Access VBAの質問もここでおk?
Accessのスレないんだものorz
697657:2007/08/23(木) 22:45:14
>>675
失礼しました。
698デフォルトの名無しさん:2007/08/23(木) 22:45:18
>>696
moug に逝った方がいいんじゃね?
699デフォルトの名無しさん:2007/08/23(木) 23:46:18
質問させてください。
VBA使って簡単な画像処理をしたいのですが、
画像の輝度値を求める関数って無いのでしょうか?
よろしくお願いします。
700デフォルトの名無しさん:2007/08/24(金) 00:31:35
>>695
わざわざ質問スレに出張ってきて

こんな簡単な質問答えるやつは、
教えたがり厨だ!!

ってわけですか?
701デフォルトの名無しさん:2007/08/24(金) 01:08:05
>>694
未テストだがこんな感じ

Public Sub SheetLoop()
Dim wksSheet As Worksheet
Dim dtDate As Date
Dim intOffset As Integer
Dim strbuf As String

dtDate = "2007/08/01"
For Each wksSheet In ThisWorkbook.Worksheets
strbuf = wksSheet.Name
If 2 <= CInt(strbuf) And CInt(strbuf) <= 32 Then
wksSheet.Cells(5.2).Value = Format$(dtDate + intOffset, "yyyy/mm/dd")
intOffset = intOffset + 1
End If
Next
Set wksSheet = Nothing
End Sub
702デフォルトの名無しさん:2007/08/24(金) 01:24:03
>>701の注意点

シートの名称がイマイチ意味不明なのでとりあえずcintしたが、
これがSheet1とかのパターンが出てくると間違いなくエラーになるので、
isnumericで事前に回避するか、Sheet1系統でOKの場合は
"Sheet"&カウントで文字列連結してstrcompで見てやる必要がある。

今後の注意点
・1文字変数は使わない
・Activate,Select系は使わずオブジェクト経由でアクセスすること
・A1形式は極力使わない
・上記に伴いRangeを使う場面ではCellsで展開してから使用する
・セルに入れる値が日付や文字列や数値など、フォーマットが決まっている場合は
表示形式をNumberformatなどで事前に指定してやる
703デフォルトの名無しさん:2007/08/24(金) 01:32:20
>>702
これって2月とかエラーにならね?
普通にDateAdd使えば?
704703:2007/08/24(金) 01:33:57
うっは流し読みしすぎた

>dtDate = "2007/08/01"

で8月限定にしてんのか。すまん
705デフォルトの名無しさん:2007/08/24(金) 02:46:23
X軸の数値 Y軸の数値
0 -1.5e-9
10 2.5e-8
20 4e-8
30 5e-7
40 6e-5
50 9e-3

のようなデータををX軸は普通、Y軸を対数にしてグラフ化しようとすると、
負の数を入力しようとしています。対数には負の数が入りませんとかエラーが
出ます。(それは当然分かります)
強行すると、この場合、X軸が0の場合を除いてグラフにしてくれます。

動作としてはそれで問題ないのですが、大量にグラフを作成しようとすると、
毎回エラーが出てうざったいのです。なんとかエラーメッセージを消去
して出なくしたいのですが、いい方法はないでしょうか。
706デフォルトの名無しさん:2007/08/24(金) 02:53:19
>>705
事前に負の値を取り除く。
707705:2007/08/24(金) 03:00:08
>>706
やはり、そういう感じでやるしかないのですか・・・
今はABSで絶対値にして逃げてるのですが。
708デフォルトの名無しさん:2007/08/24(金) 05:38:20
そもそも負の値をとりうるデータを対数変換するってデータ処理としてどうよ?
709デフォルトの名無しさん:2007/08/24(金) 07:38:02
>>707
それはおかしいだろう。対数を取りたいってことは負値はIllegalなんでないの?
或いは全体にオフセットを足すべきだったりはしない?
710デフォルトの名無しさん:2007/08/24(金) 11:13:05
EXCEL VBAでフォームを使用して、ユーザーに
ファイルを選択してもらう仕組みを作りたいんですが可能でしょうか?

「参照」ボタンを用意して、ユーザーがクリックすると
フォルダ内のファイルが一覧表示されて、指定できるようなイメージです。
711デフォルトの名無しさん:2007/08/24(金) 12:05:25
出来ますよ

必要なコントロールを配置して
> 「参照」ボタンを用意して、ユーザーがクリックすると
> フォルダ内のファイルが一覧表示されて、指定できる
をコードにすれば良いだけです
712デフォルトの名無しさん:2007/08/24(金) 12:06:32
>>710
Dialogsオブジェクト
713710:2007/08/24(金) 13:12:05
>>711,712
ありがとうございました!
ちょっと調べてみます!!
714デフォルトの名無しさん:2007/08/24(金) 22:40:24
"俺の関数"というファイルにあるテーブルをVlookupした値を加工するユーザー定義関数を、"俺の関数.xla"の標準モジュールに作成しました。
他のファイルから"俺の関数"アドインを有効にしてみましたが、利用できません。どうすればいいですか?

Public Function 俺の関数(key)
fjFilename = "D:\Settings\俺\Application Data\Microsoft\AddIns\俺の関数.xla"
俺の関数 = WorksheetFunction.VLookup(key, Workbooks(fjFilename).Range("テーブル"), 2, 0)+1+2+3
End Function

715デフォルトの名無しさん:2007/08/25(土) 10:10:50
>>710
Application.GetOpenFilename
716デフォルトの名無しさん:2007/08/26(日) 09:28:40
http://sv2.st-kamomo.com/loader/dat/file17227.42952.jpg

競馬の出走馬が並んだデータなのですが
これをレースごとに他のシートにコピペすることはVBAで可能でしょうか?

ちなみにレース場所は毎回異なります。
717デフォルトの名無しさん:2007/08/26(日) 09:33:42
可能
718デフォルトの名無しさん:2007/08/26(日) 09:34:33
>>717
可能だとするとどう命令すべきでしょうか?
719デフォルトの名無しさん:2007/08/26(日) 09:41:35
>>718
「やれ!」
720デフォルトの名無しさん:2007/08/26(日) 09:47:09
(・c_・` )ソッカー
721716:2007/08/26(日) 11:23:09
マクロではできましたが今週の競馬開催の場所が毎回変わりますから
そこができないですね・・・
722デフォルトの名無しさん:2007/08/26(日) 11:50:17
出来るけど、何か?
君が出来ないなら努力不足
723デフォルトの名無しさん:2007/08/26(日) 11:54:41
>これをレースごとに他のシートにコピペすることはVBAで可能でしょうか?



これをレースごとに他のシートにコピペすることはVBAで可能ですが、
どうやったらいいでしょうか?
724デフォルトの名無しさん:2007/08/26(日) 12:09:18
マクロまでできたらそのマクロをいじれ
どういじればいいかは学べ
725デフォルトの名無しさん:2007/08/26(日) 12:20:18
手でコピペは出来るんでしょ。
レースごとに分割する基準は何?
それをマクロに書けばいいだけ。
726デフォルトの名無しさん:2007/08/26(日) 12:23:37
>レースごとに分割する基準

場所+レース番号  例) 札幌 9

または 馬番1〜大外枠

・・・
727デフォルトの名無しさん:2007/08/26(日) 12:45:05
まずシートを作って

Sheets.Add
ActiveSheet.Name = 場所+レース番号  例) 札幌 9

あとは判るだろ
728デフォルトの名無しさん:2007/08/26(日) 12:53:39
>>727
いやそれは分かるんだけどさ
競馬って毎週「札幌」があるわけじゃないのよ
10箇所以上の場所から2つ3つあるわけで・・・
729デフォルトの名無しさん:2007/08/26(日) 13:04:45
変数
ヘルプ
これ以上書くことないな!
730デフォルトの名無しさん:2007/08/26(日) 14:25:56
VBAマスターするコツってありますか?
反復演習・努力ですかね?
731デフォルトの名無しさん:2007/08/26(日) 14:29:24
そもそも何を持ってマスターしたと言えるのか
誰もわからない(あるいは人によってマスターの基準が大きく異なる)ので、
誰もマスターしたなんて言わない。
732デフォルトの名無しさん:2007/08/26(日) 14:53:26
初心者用の1冊をマスターしても実用性はないよな
733デフォルトの名無しさん:2007/08/26(日) 16:24:13
最初は初心者用の入門書のとおりに実際に動かしてみる。
(一週間程度)

次は、簡単なオリジナルのコードを沢山作る。その際
他人に質問しないで自力で検索したりヘルプを見たりする。←最も重要
同時にVBA掲示板を閲覧し自分のレベルにあった質問で勉強する。
未だ、自分で質問はしない方が良いと思う。
(一ヶ月程度〜数年以上)

そのうち、ヘルプを見れば理解できるようになる。このレベルになれば
他人に質問しても相手に失礼じゃないと思う。

スクール行ったって資格は取れるかもしれないが実力がつくとは限らない。
やる気があれば独学で十分だとおもう。
734デフォルトの名無しさん:2007/08/26(日) 16:46:44
俺の頭脳じゃ100年経ってもできないっぽい
実現させるには達人に出会ってお金を出して作ってもらう他ないな・・・
735デフォルトの名無しさん:2007/08/26(日) 18:08:50
>>733
それ以前に、一般機能をひと通り理解してないと無理じゃない?
736デフォルトの名無しさん:2007/08/26(日) 18:14:25
何を馬鹿なことを…

初心者用の本は斜め読み。
必要そうなとこだけを重点的に。
使いたいときだけさっと調べ(本屋、GOOOOOOOGLE)

出来そうじゃなかったらあきらめる。(どうしてもVBAでMSNメッセンジャー作りたいんです >< )
737デフォルトの名無しさん:2007/08/26(日) 18:26:56
VBA本は初心者本ばかりか上級者向けとされている本ですら、
変数の命名規則が不明(どころか明示すらしない)だとか、見やすいコーディングを
考えないとか、速度に触れていないとか、後始末を省略してるとか、コレクションとか
クラスの使用法が全く記載されてないとか、そんなのばっかだから、その手の本の
まんまのコーディングはあんまり業務としての実用性はない
Excelレガシー問題ってこういう本の氾濫が大きいと思う
結局、リファレンスだけあればいいってことになる
738デフォルトの名無しさん:2007/08/26(日) 18:35:13
初心者はプログラム自体にとっつきにくさと
わかりづらさから飽きがきやすいので
かなり偏った内容でも、とにかく楽しく、とにかく簡単で
実際にプログラミングしてみて動かせるような本が好ましい。
サンプルのついた本は腐るほどあるけど
一生使いもしないような題材だと萎えるから
そこのとこも吟味してほしい。

739デフォルトの名無しさん:2007/08/26(日) 18:40:28
だからこそ>>736なんだが。
それにね、途中で興味がなくなったらそれはそれでいいんだよ。
VBAは何かの手段であって目的じゃないはず。
C++やc#でもやればいいんだよ。
740デフォルトの名無しさん:2007/08/26(日) 20:57:33
>>735
そうですね。
一般機能のIF関数やVLOOKUPを使いこなせない人は苦労しそうだね?
741デフォルトの名無しさん:2007/08/26(日) 21:36:12
自分に降りかかる/手が出せる範囲の仕事で滞りなく使えること。
VB「A」なら、↑でマスターしたって言っていいでしょ。
ということは「自分の仕事でVBA使って自動化/効率化したいこと」が
最高の教材になるんじゃないか?

職業プログラマの人は知らんけど。
もしそうなら別の言語マスターした方がよさそうだし。
742デフォルトの名無しさん:2007/08/26(日) 21:43:30
VBAは簡単なのがいいね
C言語に何度も挫折した俺でも使える
VBにステップアップしようとしたけど.NET何たらになってて
よくわからなくて結局VBAに戻ってきた
743デフォルトの名無しさん:2007/08/26(日) 22:12:14
With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues)
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With

Loopんところでオブジェクトが無いとかって
エラーになるんですけどなんでですか?
途中で違うFindするとcの方のFindが無効になっちゃうのでしょうか?
744デフォルトの名無しさん:2007/08/26(日) 23:13:40
ちゃんと例外処理しろよ
745デフォルトの名無しさん:2007/08/26(日) 23:22:45
Loop While Not c Is Nothing And c.Address <> firstAddress

両方評価してからアンドの評価するからアウト

746デフォルトの名無しさん:2007/08/27(月) 06:58:40
きたねーコードだな
747743:2007/08/27(月) 09:52:45
>743ですが、Findのヘルプに載っている
使用例に下記一行を加えただけです。

Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues)


この一行が無ければ、動きます。
この一行を追記しただけでエラーになる理由が知りたいです。
748デフォルトの名無しさん:2007/08/27(月) 12:55:18
なんで解らないのかが知りたいです。
749デフォルトの名無しさん:2007/08/27(月) 14:11:31
>>747
むしろヘルプをコピっただけで
エラーになる俺に動く方法を教えてけれ

>c.Value = 5
をコメントアウトしないと
>Loop While Not c Is Nothing And c.Address <> firstAddress
のところで
cがNothingだから
c.Addrssがエラーになる

Loopのなかに
If c Is Nothing Then Exit Do
とか入れれば問題ないけど
これってヘルプが間違ってんの?
それとも条件しだいでは問題ないの?
750デフォルトの名無しさん:2007/08/27(月) 14:34:19
>>743
> Loopんところでオブジェクトが無いとかって
> エラーになるんですけどなんでですか?
エラーメッセージを正確に書き写せばいいのに。
簡単な英語もわからないと不便だね。
751デフォルトの名無しさん:2007/08/27(月) 18:21:56
エラーって日本語だろ?
752デフォルトの名無しさん:2007/08/27(月) 20:16:40
屁理屈ばっかごねてるヴァカ
753デフォルトの名無しさん:2007/08/28(火) 20:15:47
Excelのオートフィルタ機能を関数で表したいと思うのですが可能でしょうか
教えて下さい
754デフォルトの名無しさん:2007/08/28(火) 22:05:01
ググレカス
755デフォルトの名無しさん:2007/08/28(火) 22:05:53
>>753
> 可能でしょうか

お答えします、可能です
やり方は自分で調べてください
756デフォルトの名無しさん:2007/08/29(水) 09:31:53
これを日本語訳に直してもらえないでしょうか?

Sub TTT()
Dim iR As Integer, iT As Integer, iK As Integer, iM As Integer

For iR = 1 To Cells(1, "A").SpecialCells(xlLastCell).Row
Select Case Cells(iR, "A")
Case "高橋"
iT = iT + 1
Sheets("高橋").Cells(iT, "A") = Cells(iR, "A")
Sheets("高橋").Cells(iT, "B") = Cells(iR, "B")
Case "亀井"
iK = iK + 1
Sheets("亀井").Cells(iK, "A") = Cells(iR, "A")
Sheets("亀井").Cells(iK, "B") = Cells(iR, "B")
Case "道重"
iM = iM + 1
Sheets("道重").Cells(iM, "A") = Cells(iR, "A")
Sheets("道重").Cells(iM, "B") = Cells(iR, "B")
End Select
Next
End Sub
757デフォルトの名無しさん:2007/08/29(水) 09:38:03
潜水艦TTT()
薄暗さ、不-、整数、それ、整数、整数としてのiK、不-、整数

セル(1、「A」).SpecialCells(xlLastCell)の.Rowの選んだケースセルへの不-
=1、(不-、「A」) ケース"高橋"
それ=それ、+1
シート("高橋").Cells、(それ、「A」) =セル(不-、「A」)
シート("高橋").Cells、(それ、「B」) =セル、(不-、「B」) ケース"亀井"
iK iK=+1
シート("亀井").Cells(iK、「A」)=セル(不-、「A」)
シート("亀井").Cells(iK、「B」)=セル、(不-、「B」) ケース"道重"
不-=不-+1
シート("道重").Cells、(不-、「A」) =セル(不-、「A」)
シート("道重").Cells、(不-、「B」) =セル、(不-、「B」)終わりは次の終わ
りの潜水艦を選択します。
758デフォルトの名無しさん:2007/08/29(水) 10:27:52
日本語になってねー
759デフォルトの名無しさん:2007/08/29(水) 10:43:53
逆に言えば元の756だって英語か何かになっていたかというと、そうではないということ。
それはVisual Basicという言語なのだから。
760デフォルトの名無しさん:2007/08/29(水) 10:53:21
それ以前に756動作しないし? 俺も釣られた?
761デフォルトの名無しさん:2007/08/29(水) 12:42:40
>>760
元々別のシートにあるデータをコピペする動作だからね
マジで>>756どう構造か教えて欲しい

TTT というのは任意のタイトルだよね
Dim iR As Integer は整数型の変数の宣言だよね 

その後のTo Cells とか SpecialCells(xlLastCell).Row とかが分からん
762デフォルトの名無しさん:2007/08/29(水) 12:47:13
元のワークシートから名前別のワークシートにA列とB列の値を転記してるだけやん
763デフォルトの名無しさん:2007/08/29(水) 13:54:32
>>756
Cells プロパティの記述が変体的?
764デフォルトの名無しさん:2007/08/29(水) 14:09:33
ダメだ全然ワカンネ
VBAの初心者向きの本も理解できねぇ('A`)
765デフォルトの名無しさん:2007/08/29(水) 14:33:56
VBAでプログラムを勉強しようとするのは無謀だな
VBの知識があってマクロ記録のソースから覚えれば早い
766デフォルトの名無しさん:2007/08/29(水) 14:34:40
初心者向きなのに解かりづらい本が多いからね。

 ↓ こっちのサイトが私にはわかりやすい。
ttp://www6.plala.or.jp/MilkHouse/index.html
767デフォルトの名無しさん:2007/08/29(水) 14:50:44
VBAって今後どうするの? フォーマットが公開されていないファイルは、
政府も使わないと言っている。2007でXMLも標準になったが、マクロが
仕込んであるのでは、公的には使えなくなるんじゃないのかな?
768デフォルトの名無しさん:2007/08/29(水) 16:13:18
> 政府も使わないと言っている。
騙されてる奴が多いが「使わない」とは言ってない
国のやるポーズには、必ず逃げ道仕込んでおくものさw
769デフォルトの名無しさん:2007/08/29(水) 18:31:56
通常VBA含んだExcelを他に配ったりしないんじゃないの?
自分の仕事を効率化するために使ってる人が大部分じゃない?
私は他人の作ったロックしたマクロを使ったことないし使うつもりも無い。
770デフォルトの名無しさん:2007/08/29(水) 21:34:34
恐れ入ります、質問をお願いします。
会社でエクセルのマクロを使用していますが、困っています。
現状、共用ドライブにエクセルファイルを格納し、5人で使用しています。
使用する際は、それぞれ一人一人にパソコンが支給されており、支給された個人のパソコンから共用ドライブにアクセスし、入力
しています。
こういった状況で、マクロで入力する際、人の名前(入力者の名前)を自動的に取得、エクセル表の任意の場所に貼り付けすることはできないものでしょうか?
winXP エクセル2000です。
771デフォルトの名無しさん:2007/08/29(水) 21:57:06
出来るんじゃないかな?ユーザー名を取得し履歴のように日時と一緒に書き込んだり
入力したセルのコメントに日時とユーザー名を記録する事も。
772デフォルトの名無しさん:2007/08/29(水) 23:05:23
EXCELでVBAでDLLを使う場合、
そのDLLをxlsファイル内に埋め込む方法はありませんか?
773デフォルトの名無しさん:2007/08/29(水) 23:16:04
ActiveSheet.OLEObjects.Add(
Filename:= "C:\Documents and Settings\Administrator\デスクトップ\xxx.dll",
Link:=False,
DisplayAsIcon:=False).Select

これはxlsファイル内にdllを保存するということでいい?
このファイルを外部に保存するにはどうしたら・・・
774デフォルトの名無しさん:2007/08/29(水) 23:34:31
>>770
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
775デフォルトの名無しさん:2007/08/29(水) 23:37:36
>>772
ない。DLLはDLL。
素直にDeclare宣言して関数使いましょう。
776デフォルトの名無しさん:2007/08/29(水) 23:44:06
>>775
宣言など使い方は通常通りでいいんだけど

配布ファイルが複数になるのが駄目なんだ

xls内にdllを保存し、
起動時にdllをカレントフォルダに保存。
dllを使った処理を行い、
終了時にdllを削除。
っていう流れがやりたい。
777デフォルトの名無しさん:2007/08/29(水) 23:50:02
>>776
> xls内にdllを保存し、
これの意味が分からん。保存ってなんだ?
LoadLibraryしてFreeLibraryすりゃいいんじゃね?
そういう話じゃない?
778デフォルトの名無しさん:2007/08/29(水) 23:51:09
ついでだ。
#If Win32 Then
Private Declare Function LoadLibraryEx Lib "Kernel32" Alias "LoadLibraryExA" _
(ByVal lpLibFileName As String, _
ByVal hFile As Long, _
ByVal dwFlags As Long) As Integer
Private Declare Sub FreeLibrary Lib "Kernel32" (ByVal hLibModule As Integer)
#Else
Private Declare Function LoadLibrary Lib "kernel" (ByVal f$) As Integer
Private Declare Sub FreeLibrary Lib "Kernel" (ByVal h As Integer)
#End If
779デフォルトの名無しさん:2007/08/29(水) 23:57:50
>>777
A.xlsはマクロでB.dllを使用しています。
A.xlsを利用するためには同(又はパスの通った)フォルダにB.dllを置く必要があります。
ですが、

A.xlsの配布時にB.dllを同時に配布すればいいんですが、それは運用的に無理です。
また、ファイルの移動(複写)をする場合には、A.xlsのみの移動(複写)でシステムが動くようにする必要があります。

なので、
A.xls内にB.dllを埋め込み、実行時それをファイルとして抽出保存し、利用する必要があります。
780デフォルトの名無しさん:2007/08/30(木) 00:03:16
いや、DLLはDLLなんだからファイル自体別。
埋め込むってのがよく分からんが、
DLLの配布がNGなら
DLLの関数をVBAで組めばいいって話じゃ済まないの?
要するに、DLLは無くして全部VBAで書けって話。
ダメなん?
781デフォルトの名無しさん:2007/08/30(木) 00:07:13
>A.xls内にB.dllを埋め込み
テキストとしてシートに書くって事か?
782デフォルトの名無しさん:2007/08/30(木) 00:08:55
とりあえず目的をはっきりさせてくれんと分からん。
DLLの配布が目的なのか、マクロの動作が目的なのか、それともその他、どれだ?
783デフォルトの名無しさん:2007/08/30(木) 00:15:45
VBAで処理書くのは最後の手段。出来れば避けたい
DLLの関数を使いたい。

メールの添付ファイルみたいにxls中にdllを入れて、
マクロでそれを、dllファイルに書き出して利用したい。
メールはbase64だっけ

マクロの動作が目的

784デフォルトの名無しさん:2007/08/30(木) 00:18:47
オブジェクトの挿入でファイルを添付できるんじゃね?
785デフォルトの名無しさん:2007/08/30(木) 00:20:24
そういうことか。
でもExcelで出来るのかは怪しいな。
786デフォルトの名無しさん:2007/08/30(木) 00:22:00

オブジェクトの挿入で出来たぞ
ちょっと目鱗
787デフォルトの名無しさん:2007/08/30(木) 00:23:02
>>784
添付はできてるんだけど、マクロでそれをファイルに保存ができない
788デフォルトの名無しさん:2007/08/30(木) 00:45:33
実を言うと、俺も772と同じことを以前やろうとしたんだが、無理だった。
DLLを.xlsファイルに埋め込むことは出来るし、動的にDLL作成することもできるんだけど、
その中から関数を呼び出す方法が無くて。
Declare Function〜は、マクロ実行時にDLLが無いとエラーになるので使えない。
Cなら動的にLoadLibrary()→AddressOf()って方法もあるんだが、VBAの場合、
AdressOf()はコールバックのアドレスにしか使えなくて。

.xlsに埋め込んだ方法だけど、標準モジュールの中に何かの変数(配列)として入れておいた。
それで、実行時にファイルとして書き出す。dllが小さかったから出来た方法だけどね。
789デフォルトの名無しさん:2007/08/30(木) 00:52:07
標準モジュールの中に何かの変数(配列)として入れておいた。
それで、実行時にファイルとして書き出す。

ここ詳しく教えて


@バイナリデータとして入れておいて
Aバイナリ書き出しでdll作成??

@がよく分からん
790デフォルトの名無しさん:2007/08/30(木) 00:52:55
今日はもう落ちるんで、朝確認します
よろしくおねがいします
791デフォルトの名無しさん:2007/08/30(木) 02:39:36
http://hisazin-up.dyndns.org/up/src/42670.xls
このエクセルファイルの中にtest()ってマクロがあるから、実行してくれ。
デスクトップにasakusa.jpgっていう画像ファイルができる。
仕組みはソース読め。
792デフォルトの名無しさん:2007/08/30(木) 07:50:46
>>791
落ちてるorz

長持ちするとこに再うpおねがいします
793デフォルトの名無しさん:2007/08/30(木) 09:01:23
>>788
そういうときにはCallWindowProcとかEnumWindowsとかを使えばいいんだよ。
794デフォルトの名無しさん:2007/08/30(木) 09:21:12
>>791 はウィルス?
ファイルは存在してるがブロックされる
795デフォルトの名無しさん:2007/08/30(木) 12:01:12
>>792
普通に保存できたよ
796デフォルトの名無しさん:2007/08/30(木) 17:32:03
VBAの変数って多次元の連想配列って無理?
PHP的に書くと $hensu['mojiretsu1'][0] $hensu['mojiretsu2'][1]
みたいな
797デフォルトの名無しさん:2007/08/30(木) 17:44:55
collectionにcollectionを格納すれば可能
ちょっと辛いけど
798デフォルトの名無しさん:2007/08/30(木) 17:45:13
PHPは知らんからVBA的に書いてくれ
799デフォルトの名無しさん:2007/08/30(木) 17:57:27
>>797
うええめんどくせえ
DBのSELECT用の関数とかみんなどうやってんだ
$serectData[フィールド名][0] みたいに使えないんでしょ?

>>798
hensu("mojiretsu", 1) みたいな感じかなあ
800デフォルトの名無しさん:2007/08/30(木) 18:41:36
const mojiretsu=0 as integer
でいいじゃん
801デフォルトの名無しさん:2007/08/30(木) 19:31:39
>>791
これはとりあえず出来ました。
ただ、
340kbのDLLが.basにすると700kbくらいになって
それを300kb弱のxlsに入れて保存すると1300kbになって
それを他のシートの値を変更して、上書き保存すると2700kbになったorz


DLLをxlsにOLEオブジェクトで追加して
ActiveSheet.Shapes("Object 1").Copy
ってやるとクリップボードにDLL保存出来て、
手作業でどこかのフォルダに貼り付けは出来たんだけど、
それをマクロでやる方法が見つからなかった。

どなかた教えてください。
802デフォルトの名無しさん:2007/08/30(木) 20:07:43
マクロで、オートフィルターの選択を、「すべて」にするようにしたいです。

Selection.AutoFilter Field:=5
でいいのでしょうか?最後の数字の意味がわかりません。
803デフォルトの名無しさん:2007/08/30(木) 20:50:50
>>799
WSHのDictionaryObject使うと似たようなことはできると思ったよ
ただ凄く遅かったのと、Vbaからは使ったこと無いので自分で調べてみてくれ
804デフォルトの名無しさん:2007/08/30(木) 22:05:39
>>802
F1でヘルプな
805デフォルトの名無しさん:2007/08/30(木) 22:20:58
Dictionaryは使いにくいので書き換えを伴うときはVariant配列にしてしまう
参照用だけならCollectionで決まりなんだけどねぇ
806デフォルトの名無しさん:2007/08/30(木) 22:50:33
もしご存知でしたら教えてください。
Findメソッドに関してなのですが、検索対象に"/"が文字列間に
含まれていると検出してくれません。
例:2007/8/30 など

"/"単体だと検出してくれるのですが、、

これはこのメソッドの使用なのでしょうか?
ぐぐってみたのですが参考になるようなものをみつけれなかったので。。
807デフォルトの名無しさん:2007/08/30(木) 22:59:11
>2007/8/30
文字列じゃないだろ?検出しなくて当然!
808デフォルトの名無しさん:2007/08/30(木) 23:09:34
VBAでクリップボードにコピーされてるDLLをファイルに落とす方法はありませんか?
809デフォルトの名無しさん:2007/08/30(木) 23:17:42
>>807
ありがとうございます。

テキストボックスに入力された日付をString型の変数に格納したのですが
文字列にはならないのでしょうか?

2007:OK
/:OK
2007/:文字列型じゃない、、

一度SplitしてからFindすることにします。。
810デフォルトの名無しさん:2007/08/30(木) 23:25:27
            ___
          ./    \
          .| ^   ^ |     あまり私をやらせない方がいい
          | .>ノ(、_, )ヽ、.|
         __! ! -=ニ=- ノ!___
    /´ ̄ ̄ .|\`ニニ´/    `ヽ
    ,.、-  ̄/  | l   ̄ / | |` ┬-、
    /  ヽ. /    ト-` 、ノ- |  l  l  ヽ.
  /    ∨     l   |!  |   `> |  i
  /     |`二^>  l.  |  | <__,|  |
_|      |.|-<    \ i / ,イ____!/ \
  .|     {.|  ` - 、 ,.---ァ^! |    | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l
__{   ___|└―ー/  ̄´ |ヽ |___ノ____________|
  }/ -= ヽ__ - 'ヽ   -‐ ,r'゙   l                  |
__f゙// ̄ ̄     _ -'     |_____ ,. -  ̄ \____|
  | |  -  ̄   /   |     _ | ̄ ̄ ̄ ̄ /       \  ̄|
___`\ __ /    _l - ̄  l___ /   , /     ヽi___.|
 ̄ ̄ ̄    |    _ 二 =〒  ̄  } ̄ /     l |      ! ̄ ̄|
_______l       -ヾ ̄  l/         l|       |___|
811デフォルトの名無しさん:2007/08/30(木) 23:44:08
>>808
またおまえか
812デフォルトの名無しさん:2007/08/31(金) 08:08:37
>>811
方法おしえて
813デフォルトの名無しさん:2007/08/31(金) 08:24:16
>>805
Collectionでも書き換え出来るけどね
814デフォルトの名無しさん:2007/08/31(金) 09:23:41
>>809
エクセルでは日付は思うように出来ないことも有る。有る意味仕様
一例を挙げると
Sub Cstrのテスト()
Cells(1, 1) = Date
Cells(2, 1) = CStr(Cells(1, 1))
End Sub
トンでもない結果が出ると思う。
815デフォルトの名無しさん:2007/08/31(金) 14:18:52
>>814 (809じゃないけど面白そうなんで試してみた)
Cells(1,1) → 2007/8/31
Cells(2,1) → 1931/7/8
ビックリ仕様ですね
816デフォルトの名無しさん:2007/08/31(金) 21:55:56
> エクセルでは日付は思うように出来ないことも有る。有る意味仕様
ちゃんと理解してないから思うようにいかないだけ
817デフォルトの名無しさん:2007/09/01(土) 06:59:50
>>814
CStrのヘルプみると引数に日付型は有効だけど
Cells(2, 1)の表示形式も日付に変わってる?
これは仕様というよりバグじゃ?
818デフォルトの名無しさん:2007/09/01(土) 08:32:29
>>814
手元にExcel無いから自信が無いが、確か "'"+CStr(Cells(1,1)) って書けば正常表示された記憶がある
頭が数値の文字列入れるとExcelって数字で判断しちゃうんだよね、バグというより仕様でもいいんじゃね
>>809も頭にアポストロフィを足してやると正常になるかもよ
819デフォルトの名無しさん:2007/09/01(土) 08:46:18
>>818
訂正
2007/8/31→1931/7/8 って単にアメリカ仕様の mm/dd/yy の形で変換されてるだけじゃん
こりゃバグだね
820デフォルトの名無しさん:2007/09/01(土) 09:25:30
VBAで別ファイルにあるワークシートへの参照を
そのファイルを開かずに取得するにはどうしたらよいでしょうか?

ワークシート上ではたとえば「='C:\ABC\[DEF.xls]Sheet1'!$A$1」などと指定すれば
開いていないファイルのセルを参照できますが、
これと同じような方法で、たとえば
Dim hoge As Worksheet
Set hoge = ********
のような記述で、開いていないファイルのワークシートを参照するには
どうすればいいのでしょうか?

よろしくお願いします。
821デフォルトの名無しさん:2007/09/01(土) 12:32:56
試せばいいじゃん
822820:2007/09/01(土) 13:09:10
>>821
試す、って何をどう試すのですか??
まさか
set hoge = worksheets("C:\ABC\[DEF.xls]Sheet1")
とかをやれってことですか?
エラーに決まってますが。
823デフォルトの名無しさん:2007/09/01(土) 13:16:54
横着すんな
発想としてはbookのオブジェクトつくって、そっからシートオブジェクトさらってくるだろ
出来るかはしらないけど
824デフォルトの名無しさん:2007/09/01(土) 18:14:30
Executeexcel4macroでってのが定番
ただし参照する量が多いと遅くて使い物にならないので、
結局一回開いてメモリに読みこまないとダメという
825デフォルトの名無しさん:2007/09/01(土) 18:30:46
ブックのあるディレクトリに、そのブックのアクティブなシート上のデータを
例えばファイル名sage.txtとしてANSIのtxt形式で保存するVBAのコード教えてください
826デフォルトの名無しさん:2007/09/01(土) 18:35:04
ここはクレクレスレじゃないです(><
827デフォルトの名無しさん:2007/09/01(土) 19:50:19
>>825
FSOでググッてみ
828デフォルトの名無しさん:2007/09/01(土) 20:03:02
>>711
こういうレスって無価値だな
829デフォルトの名無しさん:2007/09/01(土) 20:36:55
>>823
当然できる、けど扱いが難しい
良くないコードだけどこんな感じ

Public Sub MyTest()
Dim wbkTarget As Workbook
Set wbkTarget = OpenBook
MsgBox "シート1の名前は" & wbkTarget.Worksheets(1).Name & "です", vbOKOnly, "Result"
wbkTarget.Close False '※ここでブックの実体を閉じないとゴーストプロセスが残ってしまう
Set wbkTarget = Nothing
End Sub

Private Function OpenBook(Optional ByVal iSheetIndex As Integer = 1) As Workbook
Dim xlApp As Excel.Application
Dim wbkTarget As Workbook
Dim wksSheet As Worksheet
Dim strPath As String
Set xlApp = New Excel.Application
strPath = xlApp.GetOpenFilename("Microsoft Excelブック,*.xls")

Set wbkTarget = xlApp.Workbooks.Open(strPath)
Set wksSheet = wbkTarget.Worksheets(1)
Set OpenBook = wbkTarget
Set wbkTarget = Nothing '※インスタンスは解放されるが実体のブックは開きっぱなし
Set xlApp = Nothing
End Function

830829:2007/09/01(土) 21:10:43
俺は一体何を示したかったんだ・・・
どうも疲れてるようだ

Private Function OpenBook(Optional ByVal iSheetIndex As Integer = 1) As Workbook
Dim xlApp As Excel.Application
Dim wbkTarget As Workbook
Dim wksSheet As Worksheet
Dim strPath As String
Set xlApp = New Excel.Application
strPath = xlApp.GetOpenFilename("Microsoft Excelブック,*.xls")

Set wbkTarget = xlApp.Workbooks.Open(strPath)
Set wksSheet = wbkTarget.Worksheets(iSheetIndex)
wksSheet.Name="ほげ"
Set OpenBook = wbkTarget
set wksSheet = Nothing
Set wbkTarget = Nothing '※インスタンスは解放されるが実体のブックは開きっぱなし
Set xlApp = Nothing
End Function
831デフォルトの名無しさん:2007/09/01(土) 21:33:05
丁寧にコードまで書いてお前優しい奴だな
俺はすぐ噛み付く>>820みたいなの為にそこまでは出来ない
832デフォルトの名無しさん:2007/09/02(日) 07:28:22
ActiveSheet.ChartObjects(3).Chart.Export "hoge.gif"

のようなグラフのExportで 「400」とだけ書かれたエラーダイアログが出るんだが・・・何なんだこれはorz
ExportをActivateにしても変わらないし・・・

833デフォルトの名無しさん:2007/09/02(日) 09:45:41
チラシは日記の裏にでも
834デフォルトの名無しさん:2007/09/02(日) 09:50:02
EXCEL2007です。
列を挿入すると、挿入列の書式が、挿入位置の左の列と同じになりますが、
これを挿入位置の右の列の書式になるように挿入するには、
どのように指定すれば良いのでしょうか。

よろしくお願いします。
835デフォルトの名無しさん:2007/09/02(日) 09:53:46
それはスレ違いだな
手動でできるならそれをマクロ記録
836デフォルトの名無しさん:2007/09/02(日) 17:36:31
7×7のマスに0〜48の数字をランダムに表示
させることはできますか?
D4は0という条件なのですが。
お願いします。
837デフォルトの名無しさん:2007/09/02(日) 17:54:59
>7×7のマスに0〜48の数字をランダムに表示

>D4は0という条件なのですが。
が矛盾している罠。
A1-G7からD4を除いたセルに、1-48を割り振ればいいのかな?
だとしたら、できる。
838デフォルトの名無しさん:2007/09/02(日) 18:00:09
>>837
お願いします。
839デフォルトの名無しさん:2007/09/02(日) 18:10:56
主語と目的語が無いのはゆとりのデフォだよな
840デフォルトの名無しさん:2007/09/02(日) 18:15:15
ほら

Dim s(1 To 48) As Integer
Dim a As Integer


For i = 1 To 7
For m = 1 To 7
If Not (m = 4 And i = 4) Then
Do
a = Int(Rnd * 48 + 1)
Loop Until (s(a) = 0)
Cells(i, m) = a
s(a) = 1
End If

Next
Next
841デフォルトの名無しさん:2007/09/02(日) 18:19:34
>>840さん。ありがとうございます。
これで、注意配分の練習したいと思います。
842デフォルトの名無しさん:2007/09/02(日) 18:23:49
ふむ、>837はありがたくないらしい。
843デフォルトの名無しさん:2007/09/02(日) 18:32:04
>>837>>840には感謝してます。
こんな俺のために・・。
>For i = 1 To 7
プロシージャの外では無効です。
とエラーが出ました。
どのように書き換えればよいのでしょうか?
844デフォルトの名無しさん:2007/09/02(日) 18:33:47
あ、自己解決しました。
End Subが抜けてた・・。
失礼しました。
845デフォルトの名無しさん:2007/09/02(日) 21:47:03
>>844

スレ違いだけど
車掌になるの?
846デフォルトの名無しさん:2007/09/02(日) 21:57:47
利用するだけのやつが多い中、ちゃんと報告するだけ偉い
847デフォルトの名無しさん:2007/09/02(日) 22:42:13
まるで脳トレ……つーか、頭スキャンみたいだな。
848デフォルトの名無しさん:2007/09/02(日) 23:32:48
>>845
車掌ってそういう特訓するんだ。知らなかった。
849デフォルトの名無しさん:2007/09/02(日) 23:38:38
VBAの入門書は一通り読んだ者です。

Sub Macro1()
Dim name(10) As Variant
name(0) = Range("A2").Value
End Sub

のコードが、3行目でエラーになってしまう理由がわかりません。
「修正候補: As」と表示されます。

3行目を
Set name(0) = Range("A2").Value
にすると、エラーでなくなるようです。
Setって、オブジェクト型のデータの格納に使うと読んだので、
この理由もよくわかりません。

よろしくお願いします。
850デフォルトの名無しさん:2007/09/02(日) 23:45:15
名前が悪い
851デフォルトの名無しさん:2007/09/02(日) 23:57:45
nameって変数名はよくない。
試しにA(10)とかB(10)でやってみなよ。うまくいくから。

nameとかtimeみたいに関数の名前とかプロパティであるような
奴は変数名にしないほうがいい。
852849:2007/09/03(月) 00:02:46
>>850
>>851
変数名を変えたら解決しました。
どうもありがとうございます。
853デフォルトの名無しさん:2007/09/03(月) 13:36:09
nameが判りやすいから使ったんでしょ?
ヤバイ名前にはMyをつけてMyNaneのようにすれば問題ない。
854デフォルトの名無しさん:2007/09/03(月) 14:01:09
my付けるのって「できる大辞典」ユーザーの特徴なんだっけ?

MSの推奨は型名(とスコープ)のプレフィックス付けで、Variant型なら
Dim vntName(10) As Variant
となるわけで、こういった型名(とスコープ)のプレフィックス付けが
VBA(VB言語)以外も含めてコーディング規則では一番一般的なんだが
855デフォルトの名無しさん:2007/09/03(月) 14:13:25
キモチワルイ
856デフォルトの名無しさん:2007/09/03(月) 14:45:06
少なくとも一番ではないと思う。

ハンガリアン記法 [part1]
http://pc11.2ch.net/test/read.cgi/tech/1187669648/l50
コーディング規約 第3条
http://pc11.2ch.net/test/read.cgi/tech/1170599322/l50
857デフォルトの名無しさん:2007/09/03(月) 15:05:13
そうでもないか
858デフォルトの名無しさん:2007/09/03(月) 21:54:43
まあ命名法は数あれど日本語変数と一文字変数だけは認めたくない
859デフォルトの名無しさん:2007/09/03(月) 22:22:26
Forループ用にiとかjとか使うんだけど。
860デフォルトの名無しさん:2007/09/03(月) 22:33:41
整数主にカウント用にijk... 座標等にxyあたりは別に普通だろう。
何かしら1文字が予約されてる言語ならもっともだが。
861デフォルトの名無しさん:2007/09/03(月) 22:42:23
ここに書き込んでいいのか分からないのですが、VBAを使っているのでここに質問させてもらいます。
Levenberg-Marquardt algorithm を使って関数をFittingしたいのですが、英語で書いてあるためか、よく分かりません。
ソースはttp://www.alglib.net/optimization/levenbergmarquardt.phpにあるんですが…。
以下の説明があるんですが、よく分かりません。誰か使い方を教えてください。お願いします。m(_ _)m
862デフォルトの名無しさん:2007/09/03(月) 22:43:49
'This routines must be defined by the programmer
' Sub FuncVecJac(ByRef X() As Double, _
' ByRef FVec() As Double, _
' ByRef FJac() As Double, _
' ByRef IFlag As Long)


'Routines
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'The subroutine minimizes the sum of squares of M nonlinear finctions of
'N arguments with Levenberg-Marquardt algorithm using Jacobian and
'information about function values.
'
'Programmer should redefine FuncVecJac subroutine which takes array X
'(argument) whose index ranges from 1 to N as an input and if variable
'IFlag is equal to:
' * 1, returns vector of function values in array FVec (in elements from
' 1 to M), not changing FJac.
' * 2, returns Jacobian in array FJac (in elements [1..M,1..N]), not
' changing FVec.
'The subroutine can change the IFlag parameter by setting it into a negative
'number. It will terminate program.
'
'Programmer can also redefine LevenbergMarquardtNewIteration subroutine
'which is called on each new step. Current point X is passed into the
'subroutine. It is reasonable to redefine the subroutine for better
'debugging, for example, to visualize the solution process.
'
'The AdditionalLevenbergMarquardtStoppingCriterion could be redefined to
'modify stopping conditions.
863デフォルトの名無しさん:2007/09/03(月) 22:44:43
'Input parameters:
' N ・ number of unknowns, N>0.
' M ・ number of summable functions, M>=N.
' X ・ initial solution approximation.
' Array whose index ranges from 1 to N.
' EpsG ・ stopping criterion. Iterations are stopped, if cosine of
' the angle between vector of function values and each of
' the Jacobian columns if less or equal EpsG by absolute
' value. In fact this value defines stopping condition which
' is based on the function gradient smallness.
' EpsF ・ stopping criterion. Iterations are stopped, if relative
' decreasing of sum of function values squares (real and
' predicted on the base of extrapolation) is less or equal
' EpsF.
' EpsX ・ stopping criterion. Iterations are stopped, if relative
' change of solution is less or equal EpsX.
' MaxIts ・ stopping criterion. Iterations are stopped, if their
' number exceeds MaxIts.
864デフォルトの名無しさん:2007/09/03(月) 22:46:24
Output parameters:
' X ・ solution
' Array whose index ranges from 1 to N.
' Info ・ a reason of a program completion:
' * -1 wrong parameters were specified,
' * 0 interrupted by user,
' * 1 relative decrease of sum of function values
' squares (real and predicted on the base of
' extrapolation) is less or equal EpsF.
' * 2 relative change of solution is less or equal
' EpsX.
' * 3 conditions (1) and (2) are fulfilled.
' * 4 cosine of the angle between vector of function
' values and each of the Jacobian columns is less
' or equal EpsG by absolute value.
' * 5 number of iterations exceeds MaxIts.
' * 6 EpsF is too small.
' It is impossible to get a better result.
' * 7 EpsX is too small.
' It is impossible to get a better result.
' * 8 EpsG is too small. Vector of functions is
' orthogonal to Jacobian columns with near-machine
' precision.
'argonne national laboratory. minpack project. march 1980.
'burton s. garbow, kenneth e. hillstrom, jorge j. more
'
'Contributors:
' * Sergey Bochkanov (ALGLIB project). Translation from FORTRAN to
' pseudocode.
865デフォルトの名無しさん:2007/09/04(火) 02:27:11
1文字変数主義者は変数の型とかに気を使わないのが定説
Cなんかやらせたらキャスト地獄で気が狂うだろな
866デフォルトの名無しさん:2007/09/04(火) 21:59:14
マクロ初心者なので教えて下さい。
変数Aを10とするマクロXと変数Aを20とするマクロYがあるとして、
それぞれの変数を生かした上でマクロZを共通して使用するように
したいのです。

それぞれでマクロを全文書けば良いだけの話かもしれませんが、
共用できる部分を共用することで容量を減らしたいので…
なお、Application.RunでマクロZを呼び出したら、変数が引き継がれず
エラーになってしまいました。

うまいやり方を教えて下さい。
867デフォルトの名無しさん:2007/09/04(火) 22:00:33
ここは初心者育成スレじゃない
最低限のことは覚えてから来てください
868デフォルトの名無しさん:2007/09/04(火) 22:33:57
1に
>スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと
とも書いてありますが。
869デフォルトの名無しさん:2007/09/04(火) 23:43:32
>>866
何のためにSubやFunctionには引数を追加できると思っている?
870デフォルトの名無しさん:2007/09/05(水) 00:07:56
それはVBAのスキルであって プログラミングのスキルではないだろ
871デフォルトの名無しさん:2007/09/05(水) 07:52:48
globalにpublic宣言すれば参照できたっけ?
X.A Y.Aで
872デフォルトの名無しさん:2007/09/05(水) 08:28:05
>>868
で?
873デフォルトの名無しさん:2007/09/06(木) 05:03:58
VBAって馬鹿にしてたけど
遅ささえ気にならなきゃ、何でもできるんだな
COM使いこなせればの話だけど
874デフォルトの名無しさん:2007/09/06(木) 08:30:32
COM無しでもなんでも出来るよ

VBSだとCOM有っての物種だけど
VBAはWin32APIが使えるから、それを使いこなせればCOMなんて不要
ぶっちゃけCOMを使うのではなく、作れる側の言語と同等の仕様なんだから
875デフォルトの名無しさん:2007/09/06(木) 12:25:00
いや、Win32APIがあっても、COMはCOMで便利だと思うぞ。
両方で機能が重複しているわけでもないし、
時と場合によって使い分けるものだろ。
876デフォルトの名無しさん:2007/09/06(木) 14:34:50
このプログラムを日本語訳してくれ!!
http://ex23.2ch.net/test/read.cgi/morningcoffee/1189055210/
877デフォルトの名無しさん:2007/09/06(木) 14:42:03
878デフォルトの名無しさん:2007/09/06(木) 18:39:09
初心者な質問ですが、フォームからシートのサブルーチンを呼び出すのはどうしたらよいですか?
879デフォルトの名無しさん:2007/09/06(木) 19:30:56
sheet.subproc("パラメータ")
880デフォルトの名無しさん:2007/09/06(木) 20:20:19
>>875
COMが不要だとか便利じゃないなんて話はしてないよ
COM使わなくても、何でも出来るって話なだけで

それに、両方の機能は重複してるというか、COMで出来ることは殆どWin32API(の組み合わせ)で出来る
まあ使い分けた方が手軽ではあるけど、スキルさえあればCOM無しでも事足りるのは事実
881デフォルトの名無しさん:2007/09/06(木) 21:52:19
しつもん
htmlファイルを(テキストでも何でもいいけど)普通にテキスト形式で読み込めませんか

今はループさせて1行毎にLine Inputしてるのですが、
(A1に1行目、A2に2行目、・・・をEOFまで)
なんかもっとこうてっとりばやいというか
File("index.html").copy Sheet1
みたいなの
882デフォルトの名無しさん:2007/09/06(木) 21:53:49
つ[open]
883デフォルトの名無しさん:2007/09/06(木) 22:24:15
>>880
例えばExcelブックの中身いじるなんてことを
Win32APIで現実的にやれるって言うつもり?
884デフォルトの名無しさん:2007/09/06(木) 22:27:13
いやさ、COMを使った時点でVBAの範疇から外れるだろw
WIN32APIでゴリゴリ書くと整った開発環境で作るより
むしろローレベルなプログラムになるよなw
885デフォルトの名無しさん:2007/09/06(木) 22:38:02
Excel VBAでExcelとVBAだけは参照設定から外せないぞ。

確かに、COMコンポーネント一般の話はVBAから外れるが、
Excelブックを操作するのにCOMを使う以上、
VBAにCOMは欠かせない存在だろ。
886デフォルトの名無しさん:2007/09/06(木) 22:45:29
そりゃそうだ。
COMを使えば○○が出来る → VBAすげー
ではないだろってだけだよ。すごいのはCOMだ。

別にCOMもAPIも有用なもんだ。
887878:2007/09/07(金) 03:11:01
>>879
サンクス、やってみる
888デフォルトの名無しさん:2007/09/07(金) 03:52:09
COMってのを学習するために良いサイトを教えてください
889デフォルトの名無しさん:2007/09/07(金) 22:06:12
指定したフォルダ配下のサブフォルダ一覧の取得方法を教えてください
890デフォルトの名無しさん:2007/09/07(金) 23:33:03
Excel2003で作ったVBAのツールをVista + Excel2007の環境にインストールしたら、
読み取り専用として開いてしまい保存ができません。

VBAツールの場合、ユーザー権限の昇格確認を出して管理者権限で実行するには
どうすれば良いでしょうか?
891デフォルトの名無しさん:2007/09/08(土) 00:13:09
>>882
やりたかったこと

Name index.html As index.txt
Workbooks.Open Filename:="index.txt"
を、ファイル名を変えずに

Workbooks.Open Filename:="index.html"
だとタグを勝手に解釈しやがって死ぬ

↓結局今はこう

Open "index.html" For Input As #1
行 = 1
Do Until EOF(1)
Line Input #1 , buf
Cells(行,1) = buf
Loop
Close #1
892デフォルトの名無しさん:2007/09/08(土) 00:23:09
>>889
Dir(指定するフォルダ, vbDirectory)
893デフォルトの名無しさん:2007/09/08(土) 07:14:41
>>889
Dim FSO As Object
Dim Fds As Object
Dim Fd As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Fds = FSO.GetFolder(FdPath) 'Fdpathにフォルダのパスを指定

For Each Fd In Fds.SubFolders

Fd.Name '←サブフォルダフォルダの名前。やりたい処理を書く。AddiItemとか

Next Fd

Set FSO = Nothing
Set Fds = Nothing

まぁ、間違ってるかもしれないけど。

誰か>>861
スレ違い?
894デフォルトの名無しさん:2007/09/08(土) 09:28:57
>>888
VB系だとあまりCOMそのものを勉強する必要はないと思う。
COMのことは裏に隠蔽して普段は意識せずに済むようになっているから。
895デフォルトの名無しさん:2007/09/08(土) 11:48:35
>>892>>893
ありがとうございます
ためしてみます
896デフォルトの名無しさん:2007/09/08(土) 14:26:15
VBAでワークシート関数を使いたいのですが
範囲のところにVBAの変数を指定することは可能でしょうか?
よろしくお願いいたします。

WorksheetFunction.Average(範囲)
897デフォルトの名無しさん:2007/09/08(土) 15:47:19
やってみればいいのに
898デフォルトの名無しさん:2007/09/08(土) 15:48:08
ホントなんでやってみないんだろ?

Dim Rng As Range
Set Rng = Range("A1:A3")
Debug.Print WorksheetFunction.Sum(Rng)
899デフォルトの名無しさん:2007/09/09(日) 09:33:31
名前付き引き数に変数(文字列)を使用したいのですが、どう組んだらよいですか?
ちなみに、:="名前" って感じのものです
900デフォルトの名無しさん:2007/09/09(日) 09:59:50
>>899
hlpym!ks!
901デフォルトの名無しさん:2007/09/09(日) 14:14:06
Sub sample()

Dim bbb As Integer

Selection.AutoFilter Field:=8, Criteria1:="#VALUE!"
bbb = Rows.SpecialCells(xlCellTypeVisible).Select
Selection.Delete

End Sub

フィルターをかけて「#VALUE!」行を削除したいのですが
上のだと項目名も選んでしまうのですが、何を付け加えたらいいでしょうか
ご指導お願いします
902デフォルトの名無しさん:2007/09/09(日) 14:49:29
iserror
903デフォルトの名無しさん:2007/09/09(日) 15:43:52
Excel VBA とFortran どっちが早いでしょうか?
コンパイラはフリーのものなんですが。
だいぶ違うのでしょうか?
904デフォルトの名無しさん:2007/09/09(日) 15:58:44
そりゃぁ、馴れている方が早く書けるだろ。
905デフォルトの名無しさん:2007/09/09(日) 16:12:43
>>901
項目名を選ばなかったらいいんじゃないか
それと6行目は何をしたいのかわからない
たぶん不要
906デフォルトの名無しさん:2007/09/09(日) 17:31:51
>>903
開発されたのは、Fortranの方がずっと"早い"。
907デフォルトの名無しさん:2007/09/09(日) 18:41:36
VBAより遅いコンパイラなんてあんのかいな
908デフォルトの名無しさん:2007/09/09(日) 18:47:15
腐るほどある
909903:2007/09/09(日) 19:00:03
>>904->>908
実行速度です。
使い勝手はExcel VBAがいいんですけど、速さを考えると
Fortranのほうがいいのかなと。セルの参照とかしなければ
いい線いくのかなと。

910デフォルトの名無しさん:2007/09/09(日) 20:47:59
なんでもかんでもRange作戦なら実効速度が稼げる
しかしソースが汚くなる諸刃の剣
切羽詰まったやつ以外にはオススメできない
911デフォルトの名無しさん:2007/09/09(日) 22:51:08
>>909
計算精度を求めるのならFORTRAN(もしくはCOBOL)

Excelの小数点以下の計算精度は酷い。
VBAで計算するのなら、Currencyとか使うと精度が良いが小数点以下桁数の制限が大きい。
912デフォルトの名無しさん:2007/09/09(日) 23:45:16
doubleをlongに入れると親切に四捨五入してくれるからなあ
ずいぶんはまったよ
913デフォルトの名無しさん:2007/09/10(月) 01:20:08
>>911
それは、精度がいいんじゃなくて、
Centuryの誤差の出方がDoubleのそれより人間の感覚に近いというだけ。
914デフォルトの名無しさん:2007/09/10(月) 01:45:23
世紀の誤差か
915デフォルトの名無しさん:2007/09/10(月) 11:08:25
>>913 はCurrencyをCenturyと書き間違えて説得力が低いけど、
>>911 が言う「Excelの小数点以下の計算精度は酷い」は嘘っぽい。
根拠があって言ってる?
916デフォルトの名無しさん:2007/09/10(月) 11:44:34
single、doubleとも本来の精度以上に悪いとは思ったことはないが
ただ計算の時にどの型になってるかよくわからないんで
全部cdblにしたりしたな
917デフォルトの名無しさん:2007/09/10(月) 18:33:29
>>915
Excelに限定すると

ttp://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml

とか。普通にExcelの参考書類にも載っている話だけれど
918デフォルトの名無しさん:2007/09/10(月) 18:56:17
ヒント:丸め誤差
919デフォルトの名無しさん:2007/09/10(月) 19:03:02
>>917
それはexcel限定の話じゃない
920デフォルトの名無しさん:2007/09/10(月) 19:18:52
>>917
FORTRANでもまったく同じことが起きます。
COBOLは、十進数で計算するのでVBAのCurrencyと同様ですが、
あらかじめ桁数を決めておくのが普通なので、
考えようによってはCurrencyよりも使いにくい場合があります。
921デフォルトの名無しさん:2007/09/10(月) 19:24:40
>>917
そのページ、怪しくない?
「0.1 は、実は 0.1000…000555115123…625です」みたいな書き方しているけど、
右側(小数点以下20桁以降)は、ただのゴミ。
それだけの桁数をもっているわけじゃない。
922デフォルトの名無しさん:2007/09/10(月) 22:23:56
>>921
>「0.1 は、実は 0.1000…000555115123…625です」みたいな書き方しているけど、

初心者にも画面上で分かりやすいように画面表示上での最高桁を使っているわけで
説明しやすくするための方便かと。
日経ソフトウェアではなくビジネスマン向けの「日経PC21」だし無駄に厳密にやっても混乱させるだけだし。
一応フォローとして同じ連載中で「IEEE 754浮動小数点数」の仕組みとかもやってるが。

# Excelのワークシート関数利用に関しては結構マニアックな雑誌なので一般ユーザに渡すと結構重宝されたりするけど>日経PC21

あと >>917 の通り、これ以外でもぐぐればいくらでもある。

そういや8bit機であるMSXのBASICの浮動小数点がBCD利用で
PC98のN88-BASIC(86)より精度が高かったことを思い出した
その分、元々遅いのが更に遅くなっているが。
923デフォルトの名無しさん:2007/09/10(月) 22:50:32
BCDなら固定小数点じゃないの?
924デフォルトの名無しさん:2007/09/10(月) 23:17:50
>>922
どんだけぐぐったって、Excelの小数点以下の計算精度がFortranよりも酷い
なんてことが書いてあるページは見つからないと思うけど。
925デフォルトの名無しさん:2007/09/10(月) 23:21:21
何故10進型を使おうとしない
926デフォルトの名無しさん:2007/09/10(月) 23:22:01
922ってそんなこと主張してるか?
927デフォルトの名無しさん:2007/09/10(月) 23:22:20
>>923
MSXのMATHPACKはBCD浮動小数点が使えたはず。
928デフォルトの名無しさん:2007/09/10(月) 23:27:30
まあ考えたらBCDでも浮動小数点は可能だな

>>925
足し算引き算ぐらいなら使ってもいいが
929デフォルトの名無しさん:2007/09/10(月) 23:32:37
もうちょっとCPUが賢く安くなれば
10進数浮動小数点演算器載せるだろうな、あと何年待てばいんだろ
930デフォルトの名無しさん:2007/09/10(月) 23:35:51
>>924
明らかに >>921-922 の流れはFORTRANとは無関係です。
Excelに対するFORTRANの計算精度の優位性について言及しているのは >>911 だけだし。

FORTRANはよく知らないが同じBASICでもMSXと98で精度が異なるように、処理系依存の部分も多い希ガス
931デフォルトの名無しさん:2007/09/10(月) 23:39:59
つうか計算精度なんて言語じゃなくてCPUの性能によるんじゃないの?
まぁソフトだけで計算すりゃ精度は出るだろうが、馬鹿みたいに遅い気がする
932デフォルトの名無しさん:2007/09/10(月) 23:43:21
言及ったってどう酷いかいってくれないとなあ
933デフォルトの名無しさん:2007/09/10(月) 23:44:44
だから10進型使えっつーの

何が優位性だ半可通が
934デフォルトの名無しさん:2007/09/10(月) 23:51:30
まぁ世の中の殆どは近似値で事足りる
精度のいるモノは高いアプリやらマシーン使ってるだろうし
浮動小数点使って馬鹿みたいなプログラムを組むと引っ掛かる
935デフォルトの名無しさん:2007/09/11(火) 00:17:13
メールについて質問!

VBAからダイレクトにメールを打つサンプルはよくあるんですが、
メーラーを開き、新規メール画面にセルの文字列を入れて、送信はしない、
って状態を作りたいのですが、どうすれば良いでしょうか?

メーラーはOutlook Expressじゃなく、「通常使うメーラー」を使いたいです。

よろしくお願いします。
936デフォルトの名無しさん:2007/09/11(火) 00:30:08
>>935
メーラーにコマンドラインで渡せばいいんじゃないか
937デフォルトの名無しさん:2007/09/11(火) 02:39:14
Select Caseの分岐に変数のリストを渡して使えないでしょうか

Dim IntA = "1,3,5" As Integer
Dim IntB = "2,4,6" As Integer

Select Case Int
   Case IntA
      〜
   Case IntB
      〜

みたいな。
上のだと当然型エラーが出るし、stringにすると「1,3,5」という文字列にマッチしてしまう

たくさんのわりとランダムっぽい数値で分岐させたく、
なおかつよく数値が変更されるので見通しの良いところにおいておきたいのです。
938デフォルトの名無しさん:2007/09/11(火) 06:53:59
ヒント:偶数、奇数
939デフォルトの名無しさん:2007/09/11(火) 06:56:43
ってランダムか
規則性がないものは都度判定するか連想配列に登録するしかないと思われ
940935:2007/09/11(火) 07:41:35
>>936
ありがとうございます。
今、メーラーはBeckyなのですが、Becky側では、コマンドラインから
セット出来るのは、宛先To:のみなので、本文を処理出来ません。。
通常使うメーラー、無理なもんですかね?
941デフォルトの名無しさん:2007/09/11(火) 08:30:21
mailto:で呼び出したらいいんじゃないかな?
本文とかも指定できる。
ttp://www.shurey.com/Soft/JavaScript/mailto.html
942デフォルトの名無しさん:2007/09/11(火) 19:04:00
>>937
実際の分岐条件イメージが涌かないが、まずはHELPの使用例見ろ
その上での話なら、変則ではあるがこのようなやり方もある
Select Case True
   Case 条件式1
      〜
   Case 条件式2
      〜
   Case Else

943デフォルトの名無しさん:2007/09/11(火) 19:28:45
> 変則ではあるが
その手法は基本だろ?
944デフォルトの名無しさん:2007/09/11(火) 20:51:56
基本は
if 条件式 then
elseif 条件式
end if
945デフォルトの名無しさん:2007/09/11(火) 21:50:07
>>944
if 条件式 then
elseif 条件式 then
end if



これも基本だし>>942も基本のうち
946デフォルトの名無しさん:2007/09/11(火) 23:17:18
elseifなんかソース汚くなるしLIKE演算子に用があるときぐらいしか使わんわ
947デフォルトの名無しさん:2007/09/11(火) 23:54:01
で?
948デフォルトの名無しさん:2007/09/12(水) 00:33:43
>>937の例だと
select case hoge
case 1,3,5
case 2,4,6
end select
とかでいいんでないの
magic numberだが
949デフォルトの名無しさん:2007/09/12(水) 01:27:54
>>946
ハゲは黙ってろw
950デフォルトの名無しさん:2007/09/12(水) 15:29:00
>>937
配列渡しの関数作って戻り値をIF文で判定するしかないじゃね
select文に拘ってもしょうがない
951デフォルトの名無しさん:2007/09/12(水) 20:45:54
質問です。
本日、面接に行ったところ、1週間でVBAで計算機を作って来いと言われました。
ちなみに、VBAどころかプログラム自体、一切触ったことありません。

で、まだソース部分は全く手付かずなのですが、
ユーザフォームに0〜9ボタンや、+、-などのボタンとテキストボックスを貼り付け、
ボタンを押して、値なり結果をテキストボックスに返す感じで行きたいなと。
ただ、ユーザフォーム上で計算機としての動作が可能なのか、
アプローチが最初から間違っていないか、その点を教えていただきたいです。

探し方が悪いとは思うのですが、そういったものを紹介しているサイトも
見つけられなかったものですから…
952デフォルトの名無しさん:2007/09/12(水) 20:51:35
>>951
ちなみに面接官もここチェックしてるから
953デフォルトの名無しさん:2007/09/12(水) 21:10:17
vbaじゃなくてvisual basicで探せ
954デフォルトの名無しさん:2007/09/12(水) 21:41:02
>>951
それを自力で出来るかどうかを見てるわけだから不正をせず自力でやりましょう
不正をして採用されても、能力以上のことばかり要求されて辛い思いをするのは君ですよ

自分の能力に見合ったものを選ぶか、上を目指したければズルすることではなく己を高めることを考えましょう
955デフォルトの名無しさん:2007/09/12(水) 22:08:06
>>951
ひとつだけ言っておく

>ユーザフォーム上で計算機としての動作が可能なのか

可能
956デフォルトの名無しさん:2007/09/12(水) 22:09:28
>>951
考え方は合ってる
数字ボタン:値の取得
加減乗除などのボタン:フラグ
って考えれば良い
957デフォルトの名無しさん:2007/09/12(水) 23:15:12
"を文字列として扱いたいのですが、例えば
"My name is nanashi"という具合に"(半角)まで表示させるにはどうすればいいでしょうか?
環境はExcel2003です。

Dim tk as string
tk=""My name is nanashi""
だとエラーが出ます。

たぶん
 tk=???&"My name is nanashi" &???
が正解であると思うのですが???に何を入れればいいのか思い出せません。
PC-98時代のベーシックならCHR(??)だったような記憶があるのですが、VBAの場合どうすればいいのでしょうか?
お願いします。
958デフォルトの名無しさん:2007/09/12(水) 23:18:56
ググレカス
959デフォルトの名無しさん:2007/09/12(水) 23:31:11
>>957
Msgbox """ぐぐれ"""
960デフォルトの名無しさん:2007/09/12(水) 23:42:44
奇数個をはさんでも偶数個に修正するんだな
961デフォルトの名無しさん:2007/09/13(木) 01:58:19
>>957
実はVBAにもCHRあるから同じように書ける
962デフォルトの名無しさん:2007/09/13(木) 21:13:41
UserFormの中に配置されたListBoxの中に、ComboBoxを組み込むことは可能でしょうか?

ListBoxは2列構成なのですが、
1列目に項目名、2列目にComboBoxを組み込みまして、各項目の値をComboBoxから
選べるようにできないかと考えています。
963デフォルトの名無しさん:2007/09/13(木) 21:41:17
> ListBoxの中に、ComboBoxを組み込む
ListBoxはコンテナじゃないし、ComboBoxとの連動機能も無いので組み込むことは不可能だが
組み込みなんかしなくても君が想定していることは実現できる

しかしExcel分野ではなくVB分野の話なので具体的なことは伏せる
まあ、がんばれや
964デフォルトの名無しさん:2007/09/13(木) 23:54:19
コンボボックス2つ並べて上のコンボボックスにより、下のコンボボックスの
内容を変えれば良いだけと思ってしまうワタクシは素人なのでしょうか
965デフォルトの名無しさん:2007/09/14(金) 08:25:31
素人に産毛が生えたくらいじゃね?
966デフォルトの名無しさん:2007/09/14(金) 14:54:29
質問です。

ワークシートを新規で作成する際、シート名が被っていないかどうかの
チェックを入れたいのですが、どんな手があるのでしょうか?

あるいは、シート名が被っている時に出るエラーを、表示させずに拾って
作成を中止するという形でも問題ないです。

とっかかりが謎なので「よくわからんけど、○○じゃない?」とかでも
構いません。よろしくお願いします。
967デフォルトの名無しさん:2007/09/14(金) 15:09:56
よくわからんけどsheetってコレクションされてるんじゃない?
968デフォルトの名無しさん:2007/09/14(金) 17:42:16
Dim ws1 As Worksheet
On Error Resume Next
Set ws1 = Worksheets(SheetName)
Debug.Print Err.Number
969デフォルトの名無しさん:2007/09/14(金) 21:24:35
そろそろ次スレ準備した方がよいかもですね
970デフォルトの名無しさん:2007/09/15(土) 00:15:23
for each a in thisworkbook.worksheets:?a.name:next

イミディエイトに貼り付け
971デフォルトの名無しさん:2007/09/15(土) 08:33:01
おはようございます。

エクセルシート上の削除をキャッチするにはどのような方法がありますでしょうか?
シートイベントでそれらしきものもなく、チェンジだとどうも旨くいきません。
何かヒントをいただけたらと思います。宜しくお願いします
972デフォルトの名無しさん:2007/09/15(土) 08:49:18
どううまくいかないの?
973デフォルトの名無しさん:2007/09/15(土) 09:09:09
>>972
すいません、説明不足でした。具体的に書きます。

シート上でセルが削除されたとき、その削除されたセルの値をなんらかの形で残したいのです。
なんらかとは、別シートのセルや、配列の変数という意です。

そういうコードを書こうと思い、そのさい削除を察知するにはどうしたら・・?
という経緯です。
974デフォルトの名無しさん:2007/09/15(土) 10:23:26
質問です。
システムメニューに、新たにプルダウンメニューを追加する例は
検索すると色々と見つかるのですが、クリックすると即座に
マクロを実行する様な、ボタンとしての動作をさせる事は出来ないでしょうか?
975デフォルトの名無しさん:2007/09/15(土) 10:54:22
>>973
selectchangeでカレントセルの値を保持して
changeで空になったら保存ではどうでしょう
976デフォルトの名無しさん:2007/09/15(土) 12:34:31
>>975 遅レスすみません
> selectchangeでカレントセルの値を保持して
> changeで空になったら保存ではどうでしょう

この方法で試してみます。ありがとうございます。
977デフォルトの名無しさん :2007/09/15(土) 12:46:03
Excel2007でパレート図を作成したいのですが、やり方がわかりません。
正規の書き方を教えて下さい。
超初心者です。ググったりしたけどわかりませんでした。
図解していただけると(またはそうゆうサイトを教えていただけると)嬉しいデス。
すいません。
978デフォルトの名無しさん:2007/09/15(土) 19:13:50
Excel2007でパレート図の出し方変わったのか。

ってすれ違い?
979デフォルトの名無しさん:2007/09/15(土) 21:01:20
パレート図という単語を見る度にポスタルってゲームで
パレードに火炎瓶投げ込んで地獄絵図になる光景を思い出すんだ
980デフォルトの名無しさん:2007/09/16(日) 00:55:39
リストボックスの中の順番はドラッグで変更することは可能ですか?
または、順番を効率的に変更できる方法はないでしょうか?

いまは「上へ」「下へ」ボタンを作ってずらしているのですが、
アイテム数が50程あるので、入れ替えがかなり面倒くさい状態です。

別のリストボックスへのドラッグ&ドロップは以下のようにできることは分かりました
ttp://www.moug.net/tech/exvba/0150045.htm

リスト内でドロップされたときに座標が、そのリストの何番目のindexにあたるか分かれば
できるような気がするのですが…
981デフォルトの名無しさん:2007/09/16(日) 01:19:04
ListViewに変更してみたらどう?
982デフォルトの名無しさん:2007/09/16(日) 01:31:44
計算できるだろ
983デフォルトの名無しさん:2007/09/16(日) 10:41:44
>>973
どういう場面でそういう必要があるのかいまいちわからん
シートの削除もマクロでやるようにすればいいんじゃないか?
984デフォルトの名無しさん:2007/09/17(月) 13:35:38
Excel2003でテキストボックス内に改行表示されている

a.txt
b.txt
c.txt ...

といった複数のテキストファイルを、まとめて開くようにファイル名を取得するには
どのように処理すれば良いのでしょうか?
全て処理できればファイルの順序は問いません。
985デフォルトの名無しさん:2007/09/17(月) 13:42:43
ファイルを開いて読む処理をわかってきいているのかな
やることは同じでしょ
986デフォルトの名無しさん:2007/09/17(月) 13:43:53
テキストファイルと間違えた(汗
987デフォルトの名無しさん:2007/09/17(月) 18:49:41
.txtで区切り位置検出
区切り位置毎に文字列取り出し
988デフォルトの名無しさん:2007/09/17(月) 20:18:28
なんてことをやるのはアホ
FSOのgetbasenameでスッキリ
989デフォルトの名無しさん:2007/09/17(月) 22:10:07
FSOのGetBaseNameより
組込の文字列操作関数の方が遙かに速いわけで

横着以外でこんな事のためにGetBaseNameやGetExtensionNameなんかを
使う奴や奨める奴はアフォ
990デフォルトの名無しさん:2007/09/17(月) 22:14:57
988も横着できるがために奨めたのではないのか?
991デフォルトの名無しさん:2007/09/17(月) 23:04:15
そうは書いてないな
992デフォルトの名無しさん:2007/09/17(月) 23:06:34
すっきりがコードの見た目ならそうだな
993デフォルトの名無しさん:2007/09/17(月) 23:38:39
初心者って短いコード=良いコードと勘違いしやすい傾向にあるよね
994デフォルトの名無しさん:2007/09/18(火) 00:28:28
>>993
良いコードとは
どんなコードですか?
995デフォルトの名無しさん:2007/09/18(火) 00:38:14
動作が高速だったり、例外処理がきちんと取れてたり、汎用性があったり、等々
短いだけが能じゃない
996デフォルトの名無しさん:2007/09/18(火) 00:51:10
汎用性が高いからこそのFSO
速度が目的ならAPI逝くわ
チマチマとテキスト切り出して、その手間暇に見合うほどの処理時間が稼げるとでも言うつもりかねw
前時代的なプログラムを惰性のまま書き続けてるマヌケの臭いがプンプンする罠
997デフォルトの名無しさん:2007/09/18(火) 01:13:41
可哀相な子登場w
998デフォルトの名無しさん:2007/09/18(火) 01:31:56
なんだよジジイw
楽にかけるコードも惰性でチマチマとinstrして
「これが正しいコードなんだ 最近の若いもんはブツブツ」とか
ほざいてんのか?
いいかげん硬直した脳を自覚して引退しろよw
999デフォルトの名無しさん:2007/09/18(火) 01:37:54
あとFSOに習熟するとVBSもサクサク作れるようになる副次的な効果がある
汎用性が高いってのはこういうことを言うと思うんだけど、硬直した脳では
そこまで気が回らず、チマチマとinstrやmidが並んだコード書くんだろね

んなことしても
「最近のやつぁ楽しすぎだ いいかぁ例外処理がなぁ汎用性がなぁ」
とかほざくぐらいメリットないよw
1000デフォルトの名無しさん:2007/09/18(火) 01:42:24
Selection.AutoFilter Field:=8, Criteria1:="#N/A", Operator:=xlOr,Criteria2:="#VALUE!"

上のコードを全部のシートでやりたいのですが
↓これだとアクティブシートでしかできません

Sub オートフィルター()
Dim myWroksheet As Worksheet
For Each myWorksheet In Worksheets
Selection.AutoFilter Field:=1, Criteria1:="#N/A", Operator:=xlOr, Criteria2:="#VALUE!"
Next
End Sub

どこを直せばいいのでしょうか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。