●EXCEL・VBA質問スレ Part2●at TECH
●EXCEL・VBA質問スレ Part2● - 暇つぶし2ch127:デフォルトの名無しさん
07/06/13 09:59:13
VBAでグラフを描きたいのですが、第2軸の目盛の最大、最小の指定は
どうすれば良いのでしょうか。
(下記は主軸の場合ですが、どのように変えれば良いのでしょうか)

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

よろしくおねがいします。

128:デフォルトの名無しさん
07/06/13 10:17:52
>>127
操作をマクロに記録して睨めっこ。

129:デフォルトの名無しさん
07/06/13 10:37:42
どこで聞いて良いかわからなかったんだが、
膨大な量の乗車案内を検索かけたいんだが、何か良い方法はないだろうか?
東京→上野
東京→新宿
東京→池袋
東京→・・・
   ・
   ・
   ・

130:117
07/06/13 10:40:04
>>119
ありがとうございます。
現在はその回避方法を採用するつもりです。

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

また、他の回避方法もありましたらお教えください。

131:デフォルトの名無しさん
07/06/13 11:44:24
>>126
具体的には?

132:ここでナット
07/06/13 11:59:54
>>131

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

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

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

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

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

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



133:デフォルトの名無しさん
07/06/13 18:15:41
>>130
当該ブックのみ終了。再現しません


134:デフォルトの名無しさん
07/06/13 18:26:31

>>132
 . . .
具体的には?

URLリンク(dictionary.goo.ne.jp)


135:デフォルトの名無しさん
07/06/13 19:08:08
>>132
エクスポートインポート

136:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/14 01:31:43
すみません、表記間違ってました。

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

  ↓

MsgBox "data.csvは見つかりません"  の間違いです


138:デフォルトの名無しさん
07/06/14 01:35:16
あとじゃなくて先にしろ

139:デフォルトの名無しさん
07/06/14 06:08:04
If Dir("C:\File\data.Csv") = "" Then
 MsgBox "data.csvは見つかりません"
 Exit Sub
End If
 ファイルオープン処理

動かなければどこのコードで動かないのか確認してから考えた方が…。


140:127
07/06/14 10:54:26
>128

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



141:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/14 13:39:11
>>140
With ActiveChart.Axes(xlValue, xlSecondary)
.MinimumScale = 0
.MaximumScale = 1
End With

143:117
07/06/14 13:52:30
>>133
そちらの環境では再現しませんでしたか。
情報ありがとうございます。

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

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

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

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

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

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

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

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

まぁ、そのような状況にならないように、アプリはアドインで作った方がいい。

145:デフォルトの名無しさん
07/06/14 15:33:12
>>143
他の環境でも再現するんだ
何か共通でインストールしてるものに影響されてるのかな?

146:144
07/06/14 15:37:08
URLリンク(sourceforge.jp)から、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


147:117
07/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:デフォルトの名無しさん
07/06/14 19:01:36
>>147
なるほど、おそらく2007固有の現象ということですな
2007持ってないんで他の持ってる人に試してもらいたいね

149:140
07/06/15 09:13:16
>>142
レスありがとうございます

150:デフォルトの名無しさん
07/06/15 16:13:53
Rangeの最初の位置を(左上)得たいのですが、どうするのが簡単なんでしょ。

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

Offsetでよいのかな?うまくいっているみたいですけど

151:デフォルトの名無しさん
07/06/15 16:19:45
ActiveSheet.Range("テーブル[列]")(1)

など



152:150
07/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


153:150
07/06/15 16:30:12
>>152
うああああ、
   CalculateTable (Cell)
じゃなくて、
   CalculateTable Cell
にしたら、エラーでなくなった orz
マジVBAわかんねえええええ。

なんだこら

154:デフォルトの名無しさん
07/06/15 16:37:34
関数単体で引数()でくくるとなりますね

155:デフォルトの名無しさん
07/06/15 21:01:14
たぶん配列とまぎらわしいからだろ

156:初心者
07/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:デフォルトの名無しさん
07/06/17 13:58:01
>>156
宿題だとばれると教えてもらえないから、もう少し、利き方変えた方がいいぞ

あと「よろしくお願いします」って、お前他力本願スギ。
どこが、わからなくて、どこで詰まっているかを質問しよう。

158:デフォルトの名無しさん
07/06/17 14:01:01
(1) sum = sum + x
(2) sum = sum + (2*x -1)
(3) は自分で考えろ馬鹿

159:初心者
07/06/17 15:52:53
すいません。(3)がわかりません

160:デフォルトの名無しさん
07/06/17 16:36:26
sum = sum + (5*x -1)

161:初心者
07/06/17 17:02:14
なぜそうなるのでしょうか?

162:デフォルトの名無しさん
07/06/17 17:12:23
>>160
ワロタ

163:デフォルトの名無しさん
07/06/17 17:48:13
>>161
悪いことは言わん。
算数からやり直せ。

164:デフォルトの名無しさん
07/06/17 18:14:15
なんでまたVBAのスレに質問してくるの?
VBAどころか、ただのアルゴリズム…いや、算数か。の問題だろ。

法則を考えろよ…。

165:デフォルトの名無しさん
07/06/17 18:27:48
言っておくけど160のは違うぞ。

ヒント。
sum=1+4+9+16+25+36+49+64+81+100
これで分からなければ終わってる。

166:デフォルトの名無しさん
07/06/17 18:41:58
気がつかなかった俺オワタw

167:デフォルトの名無しさん
07/06/17 18:46:23
わからない。答え教えてもらえないですか?

168:デフォルトの名無しさん
07/06/17 18:56:47
(3)は
sum=sum+(x*x)


169:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/17 19:06:07
コーディングより1+4+9+…+100が全くわからなかった。
オワテルwww

171:デフォルトの名無しさん
07/06/17 19:30:52
をいをい…。

つうか>>156、その問題は学校の問題か?職場の問題か?

172:デフォルトの名無しさん
07/06/17 20:30:10
>>169
ヒント:「For x = 1 To 10」部分は固定

173:169
07/06/17 21:01:49
>>172
ん?
(2)のことならxでループさせてないんだけど?
試してないからわからんけど、ネストされたForで答えでない?

意味取り違えてたら堪忍

174:初心者
07/06/17 21:49:26
2乗はどうあらわしたらいいのですか?

175:デフォルトの名無しさん
07/06/17 21:55:05
>>174
>>169

176:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/18 00:10:28
偉そうに答えてる人の方がネタに見える…
(1) sum = x + sum
(2) sum = x * 2 - 1 + sum
(3) sum = x ^ 2 + sum


178:デフォルトの名無しさん
07/06/18 00:55:34
>>177

ありがとうございました!独学なんで分からないところがたくさんですm(__)m

179:デフォルトの名無しさん
07/06/18 01:03:28
>>178
Excelより先に算数の勉強をし直した方が良いぞ。

180:169
07/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:デフォルトの名無しさん
07/06/18 04:00:12
ネタなのはわかるがiはどこから出てきたんだw

182:デフォルトの名無しさん
07/06/18 16:22:16
EXCEL2003です。
半角アルファベット文字列の先頭だけ大文字にしたいのですが、
適切なものが見つかりません。

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

helloWorld → HelloWorldとしたいのですが、適切な方法を
教えていただけますか?

183:デフォルトの名無しさん
07/06/18 16:54:13
最初の一文字を取り出して大文字にすれば?

184:デフォルトの名無しさん
07/06/18 17:31:56
s = "helloWorld"
Mid$(s, 1, 1) = UCase$(Mid$(s, 1, 1))


185:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/18 22:32:41
>>185
横レスだが、勉強になった

187:デフォルトの名無しさん
07/06/18 22:41:49
つかMidって参照だけかと思ってたw

188:デフォルトの名無しさん
07/06/18 23:11:52
MSbasicからの伝統で、mid$は関数版とステートメント版がある。

189:デフォルトの名無しさん
07/06/19 12:08:51
エクセルソフトを持ってないので、フリーソフトのOPENOFFICEを使用
ダウンロードしてVBAは作成できるんでしょうか?

190:デフォルトの名無しさん
07/06/19 13:18:08
>>189
アレ使えばね
具体的な話はスレ違いなので伏せるけど

191:デフォルトの名無しさん
07/06/19 14:45:55
日本語で書け

192:デフォルトの名無しさん
07/06/19 14:54:14
全くだ
質問内容は察せるが、日本語じゃないよな

193:デフォルトの名無しさん
07/06/19 21:26:28
みなさん、こんばんは。

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

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

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








194:デフォルトの名無しさん
07/06/19 21:46:07
汎用アルゴリズムの話はスレ違い
VBAどころかVBも関係ないし

195:デフォルトの名無しさん
07/06/19 21:58:39
ワークシート埋め尽くす方法ぐらい教えてあげたらw

196:デフォルトの名無しさん
07/06/19 22:13:28
フーリエ展開してしまえw

197:デフォルトの名無しさん
07/06/19 22:48:00
>>189
>エクセルソフトを持ってないので

ちょwww、当たり前だwww

エクセルソフト
URLリンク(www.xlsoft.com)

198:デフォルトの名無しさん
07/06/19 23:24:31
インテルのコンパイラ高いな

199:使えない子
07/06/20 14:59:47
上司からいきなり「調べといて」
キタ──ヽ(´Д`;)ノ──!!!

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

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

[新しいマクロの記録]をしても記録されないので、
困ってしまいました。
マクロやVBA等でやるには、どうしたらよいでしょうか。
どなたかお力添えください。m(_ _)m


200:デフォルトの名無しさん
07/06/20 15:33:41
>>199
やってみたら記録されたけど?
Sheets("Sheet1").Copy

201:デフォルトの名無しさん
07/06/20 18:34:08
記録を停止してない
なんてオチだったりしてW

202:デフォルトの名無しさん
07/06/21 00:02:18
前任の作ったエクセルファイル+VBAを別ファイルで再構築しているのですが、
errors(0).description の部分でエラー「コレクションが存在しません」になります。
元のファイルでは正常に動いているのですが、
新しいファイルではどのようにしたら回避できるのでしょうか。

203:デフォルトの名無しさん
07/06/21 00:09:31
参照設定

204:202
07/06/21 00:42:58
レスどもです。Excelは2000で、
Microsoft DAO 3.6 Object Libraryの参照設定はチェック済なのですが
それでもエラーが出てしまいます。
他にも必要な参照があるのでしょうか。

205:デフォルトの名無しさん
07/06/21 00:46:51
エラーなければerrorsコレクションはないだろ
まずファイルの問題か環境の問題かはっきりさせること

206:202
07/06/21 01:30:40
確かにそうですね。
言われてみればそもそもここはエラートラップなので
他の部分に問題がある可能性大です。切り分けに挑戦して見ます。

207:193
07/06/21 02:00:10
>三角波のデータ

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

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

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

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


自分で自分を褒めてやりたいです。


208:デフォルトの名無しさん
07/06/21 08:37:41
うわ、重そう。つーか、頭悪そう。

209:デフォルトの名無しさん
07/06/21 14:47:30
お聞きしたいんですけど
コンボボックスのプロパティのLinkedCellに値が入らないのですが
どうやって入れるのか教えてください

210:デフォルトの名無しさん
07/06/21 20:48:44
普通に=で代入するか、プロパティウィンドウに入力するかだよ
間違った値入れてなければそれでOK

211:デフォルトの名無しさん
07/06/22 00:02:30
>>208

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

おめぇ、つくってみ?
ってか、つくれる?


212:デフォルトの名無しさん
07/06/22 00:04:35
>>211
本人乙。

213:デフォルトの名無しさん
07/06/22 00:38:54
>>211
煽ったら作って貰えると思って必死だな。
今宵は枕が涙で濡れてるんぢゃねぇの?

214:デフォルトの名無しさん
07/06/22 00:48:37
バイナリーファイル(テキスト形式でないファイル)を開いて、
nバイト目の数字を読み込むっていうプログラムを組みたいのですが、
VBAでできますか?


215:デフォルトの名無しさん
07/06/22 00:56:55
よゆう

216:214
07/06/22 11:34:20
ちょっとしたヒントだけでも教えてつかわさい。


217:デフォルトの名無しさん
07/06/22 12:47:31
open filename for random as #filenumber len=1
get #filenumber, n, buf

218:214
07/06/22 15:54:48
えっ、まじですか。
N88BASICとまったく同じぢゃ・・・


219:デフォルトの名無しさん
07/06/22 15:56:42
そりゃぁ、MicrosoftBasicの派生だからねぇ。どっちも。

220:214
07/06/22 18:54:47
わしもスレに貢献しよう
arcsin(sin(t/T*2π))
って
t/T*2π
と同じでしょうw

つりか・・・まじか?


221:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/22 23:51:21
>>220
前者は周期関数になる。元レスは、それを使って三角波にできると悦に入っていたらしい。

223:デフォルトの名無しさん
07/06/23 08:35:42
>>221
スレ違い。>>16

224:デフォルトの名無しさん
07/06/23 13:52:35
>>223
スレ違いで拒否るのもいいが、いい加減過疎ってないか?このスレ
あと質問に答えても質問者もほったらかし多いし・・・
俺はわからんから答えんだけだが

225:デフォルトの名無しさん
07/06/23 15:11:42
> いい加減過疎ってないか?このスレ
この板はこんなものだよ
一応ここは過疎板だから

当然、この板にもここより賑わってるスレはあるが
このスレでも平均以上どころか勢い上位1割に入るほど
もっと静かでもいいくらいだ

226:デフォルトの名無しさん
07/06/24 08:44:32
あるRangeの一番左上のセルの情報を得たいのですが、
どうしたらよいでしょうか?
Offsetだと、Range全体が取得されてしまいます。
左上のセルのRangeだけを得たいのですが・・・

ActiveSheet.Range("資産表[資産]").Offset(0, 0).Select

227:デフォルトの名無しさん
07/06/24 08:47:10
>>226
自己解決しました。

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

Cellsでした。Rangeにないかと思ってました。

228:デフォルトの名無しさん
07/06/24 09:49:10
すみません、質問です。

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

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

抽出し、別シートに移すことは出来たのですが、それを元の所に
上書きするのには、どうしたらいいのでしょうか?
切実に困っています。教えていただけたら嬉しいです。

229:デフォルトの名無しさん
07/06/24 10:20:48
抽出した行と元の行を関連づければいいでしょ
方法はいくらでもあるけど
一番簡単なのは別のシートの同じ行に抽出するやり方かな

230:デフォルトの名無しさん
07/06/24 12:15:43
>>228
商品Noをkeyにして.findメソッドで検索して
コピーするVBAをつくる

231:デフォルトの名無しさん
07/06/24 12:16:46
同じ行への抽出だとわざわざ抽出する意味がないと言われます
関連付けっていうのはどのようにやるのですか?

232:デフォルトの名無しさん
07/06/24 12:37:17
すみません、書き込みしている最中に書き込んで頂いてたみたいです。
わかりました、まだKeyとかFindメソッドの使い方が上手ではないのですが
月曜日にがんばってみます。

もしまた解らなかったら書き込みしにきます。
そのときもよろしくお願いします。
ありがとうございました。

233::
07/06/25 23:05:08
マクロ使って初心者でも簡単に作れるプログラムって何かあります?
課題でなんでもいいから作ってこいって言われたんですけど何を作ればいいのやら。
参考書買うしかないんすかね~お勧めのWEBサイトありますか?

234:デフォルトの名無しさん
07/06/25 23:07:54
MsgBox "Hello World!"

235:デフォルトの名無しさん
07/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で変数を使う方法すらわからない・・・

236:235
07/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:デフォルトの名無しさん
07/06/26 01:08:48
ExcelVBAで、サブルーチンのネストはできますか?

238:デフォルトの名無しさん
07/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
の値も変わる。でも、下の方は変わらない。
それだけじゃないけどな。

239:235
07/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:デフォルトの名無しさん
07/06/26 01:47:48
>>239
ああ、確かにVLOOKUPだな。
この感じだと、セルD4に 「=VLOOKUP(A1,B:C,2)」って入るよな。
それをセルD10まで下にコピーするのじゃいけないの?



241:235
07/06/26 01:58:26
>>240
各1万行くらいで行数が不定なのです
まとめて出来る(で、forより早い)方法があればvlookupでなくてもなんでもいいのですが


242:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/26 03:15:16
>データが各1万行とかになったら速度が恐ろしいことになりまして

実行中の画面描画をOFFにしてないんじゃない?
そこ変えるだけで解決することもあるよ

244:デフォルトの名無しさん
07/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に戻して下さい。

URLリンク(www.asahi-net.or.jp)


245:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/27 00:07:51
 A     B    C       D
東京  東京  東京  =LOOKUP(A1,B:B,C:C)
     大阪  大阪
     愛知  名古屋
     福岡  福岡
     北海道 札幌


とするとD1が名古屋になるんだけど気のせい?

247:235
07/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)
見ていただければ幸いです
URLリンク(bebe.run.buttobi.net)

248:デフォルトの名無しさん
07/06/27 01:10:52
2003personalだとエラーが出て開けない

249:235
07/06/27 01:21:05
うゆー

ってか、今更xlsを発見した。すまねぇ
URLリンク(bebe.run.buttobi.net)

250:デフォルトの名無しさん
07/06/27 01:27:13
なんか昔、これの横バージョンを総合相談所のほうでコード書いた気がする…

251:デフォルトの名無しさん
07/06/27 01:52:19
横バージョンじゃなくて、似たような表の作成だった。
相談所55の部品表のをいじればなんとかなるんじゃないかな。
実行速度もシートをメモリに読み込んですれば大丈夫だろう。
もう寝る。

252:245
07/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

253:245
07/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:デフォルトの名無しさん
07/06/27 21:42:09
をいをいw

255:デフォルトの名無しさん
07/06/27 23:38:13
>>254
どうした?

256:デフォルトの名無しさん
07/06/28 09:32:06
>>252
>>245関連ではないのだが、

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

これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?


257:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/28 19:38:54
Shift:=xlToRight

259:235
07/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:デフォルトの名無しさん
07/06/29 00:24:35
値のコピー貼付をワークブック間で行いたいのですが、
' ①コピー元
Workbook("").Sheets("").Activate
Range("").Copy
' ②コピー先
Workbooks("").Sheets("").Activate
Range("").Select
Selection.Pastespecial Paste:=xlValues

ファイルをまたぎ、かつ値貼付の場合このような段階を踏まないとエラーになってしまいます。
同シート内での値コピーに使える Range("").Copy Range("").Pastespecial
またはRange("")=Range("") のような簡潔な記入法は無いものでしょうか?

261:デフォルトの名無しさん
07/06/29 00:42:07
ですてぃねーしょん


262:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/29 16:35:16
>>256
わけ。特に珍しい手法ではない。

Dictionaryやfsoは便利なので結構良く使うと思う

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

267:デフォルトの名無しさん
07/06/29 23:03:58
ShowしたUserFormってどうやって閉じていますか?

UserForm1.Close

こんなのないよね?

Unload Meってのはいまいち分からない。不便。

268:デフォルトの名無しさん
07/06/29 23:08:07
Unload UserForm1

269:デフォルトの名無しさん
07/06/29 23:24:03
>>268
サンクス

270:デフォルトの名無しさん
07/06/29 23:25:06
>>265
どこが思ったように動作しないのか説明がないけど
抽出したあとCopy使えばいいよ

>>267
UserForm1.Hide

271:デフォルトの名無しさん
07/06/30 00:04:38
>>270
Hideは見えなくなるだけ

272:デフォルトの名無しさん
07/06/30 00:46:27
>>271
うん、でも>>268の人がもう答えてたから他のを書いた
あと一応はShowとHide、LoadとUnloadが対応になってるかなと思ってるし

273:デフォルトの名無しさん
07/06/30 01:35:58
Accessではclose使えるのに
どうしてExcelではだめなのでしょう?

274:262
07/06/30 01:50:26
263
ありがとうございます。
ワークシート関数ってオーバーフローするイメージがあるので、あんまり好きじゃないのです。


275:デフォルトの名無しさん
07/07/01 00:50:52
>>92
Application.FileSearchは削除されたよ。
以前から挙動不信だったんで、存在そのものを抹消したのだと思われ。

276:デフォルトの名無しさん
07/07/01 03:23:57
5人で30回じゃんけんをして、出した手をB~Fに書き込み、勝敗をG~Kに
書き込むマクロを短めで作りたいのですが、勝敗パターンを作る以外の方法が思いつきません。
よろしくお願いします。


277:デフォルトの名無しさん
07/07/01 04:25:41
>>276
>>16
さようなら

278:デフォルトの名無しさん
07/07/01 08:47:13
>>275
あー確かに挙動不振だな

279:デフォルトの名無しさん
07/07/01 09:19:11
置換について質問です。
以下の様にすると、"さんま"という文字列を"魚"に置換できるのですが、
"さんま"、"タイ"、"いわし"のいずれかの場合に"魚"に置換する場合はどうやって指定しますか?

Selection.Replace What:="さんま", Replacement:="魚"

280:デフォルトの名無しさん
07/07/01 09:31:10
>>279
with Selection
.Replace What:="さんま", Replacement:="魚"
.Replace What:="タイ", Replacement:="魚"
.Replace What:="いわし", Replacement:="魚"
end with


281:デフォルトの名無しさん
07/07/01 09:38:53
>280
ありがとうございます!

282:デフォルトの名無しさん
07/07/01 10:13:19
>>276
総合で訊いてる奴だよな?

283:280
07/07/01 10:20:13
>>281
ぉぃ! まさか、こんなこと訊いてるんじゃないよなぁ...と思いながら、
答えてみたんだが、解決かよ(-_-#);


284:デフォルトの名無しさん
07/07/01 10:57:24
釣りだろ

285:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/01 15:26:32
>286

有難うございます。
試してみましたところ、シートBが選択された状態では動作しました。
シートAが表示された状態で実行すると、
「アプリケーション定義またはオブジェクト定義のエラーです」となります。

288:デフォルトの名無しさん
07/07/01 19:25:16
Σ(゚∀゚;) ?

289:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/01 20:52:21
>>289
これって>>286と何が違うん?

291:デフォルトの名無しさん
07/07/01 22:42:36
Excel2003なのですが、
VBエディターで編集したマクロをリロードするための
ファンクションキーってありますでしょうか?


292:デフォルトの名無しさん
07/07/01 23:01:44
エクセルの2つのシートを比較するマクロを作っているのですが、
行と列のサイズが大きくなると処理が重くなります。

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

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

使われているシートの範囲を読み取るとか
範囲を設定するとかすればいいと思っています。
指摘などありましたらよろしくお願いします。

293:デフォルトの名無しさん
07/07/01 23:19:53
>>292
Dim s As Range
Set s = ActiveCell.SpecialCells(xlLastCell)
MsgBox s.Column & " " & s.Row


294:デフォルトの名無しさん
07/07/02 20:40:46
arry(あ,い,う,え,お)
を、
ExcelのセルA1~E1に
一気に貼り付ける方法てないですかね。

For文で順番に
セルA1に「あ」を入れて
セルB1に「い」を入れて…
というのは分かるんですが。
なんかもっとこう効率良いやり方ないかな。

295:デフォルトの名無しさん
07/07/02 21:05:35
>>294
おしい、そこまでいけて何故できないw
Range("A1:E1") = Array("あ","い","う","え","お")

是非感想を。

296:デフォルトの名無しさん
07/07/02 21:14:58
>>295
で、できたー!!

ありがとう。これでよかったのか…
Pasteにばっか気をとられてたわ。

297:デフォルトの名無しさん
07/07/03 00:16:07
VBAのコードを含んだブックを余所にあげたりするとき、デジタル署名とか
どうしてますか?

律儀にベリサインから買ったりしてるんでしょうか?

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

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

既に署名を持っているならともかく、予算的にExcelの為に申請なんて出せないし。

299:デフォルトの名無しさん
07/07/03 09:15:58
売る場合はともかく、あげる場合は向こうで勝手に対応してもらう

300:デフォルトの名無しさん
07/07/03 11:31:57
Set objIE = CreateObject("InternetExplorer.application")
で、IEを起動しています。
なんらかの操作で、IEのウインドウが最小化された場合に備えて、それを「元のサイズに戻す」の
処理を行いたいのです。
検索してみたところ、VBでは、SW_SHOWNA の利用で良いみたいですが、
同様の処理をVBAで行いたいのです。
ojbIEに対して処理を加える方法は無いでしょうか?
他に考えたのは、API32を参照しobjIEとは関係なく処理を行うですが、そうした方が良いのでしょうか?
よろしく御願いします。


301:デフォルトの名無しさん
07/07/03 12:10:35
>>300
>>16

302:デフォルトの名無しさん
07/07/03 12:41:01
厳しいなあw

303:300
07/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:デフォルトの名無しさん
07/07/03 18:42:33
>>295
それ、A1:E1ならできるけど
A1:A5だとうまくいかない。なんでだろ?

305:デフォルトの名無しさん
07/07/03 20:17:56
>>302
× スレ違い指摘が厳しい
○ 質問者がVBAの範疇を理解してない

306:デフォルトの名無しさん
07/07/04 17:34:35
VBAというか、プログラミングの初心者です。
変数のスコープ(有効範囲?)のことでハマッっています。

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

こんなボケに対する、どなたかツッコミをお願いします。

307:デフォルトの名無しさん
07/07/04 17:47:03
Msgbox(UserForm1.a)

理由:ユーザフォームはモジュールではなくクラスだから

308:304
07/07/04 19:03:53
自己解決。
これでいけた。

Range("A1:A5") = Application.Transpose(Array("あ", "い", "う", "え", "お"))

309:306
07/07/04 22:42:37
>>307
助言くださったとおり、うまくいきました。理由を書いてくださったのがヒントになり、
Public変数をUserFormではなく標準モジュールのほうで宣言すればいいことに
気がつきました。どうも有難うございました。


310:デフォルトの名無しさん
07/07/05 12:37:25
>Public変数をUserFormではなく標準モジュールのほうで宣言すればいい

死ね

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

困ったわ。どうすればいいのかしら?……
 パンティを手に持ったまま、美沙緒は考えこんでしまった。
 
康彦は十四歳の中学二年生。七つ年上のいまの夫と大恋愛に落ちた美沙緒が、
周囲の猛反対を押しきって、十八歳のときに産んだ子だ。
 
その康彦の不可解な行動に美沙緒が最初に気づいたのは、もう一年近くも前のことになる。

312:デフォルトの名無しさん
07/07/05 21:23:27
小学生の頃、同じクラスのヤシんちに行った。ソイツの姉ちゃんは高校生でキレイだった。

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

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

313::
07/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:デフォルトの名無しさん
07/07/06 23:04:40
>>313
VBAを使うまでもない。よってスレ違い。

315:デフォルトの名無しさん
07/07/06 23:18:00
>>310
>死ね

って、どういう意味ですか?

316:デフォルトの名無しさん
07/07/06 23:24:52
>>315
つ[辞書]
つ[goo.ne.jp]

317::
07/07/07 01:04:04
>>314
課題でどうしてもVBAを使ってやらないとだめなんです。
まだはじめたばかりで普通にやったほうが早いんですけど。
せめてどのような文法を使ったらいいのかだけでも教えてもらえませんか?


318:デフォルトの名無しさん
07/07/07 01:54:03
>>317
ここは宿題スレじゃない

319:デフォルトの名無しさん
07/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
07/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:デフォルトの名無しさん
07/07/07 16:26:12
シート2に顧客番号と名前のリストを置いて、
シート1のA1に、例えば「10」と入力した時にそれに対応するシート2の
顧客番号10番の名前を、シート1のA2に表示させたいんですが。
初心者の俺でもできるかなと思いましたが分かりませんでした。 orz

よろしくお願いいたします。

322:デフォルトの名無しさん
07/07/07 16:56:22
>>321
それを何故VBAでやりたい?
シートだけでできるっしょ。

323:デフォルトの名無しさん
07/07/07 17:06:56
B列にhh:mm:ss形式で入っている時刻をまず文字列(’シングルクォーテーションをいれるみたいなイメージなんですが)にして、
次にA列の文字列と連結してC列に表示していきたいのですが、
B列のhh:mm:ss形式をそのままの形で文字列にするにはどうすればよいのでしょうか?


324:デフォルトの名無しさん
07/07/07 17:28:31
しょうがねぇなぁ……
手元にOpenOfficeしかないから適当に読み替えて試してくれ。

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

>>323
C5
=a5&text(b5;"hh:mm:ss")

325:321
07/07/07 17:59:42
>>324
早速のレスありがとうございました!
試してみてエラーが出たので悩みましたが、
=VLOOKUP(A1,Sheet2!A1:B9999,2,TRUE)
でうまくできました!

2人でやっているお店で店長が入院してしまい、自分1人ですべてこなすために
手書きでやっていた部分の仕事をどうしても合理化しなくてはいけなかったので
とても助かりました。ありがとうございました。

326:321
07/07/07 18:56:36
すみません、追加で質問させてください。

顧客が9999人だった時に、10000以上の数字を誤入力してしまうと
9999番目の人が表示されてしまいます。データの入力規則で縛ろうにも、
毎日顧客は増えていきますのでその度に手直しできません。
良い知恵がありましたらよろしくお願いいたします。

327:デフォルトの名無しさん
07/07/07 18:57:55
数式を穴があくまで見つづけろボケ

328::
07/07/07 22:05:29
>>320
まじでありがとうございます。
自分もこんなふうにできるようになりたいです

329:デフォルトの名無しさん
07/07/07 22:09:53
>>328
1週間くらい勉強すれば、このくらい出来るようになるよ

330::
07/07/07 22:29:29
お世辞だよ

331:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/07 23:03:30
そりゃぁ、exitでforから抜けちゃってるからねぇ。

333:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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
07/07/08 01:15:38
引数に"TRUE"を使うからそうなる。
"TRUE"だと完全一致しなくてもデータを読んでしまうので
"FALSE"(完全一致必須)にするのが一般的

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

ところでここVBAスレなんだけど…

336:321
07/07/08 02:56:27
>>335
詳しく解説していただき本当に感謝です。
正直、TRUEやFALSEの意味もろくに分かっていなかった自分です。
スレタイだけ見てここで質問してしまい、大変お邪魔しました。

337:デフォルトの名無しさん
07/07/08 07:08:08
>>335
ExcelとVBAの質問スレらしいよ

338:デフォルトの名無しさん
07/07/08 07:55:16
×ExcelとVBAの質問スレ
○ExcelのVBAの質問スレ

例えスレ立て主の意図が前者だろうと、2chの規則的には
プログラム技術板でExcelのVBA以外の話は板違いになるからね

339:デフォルトの名無しさん
07/07/08 11:08:17
すこしスレ違いだが、皆さん大丈夫?

URLリンク(itpro.nikkeibp.co.jp)
Excelレガシー問題

340:デフォルトの名無しさん
07/07/08 12:02:44
SOXで大変なのは全体最適を考えてこなかった
その記事で言う情報システム部門の方なんじゃね?

未だ運用もはっきりしないのにあと半年少々でどうするんだろ。

341:デフォルトの名無しさん
07/07/08 15:40:12
80以下なら赤
90以下なら黄色
100以下なら緑

といったようにセルに入力された値によって
背景色が変わるという列を作りたいのですが
どうすればいいのでしょうか?


342:デフォルトの名無しさん
07/07/08 16:35:29
それをVBAでしたいの?
そうでなければスレ違い。条件付き書式ググれ。

343:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/08 19:15:00
問題の原因はおまえのプログラム

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



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

それはさておき、5行ずつ選択して選択範囲だけcsvで保存して、後でまとめてマージってのはどうだろう。

347:デフォルトの名無しさん
07/07/09 00:32:33
>>344
その可能性が高いとは思うのですが、どうも納得できない部分もあります。
具体的な原因をお教えいただけますか?

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

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

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

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

一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、
また、数千ファイルを読み込んだ時点でエラーが発生するかも知れないという不安です。
難易度はどれくらいでしょうか?

348:デフォルトの名無しさん
07/07/09 01:23:02
>>347
ひとつのsheetにまとめるかわりにcsv形式でまとめる
openとwrite使えばOK
エラーの原因はリソースを食いつぶすからだろ
おそらくこれでだいぶリソースの使用が減ると思うが
全部処理できるかはわからない


349:デフォルトの名無しさん
07/07/09 07:11:07
> 一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
知らなければ勉強すればいいだけ。生まれたときからこの世の全てを知ってる人間なんて居ない。

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

難易度は「入門者→初心者」の移行レベルくらい
これが出来たら、VBA入門者(門を潜っただけ)ではなくVBA初心者(初歩的なことなら出来る)を名乗っても良い

350:デフォルトの名無しさん
07/07/09 10:13:29
>>343
newbookは開放してるけど、wb2やws2は開放しないのか?

351:デフォルトの名無しさん
07/07/09 19:34:56
Excel2003でユーザフォームをもちいて抽出フォームを作成しているのですが
コマンドボタンを押すと
配列(多次元)のデータをユーザフォーム上に表示させるには
どのパーツを使えばいいのでしょうか?

352:デフォルトの名無しさん
07/07/09 20:59:27
>>351
Grid系

353:デフォルトの名無しさん
07/07/09 21:42:18
>>352
Webで検索してもあまり情報が出てこないのですが
オススメな参考書とかありますか?

354:デフォルトの名無しさん
07/07/09 22:01:16
>>351
listbox

355:デフォルトの名無しさん
07/07/09 23:21:22
>>348
>>349

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

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

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

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

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

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


色々とヒントを下さって、ありがとうございました。

356:デフォルトの名無しさん
07/07/09 23:45:14
VBAはvariant使わずにきちんと宣言するのとしないのでは実行時間がかなり違ってくるよね。
膨大な処理をするときは1ファイルあたりの処理時間をきちんと計ってコードを組むとかなり早くなったよ。
10倍ぐらいは変わった。


357:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/10 01:17:06
>>357
↓を付け足す
Function Text(a, b)
 Text = Format(a, b)
End Function


359:デフォルトの名無しさん
07/07/10 01:25:40
>>358
できました。
すばやい、レスありがとうございました。


360:デフォルトの名無しさん
07/07/10 01:34:50
超初心者の質問で申し訳ないです。。
VBAを使って、画面に表示された方向キー(↑↓←→)を押して、1分間にどれだけ成功できるか・・・
のような感じのゲームを作ることはできないものでしょうか?
頭の中でふと浮かんだのですが、プログラムを組もうとすると進めなくて困っています。
もしわかる方おりましたら、可能か不可能かだけでも結構ですので教えてくださいm(_ _)m


361:デフォルトの名無しさん
07/07/10 01:42:30
>>360
URLリンク(cgi30.plala.or.jp)


362:デフォルトの名無しさん
07/07/10 01:48:41
>>361
誘導ありがとうございます。
スレ違いでした。失礼しました。

363:デフォルトの名無しさん
07/07/10 11:57:18
>>361
スレチだが、そこのCell雀の完成度の高さにびっくりした。

364:デフォルトの名無しさん
07/07/10 22:35:57
ExcelとVBAでマインスイーパー作ったりできますか

365:デフォルトの名無しさん
07/07/10 22:39:42
やる気と根気があればできるはず
がんばれ


366:デフォルトの名無しさん
07/07/10 23:20:05
暇で作った事あるけど同等のゲームならすぐ出来るよ。
UIまでコピーしようと思うとそれなりに大変だろうけど。

367:デフォルトの名無しさん
07/07/11 00:10:18
>>339
excelをそのまま基幹で使う会社
なぞ、どうぞ逝ってくれ


368:デフォルトの名無しさん
07/07/11 18:47:02
medianをVBAで使ってたら特定の数列で無限ループしやがるorz
しかも同じ数列単体で検証しても問題なし
しょうがないからロジックくんだがこんな経験したことある人いる?
XPでも2003でも再現した
数列ったってこんなんだぞ。0, 0, 0.6, 0


369:デフォルトの名無しさん
07/07/11 21:55:59
携帯から失礼します。 
VBAはユーザーフォームを勉強し始めたレベルなのですが 
Win32 API の存在を知り、エラー音とかに使ってみたくなりました。 
具体的にどのように記述すれば良いでしょう? 
ご教授いただけますか?



370:デフォルトの名無しさん
07/07/11 22:31:45
>>369
スレ違いもここまで来るか…
スレリンク(tech板)

嫌味ではなくVBAを勉強し始めたレベルでは意味不明だと思われ。
ざっと教授するだけで数百ページの本になる。

371:デフォルトの名無しさん
07/07/11 22:48:02
mciくらいならVBAでもすぐできるだろうに

372:デフォルトの名無しさん
07/07/11 23:10:39
ハマりました~どなたか助けてください~(´Д`;)

開発環境:
Windows 2000, Excel 2000

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

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

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

タスケテー

373:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/12 11:54:13
ごめん
範囲Aと範囲Bの重なっているセルの取得って
どうやるんだっけ?

プロパティかなんかであった気がしたんだけど
ヘルプ見てもみつからなかった(´・ω・`)

375:デフォルトの名無しさん
07/07/12 13:22:36
>>374
Intersect(範囲A,範囲B)

376:374
07/07/12 13:38:04
>>375
おぉありがとん(`・ω・´)

377:デフォルトの名無しさん
07/07/12 22:58:16
>>373
遅ればせながらレスありが㌧(・∀・)
なんか、GetSaveAsFileNameっていうまんま直球どストレートな
メソッド発見しますた~お騒がせしました~

378:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/13 00:11:06
exit do

380:デフォルトの名無しさん
07/07/13 00:36:18
378です。
どういう風に入れたら良いでしょうか?
すみません、宜しくお願いいたします。

381:デフォルトの名無しさん
07/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

382:381の続き
07/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:デフォルトの名無しさん
07/07/13 09:46:41
>>381さん・・・
>378です。

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

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

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



384:デフォルトの名無しさん
07/07/13 10:30:54
不十分の意味がわからない、どうしたいんだ

385:デフォルトの名無しさん
07/07/13 11:28:40
>>383
>If x < 2 Or 30 < x Then n = -n
反転の判定をしている、ここで処理してもらいたかったんじゃないのか?

386:384
07/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:デフォルトの名無しさん
07/07/13 20:01:34
会社での昼休み、
ウイルスバスターが動いててすごく重いけど、
どうしても直したいマクロがあって、開いていじってた。

PCがフリーズした。

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

バックアップは、きちんと取りましょうという教訓でした…

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

まあメディアに焼いたところで、トラブル時もHDD上の1週間分だけで復旧は事足りることがほとんどだけどね


389:デフォルトの名無しさん
07/07/13 21:55:37
FolderShareをつかって他のパソコンと同期させておくだけでも最低限のバックアップにはなると思う。

390:デフォルトの名無しさん
07/07/13 22:24:26
俺はソフトで差分バックアップしてる
重要なデータExcelだけじゃないし楽だし早い

391:デフォルトの名無しさん
07/07/13 23:27:17
>>381さん
>>386さん

>378です。

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

有難うございました!


392:デフォルトの名無しさん
07/07/14 09:54:31
>>390
外部からだと作業の途中経過のバックアップは取れないからな
問題が起きたときに前回保存時まで戻されるのは勘弁してほしいってデータは
外部の汎用バックアップソフトではなく、内部のマクロで途中経過のバックアップを取った方がいい

393:デフォルトの名無しさん
07/07/14 12:56:32
バックアップとは言え、マクロ動かしっぱなしにしてたらメモリ食わない?

394:デフォルトの名無しさん
07/07/14 13:32:56
>>392
俺の使ってるソフト、圧縮機能はない
URLリンク(www.forest.impress.co.jp)
開いているファイルでもバックアップできるし作業途中で保存していればその分更新される
Officeのように自動保存機能があるソフトならより万全
途中経過が保存される前にPC固まったら駄目だけど、そのマクロも同じだろ?

395:デフォルトの名無しさん
07/07/14 18:04:44
>>393
当然食うよ
搭載メモリ量の10000分の1以下だから気にならないけどね


>>394
マクロの場合
> 作業途中で保存していれば
なんて条件は付かない
保存もマクロでやるからね
Officeの自動保存機能はバグあるし

396:デフォルトの名無しさん
07/07/15 10:15:02
VBA画面だとスクロールボタンが使えなくて不便だな。
ぐぐったら「Intelipoint 4.1を入れると直る」と出てきたけど、
うちのMicrosoftマウスはこのバージョンに対応してないしな。

397:デフォルトの名無しさん
07/07/16 12:01:06
Excel2000のVBAプログラミングでウィザード形式のユーザーフォームって
つくれますか? StarSuiteのBasicにはその仕様があるのですが、
VBAに関してはググってもなかなか直に解説してあるページがみつからなくて。

現在、同じサイズのユーザーフォームをいくつか用意してそれを順番に表示させる
ことで「ウィザードもどき」にしているんですが・・・・

398:デフォルトの名無しさん
07/07/16 20:33:23
>>397
コンテナになるコントロール使えば良いだけの話
これで解らなければあとはVBAではなくVBの分野なので
そっちの方向で勉強してね

399:デフォルトの名無しさん
07/07/17 00:11:19
>>398
どうも有難うございます。調べてみます。

400:デフォルトの名無しさん
07/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

どなたかご教授願います。

401:A(T) * 10じゃなくてT * 10
07/07/17 10:40:03
>>400
それのどこがVBAの質問なのかと。basicの基本以下のレベルジャマイカ。

402:デフォルトの名無しさん
07/07/17 11:21:45
>>400
debug.printから出直せ。その方が君の為だ。

403:>>401 それを指摘するならA(T) = T * 10だな
07/07/17 11:27:02
>>400
ループ制御変数と個数の定数が混在しているぞ。

404:デフォルトの名無しさん
07/07/17 14:52:21
最近の学校の課題はエクセルVBAをやらせるのか…。
>セルA1~A10にはゼロしか出てこなくてorz
 ↑当たり前だ。403の名前欄を参照。
>Cells(C, 1) = A(N)
 ↑全部のセルに同じ値が出るに決まってるだろ。

まさかプログラマを目指してるとか言わないよな?

405:400
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/18 09:54:41
>>405
どう見てもこの後ループを纏めることになるので、先回りしておけ。

408:デフォルトの名無しさん
07/07/18 13:21:11
開いていないファイルのセルデータをVBAで直接取得する方法ってありますか?

現状はセルに式を入力してから変数に代入、セルを削除
または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです

409:デフォルトの名無しさん
07/07/18 13:27:58
バイナリ解析して直接描くならひらかずにどうぞ


410:デフォルトの名無しさん
07/07/18 13:44:57
>>408
そのファイルがCSVならそれほど難しくないでしょう。

411:408
07/07/18 14:12:48
>>409
難しくて私には分かりません

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

ファイルを開けば
A = Workbooks(ファイル名).Sheets(シート名).Range(範囲)
で取得できるのでどこかを少し弄ればどうにかなるのかなと思ったんですけど・・・


412:デフォルトの名無しさん
07/07/18 14:21:39
内部的に開いていいなら(表示はしない)簡単だけど、全く開かずとなると無理っす
バイナリ解析するにも先ずはファイルをOpenしないと始まらないし

413:デフォルトの名無しさん
07/07/18 16:03:15
>>412
どうやら無理そうですね

開かずに済むセルに入力して・・・ の方法で処理しようと思います
ありがとうございました

414:デフォルトの名無しさん
07/07/18 18:48:05
>>408
VBAじゃないけど参照で良ければ。
='c:\Documents and Settings\hoge\My Documents\[book1.xls]Sheet1'!a1
とか

415:デフォルトの名無しさん
07/07/18 20:21:15
>>413
VBA以前のExcel4マクロ(だっけ)なら簡単にできるはず。
Excelの関数と同じくVBAから使用することも可能
ヘルプは英語版ならMSから無料で落とせる。

416:デフォルトの名無しさん
07/07/18 20:29:52
とりあえずサンプル見つけたので>Excel4マクロ

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

URLリンク(oshiete1.goo.ne.jp)

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

因みにExecuteExcel4Macroを使ってセルの値を取得する方法は
かなり有名で解説サイトはいっぱいあるから英語版ヘルプなんて必要無いが
空セルを取得すると空文字やEmpty値ではなく0が返ってくるという不都合がある。
つまり、数値の0が入ってるセルと何も入ってないセルを区別出来ない。

418:デフォルトの名無しさん
07/07/18 22:05:36
皆さん、MSOfficeのスキル高そうですけど、関係する資格などはお持ちですか?

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

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

スキルを保有するのはいいが、ヘタに見せると悪影響があるなんて、初めて知った2007年の夏でした。

419:デフォルトの名無しさん
07/07/18 22:11:08
>>417
> この方法では嫌なんだとさ。

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

>または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
これが嫌なんだろう

420:デフォルトの名無しさん
07/07/19 00:00:30
VBAで配列の宣言時に初期化ってできないのですか?
下のようにできると聞いたのですが、実際やってみると「=」が駄目なのか
コンパイルエラーになってしまいます。

Dim Moji() As String = {"ABC", "DEF", "GHI"}

421:デフォルトの名無しさん
07/07/19 00:37:15
VBならできるけどVBAは駄目です

422:デフォルトの名無しさん
07/07/19 11:03:09
そんなことはない

423:デフォルトの名無しさん
07/07/19 11:06:18
正確にはVBの2002以降ね
VBでもVB6では出来ないし、当然VB6準拠のVBAでも出来ない

VB6で出来ることはコントロールと特殊なオブジェクト絡み以外ほとんどVBAでも出来るから問題ないが
VB2002で大きく変わったので、VB2002以降用の解説読んでそれをVB6やVBAでやろうとして
出来なくて混乱しちゃう奴って結構居るみたいだね

424:デフォルトの名無しさん
07/07/19 11:13:42
Dim Moji() As Array("ABC", "DEF", "GHI")

425:デフォルトの名無しさん[
07/07/19 21:44:55
VB6でもArray使えば、配列の初期化できるのか。でも、多次元は無理なのかな

426:デフォルトの名無しさん
07/07/19 22:25:34
VBAでSub プロシージャでは値渡しも参照渡しもできるのですが
Func プロシージャでは値渡ししかできません。参照渡しのやり方ってどうやるのでしょうか。

427:デフォルトの名無しさん
07/07/19 23:29:02
ByVal?

428:デフォルトの名無しさん
07/07/19 23:29:40
ごめんちがた

429:デフォルトの名無しさん
07/07/20 00:00:33
>>426
普通にできるだろ

430:426
07/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:デフォルトの名無しさん
07/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




432:426
07/07/20 00:45:38
>431氏の通りにしたらできました。
式にしないと駄目ということなんですかね。


433:デフォルトの名無しさん
07/07/20 00:46:22
func1 tmp

434:429
07/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:デフォルトの名無しさん
07/07/20 01:12:19
回答ありがとうございます。
VB独特の仕様なんで覚えるしかないみたいですね。
また間違えそう・・・



436:デフォルトの名無しさん
07/07/20 01:20:28
func(tmp)
func (tmp)
とは違うだろ
下はc=func((tmp))
のようなもの
上のような書き方は存在しない

437:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/20 06:55:09
つまり、外せる括弧は外せと言うことだな。

439:デフォルトの名無しさん
07/07/20 17:44:58
func1 -tmp
としたら誰もtmpで値が受け取れるとは思わないだろ
同じことだよ

440:デフォルトの名無しさん
07/07/21 18:13:02
つまり、外せる演算子は外せと言うことだな。

441:デフォルトの名無しさん
07/07/22 01:49:28
エクセルの処理を一瞬だけ止める命令ってどんなのがありますか?
調べたところ、waitを使って、現在時間を調べてそこから1秒待ちをする、などは分ったのですが、
私がやりたいのは、コンマ1秒だけ処理を止めるというものをやりたいんです。

ですが、いまいちコンマ何秒だけ処理を一時停止させるという方法が分かりません。
初歩的な質問で申し訳ないのですが、教えていただけないでしょうか。

442:デフォルトの名無しさん
07/07/22 02:44:42
>>441
Win32APIのSleep使えばいいだけだよ
㍉秒指定なので、コンマ1秒なら100㍉秒指定で

443:441
07/07/22 07:24:57
解決しました。ありがとうございます。

444:デフォルトの名無しさん
07/07/22 12:21:00
444

445:初心者☆
07/07/22 16:04:23
DataAdd関数のところで
「コンパイルエラー:
SubまたはFunctionが定義されておりません」
と出るのですが、なぜエラーになるのかがわかりません。
わかる方おしえてください。
ちなみに、
DataAdd("d", data_length, Now)
みたいなカンジで使ってます。

446:デフォルトの名無しさん
07/07/22 16:50:00
そんな関数あるのか?

447:デフォルトの名無しさん
07/07/22 16:56:25
>>445
クリティカルで答えを言ってやる。おまいさんが参考している本が分かった

DataAdd ×
DateAdd ○

こういうこった

448:デフォルトの名無しさん
07/07/22 17:10:15
教えて下さい。

10品目 月の入荷から各個人に日々の払い出しを行い。
入荷数から払い出しを引いた在庫数がわかるようなマクロはどうすればいいでしょうか?
シートを分けたいです。

449:デフォルトの名無しさん
07/07/22 19:24:12
エスパーじゃない普通の人間に判るように書け。

450:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/23 19:12:45
>>450
ここはVBAでやりたい人の為のスレだよ
まあExcelの本スレにも書かれている通り、関数では値の書き換えは出来ないので
どっちにしろVBAでやるしかないけどね

452:デフォルトの名無しさん
07/07/23 20:51:08
このスレ初めて見つけたときエクセルとVBAの質問スレだと思った。
スレタイいじったほうがいいんじゃないスかね

453:デフォルトの名無しさん
07/07/23 20:58:14
板見りゃわかるっちゃわかるけど、スレタイだけ見るとそうだね。

454:デフォルトの名無しさん
07/07/23 21:53:41
まあExcelでプログラム技術系の話と言ったらVBAしか無いもんな

455:デフォルトの名無しさん[
07/07/23 22:05:50
バイナリファイルを作るマクロ作成したんですが
常に新規作成で作ることできますか?
Open "ファイル名" For Binary As #1
↑こんな感じで最初やってみたんですが、新規ファイルがある場合でも
単純に頭から上書きするみたいで困っています。


456:デフォルトの名無しさん
07/07/23 22:49:33
kill

457:デフォルトの名無しさん
07/07/23 23:12:51
>>454
いやいやExcelとプログラムを絡めるだけなら、
オートメーションで他言語から操作するなんてこともあるぞ。

まあその言語特有の事情を除けば、VBAでやるのと何も変わらないが。

458:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/23 23:53:34
そのフォームをいい時と悪いときでエクスポートして比べてみたらいいんじゃ

460:458
07/07/24 00:24:55
エクスポートして比べてみたけど、同じでした。。

461:デフォルトの名無しさん
07/07/24 07:16:30
最小限の再現出来るソースを出せ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch