cobol言語のスクールにかよっていますがわからないのでおしえてください。

素数判定プログラムなのですが(ある数が割り切れたとき、素数ではない
割り切れなければ素数)

途中から

PERFOM KEISAN UNTIL OWARI = "N".
DISPLAY SPACE.
STOP RUN.
KEISAN.
MOVE SPACE TO H-ATAI.
ACCEPT H-ATAI AT 0436.
MOVE H-ATAI TO ATAI.
PERFORM KEISAN2 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
<==ここに1回でも割り切れたとき
DISPLAY KOTAE AT 0535.    判定する言語をおしえて
ACCEPT OWARI AT 1045.     この文だと全部「素数」と、
KEISAN2.            出てしまうのですが。
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE "素数ではありません" TO KOTAE
ELSE
MOVE "素数です"TO KOTAT.

お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

こんにちは。



勝手に解釈しました。

変数[N]により[PERFORM]を抜ける仕様となると[KEISAN2]
で[ATAI]が素数であるかどうかは[KOTAE]を判定するしか
ないですね。
従って[PERFORM KEISAN2・・・]と[PERFORM KEISAN3・・・]の間
に[IF]文が必要となることは分かりますね?
[KEISAN3]では[ATAI]に一番近い素数を求めるようにすれ
ば良いのですが、[PERFORM]の入れ子を使う必要があると
思います。([PERFORM]の中に[PERFORM]を入れる)

例えば[ATAI]が10の時を考えましょう。
[KEISAN2]では[N]が[2]の時[AMARI]が[0]になるので、こ
の時点で[KEISAN2]は終了します。
同時に[KOTAE]には[素数ではありません]が入ります。
ここまでは良いでしょうか?
[KOTAE]が[素数ではありません]の時に[ATAI -1]から
[-1]づつ小さくする[PERFORM]文を作ります。
(要は9からスタートして3より小さくなるまで)
---------------------------------------------------
PERFORM KEISAN3 VARYING N FROM ATAI - 1 BY - 1
UNTIL N < 3
---------------------------------------------------
後は[N]が素数か判定する[PERFOM]を作り[N]が素数である
時に[PERFORM KEISAN3]を抜けるようにすれば良いと思い
ます。

多分、今回の設問のポイントはここだと思います。
[PERFORM KEISAN3・・・]を前回の設問のように[2]から[+1]
づつ大きくすると[ATAI -1]まで必ず素数かどうなのか
判定しないといけないけど[ATAI -1]から[-1]づつ小さく
していくと始めに現れた素数が[ATAI]に一番近い素数に
なるはずですよ。

ヒントはここまで、出力の仕様が分からないので・・・
後はご自身でコーディングをしてみて下さい。
(お勉強!お勉強!)
分からなければ補足して下さい。

ここからは蛇足・・・
σ(^^)もprof_usagiさん同様に[N]に値を代入して[PERFORM]
を抜けるやり方はあまりお勧めしません。
実務経験上、他人の作ったプログラムで同様のことをしている
時、プログラムが追いにくいからです。
まぁ、今回はスクールなので他人のプログラムを修正するわけ
でもないので良いのでしょうが、もし実務で同様の事例が発生
した時は使用しない方が良いですよ。

それと[END-IF][END-PERFORM][SECTION]は使用してはいけない
のでしょうか?使えるととっても助かるのですが・・・
    • good
    • 0

 文章と、コーディングの内容が違うので、どちらに解釈すれば良いのか、教えて下さい。



 今のコーディングでは、KEISAN2は意味の無いものになります。必ず、KEISAN3を通りますからね。

 本当は、どっち?

 それとも、また勝手に解釈して作っても良いのかな?

 あと、話は違いますが、あなたの先生の回答に有る、PERFORMの変数に、判定式に引っかかる数を転送して強制的に抜ける方法ですが、処理系によっては、やってはいけない場合がありますので、良い方法ではありません。
    • good
    • 0

再登場のpaz777です。


ごめんなさい、とっても不親切でしたね。
お詫びのしるしに1つだけ回答します。
(雛形は#3 prof_usagiさんの回答を参考にしました。)
・新しい変数を使用する方法。
------------------------------------------------------------
PERFOM KEISAN UNTIL  OWARI = "N".
DISPLAY SPACE.
STOP  RUN.

KEISAN.
MOVE  SPACE TO H-ATAI.
ACCEPT H-ATAI AT 0436.
MOVE  H-ATAI TO ATAI.
MOVE  ZERO TO SL.
*
* [N]が[ATAI]になるか[SL]が[0]になるまで[KEISAN2]を繰り返す。
*
PERFORM KEISAN2 VARYING N FROM 2 BY 1
UNTIL N > ATAI - 1 OR
        SL = 1.
*
* 1.[SL]が[1]の時は素数ではない
* 2.[SL]が[0]の時は素数
*
IF SL = 1 OR
ATAI < 2
MOVE "素数ではありません" TO KOTAE
ELSE
  MOVE "素数です"      TO KOTAE.
DISPLAY KOTAE AT 0535.
ACCEPT OWARI AT 1045.
 
KEISAN2.
*
* [AMARI]が[0]の時は素数ではないのでPERFORMを抜ける
* ように[SL]に[1]を入れる
*
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE 1 TO SL
ELSE
MOVE ZERO TO SL.
------------------------------------------------------------
机上デバックすると理解できると思います。
例えば[ATAI]が[2]の時[N]は[2]から開始されるので、KEISAN2は実行
されませんよね。そうすると[SL]はZEROのままなので[素数です]と
なります。
次に[ATAI]が[3]の時はどうでしょうか。
同じように[N]は[2]から開始されるので、1回目のKEISAN2が実行され
ます。[ATAI]が[3]で[N]が[2]である時[AMARI]は[1]なので[SL]には
[0]が入ります。PERFORMに戻った時[N]は[3]になるので終わりです。
[SL]は[0]ですので[素数です]となります。
同様に[ATAI]が[4],[5],[6]の場合を確認してみて下さい。

ではでは・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。みなさんのプログラムを参考にスクールに持っていったのですが答えがあまりにもレベルが高くて先生に「自分でつくったものではないね」
と言われました(笑)。
DISPLAY SPACE.
DISPLAY "値を入力" AT 0330.
DISPLAY "[ ]" AT 0435.
DISPLAY "結果"AT 0630.
DISPLAY "続ける=>[ ]"1030.
DISPLAY " 続ける…Y 終了…N" AT 1130.
PERFOM KEISAN UNTIL OWARI = "N".
DISPLAY SPACE.
STOP RUN.
KEISAN.
MOVE SPACE TO H-ATAI.
ACCEPT H-ATAI AT 0436.
MOVE H-ATAI TO ATAI.
PERFORM KEISAN2 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
DISPLAY KOTAE AT 0535.    
ACCEPT OWARI AT 1045.   
KEISAN2.           
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE "素数ではありません" TO KOTAE
MOVE ATAI TO N   <=ここに値を入力することを先生はおしえてくれました。
ELSE          
MOVE "素数です"TO KOTAE.



この文を使ってもう一つ質問です。
「入力した値が素数ではないとき、入力した一番近い素数を検出」
たとえば10を入れると7、6をいれると5、12をいれると11と言った感じ
なのですが、自分の考えではKEISAN2で素数か素数でないかを判定
できたのでPERFORM KEISAN3を作製して

PERFORM KEISAN2 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
PERFORM KEISAN3 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
DISPLAY KOTAE AT 0535.    
ACCEPT OWARI AT 1045.   
KEISAN2.           
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE "素数ではありません" TO KOTAE
MOVE ATAI TO N   
ELSE          
MOVE "素数です"TO KOTAE.
KEISAN3.
DIVIDE ATAI BY GIVING HENSU REMAINDER AMARI.
ここから分かりません。素数ではない数、たとえば10を入力して
8や9がKEISAN3にもどって7は10に一番近い素数なので表示したい
のですが…。
お願いしますこのプログラム文に付き合ってください

お礼日時:2001/03/05 01:44

 では、ご要望にお答えしますね。



PERFOM KEISAN UNTIL  OWARI = "N".
DISPLAY SPACE.
STOP  RUN.

KEISAN.
MOVE  SPACE  TO   H-ATAI.
ACCEPT H-ATAI AT   0436.
MOVE  H-ATAI TO   ATAI.
MOVE  1    TO   AMARI.
PERFORM KEISAN2 VARYING N
  FROM 2 BY 1 UNTIL N > ATAI - 1
           OR AMARI = 0.
IF   AMARI  =  0  OR
    ATAI  <  3
    MOVE "素数ではありません" TO KOTAE
 ELSE
    MOVE "素数です"      TO KOTAE.
DISPLAY KOTAE AT 0535.
ACCEPT OWARI AT 1045.
 
KEISAN2.
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.

今度は、わかりますよね?
何が違うのか、理解してください。
もちろん、スペースの取り方じゃないですよ。
等幅フォントじゃないと、見にくくなってしまいますね。
--------------------------------------------------
 この下は、参考です。理由は、処理系(コンパイラ)に依存するからです。

PERFORM UNTIL  OWARI  =  "N"
  MOVE  SPACE  TO   H-ATAI
  ACCEPT H-ATAI AT   0436
  MOVE  H-ATAI TO   ATAI
  MOVE  1    TO   AMARI
  PERFORM VARYING N
    FROM 2 BY 1 UNTIL N > ATAI - 1
            OR AMARI  =  0
    DIVIDE ATAI  BY N  GIVING HENSU
      REMAINDER  AMARI
    END-PERFORM
  IF   AMARI  =  0  OR
      ATAI  <  3
      MOVE "素数ではありません" TO KOTAE
   ELSE
      MOVE "素数です"      TO KOTAE
   END-IF
  DISPLAY KOTAE  AT 0535
  ACCEPT OWARI  AT 1045
  END-PERFORM.
DISPLAY SPACE.
STOP  RUN.

質問者の使用している処理系の内容がわからないので、この記述方法が使用できるかどうかわかりませんが、書いてみました。

 それと、この場を借りまして、
paz777さんへ。
 はっきり言って、徹夜明けに返答してますので、知恵が回りません。よって、気にしないです。その証拠に、素数がいくつから始まるのかどうか忘れました。
    • good
    • 0
この回答へのお礼

ありがとうございます。みなさんのプログラムを参考にスクールに持っていったので
すが答えがあまりにもレベルが高くて先生に「自分でつくったものではないね」
と言われました(笑)。
DISPLAY SPACE.
DISPLAY "値を入力" AT 0330.
DISPLAY "[ ]" AT 0435.
DISPLAY "結果"AT 0630.
DISPLAY "続ける=>[ ]"1030.
DISPLAY " 続ける…Y 終了…N" AT 1130.
PERFOM KEISAN UNTIL OWARI = "N".
DISPLAY SPACE.
STOP RUN.
KEISAN.
MOVE SPACE TO H-ATAI.
ACCEPT H-ATAI AT 0436.
MOVE H-ATAI TO ATAI.
PERFORM KEISAN2 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
DISPLAY KOTAE AT 0535.    
ACCEPT OWARI AT 1045.   
KEISAN2.           
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE "素数ではありません" TO KOTAE
MOVE ATAI TO N   <=ここに値を入力することを先生はおしえてくれました。
ELSE          
MOVE "素数です"TO KOTAE.



この文を使ってもう一つ質問です。
「入力した値が素数ではないとき、入力した一番近い素数を検出」
たとえば10を入れると7、6をいれると5、12をいれると11と言った感じ
なのですが、自分の考えではKEISAN2で素数か素数でないかを判定
できたのでPERFORM KEISAN3を作製して

PERFORM KEISAN2 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
PERFORM KEISAN3 VARYING N
FROM 2 BY 1 UNTIL N > ATAI - 1.
DISPLAY KOTAE AT 0535.    
ACCEPT OWARI AT 1045.   
KEISAN2.           
DIVIDE ATAI BY N GIVING HENSU REMAINDER AMARI.
IF AMARI = 0
MOVE "素数ではありません" TO KOTAE
MOVE ATAI TO N   
ELSE          
MOVE "素数です"TO KOTAE.
KEISAN3.
DIVIDE ATAI BY GIVING HENSU REMAINDER AMARI.
ここから分かりません。素数ではない数、たとえば10を入力して
8や9がKEISAN3にもどって7は10に一番近い素数なので表示したい
のですが…。
お願いしますこのプログラム文に付き合ってください

お礼日時:2001/03/05 01:45

こんにちは。



prof_usagiさんの言われている通りPERFORMが最後まで
(ATAI - 1)回ってしまいます。

prof_usagiさんの言われている方法以外にも
1.新しい変数を使用する方法
2.変数[N]を流用する方法
3.変数[KOTAE]を判定する方法
など色々とあります。
(prof_usagiさん、気を悪くしないで下さいね。)

それと素朴な疑問として、このプログラムでは0436から
取得したデータが0,1,2の時は計算できませんが良いので
しょうか?
ちょっと気になったので・・・

ではでは・・・
    • good
    • 0
この回答へのお礼

paz777さん

ありがとうございました。まだスクールに入って日が浅いのでpazさんの
答えがわかりませんでしたがこれから参考にさせていただきます。

プログラムって作成する人によっていろいろ方法がありますね。
また質問の時はアドバイスお願いします。

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

お礼日時:2001/02/27 01:32

 一番最後の行は、たぶんタイプミスだと思いますので、無視するとします。



 このフローは、あなたが作成されたのでしょうか?
 言語以前に、このフローチャート自体に問題が有ります。それは何かと言うと、必ず、(ATAI - 1)の数になるまでPERFORMの中から抜けられませんね。だから、「素数です」と言う結果が表示されます。

 では、ヒント?です。

 KEISAN2のPERFORMの前にAMARIにゼロ以外の数を転送し、ATAI - 1の後ろのピリオドを取り、AMARIがゼロかどうか比較し、どちらかの条件を満たしたときに抜けるようにすれば良い訳ですね。

 これでできますね。

 おまけ。 最後の4行は、この位置でなくても良いのですが、わかりますか?
    • good
    • 0
この回答へのお礼

返答ありがとうございます。まだスクールに通って少ししかたっていないので
自分でつくったプログラムです、問題あるみたいですね。

ヒントを読んだんですけどいまいちわかりませんでした。

もう少し分かりやすくおしえてください。

最後の四行はプログラムのながれではどこにあるとよいですか?

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

お礼日時:2001/02/26 12:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフローチャートの使い方

フローチャートの記号の意味にとらわれず、ビジュアルに訴えるのであれば、フローチャート記号を使ってもいいのでしょうか?プレゼンテーションでフローチャートを書き、説明しようと思っていますが、JISで解釈すると、プログラミングに使用するばかりで、作業の経年経過を説明するには、向いていないようです。そもそも、経年経過をフローチャートで書くことは無理なのでしょうか?

Aベストアンサー

プログラミング用のフローチャートは、普通の人にはかえって理解しづらいと思います。
プレゼン用のフローチャートを書くのであれば、フローチャート風でもいいと思いますから、ルール通りよりも分かりやすさを優先してアレンジした方が良いと思います。

QATコマンドについて ATS7

ATコマンドについて
ノートPC内蔵モデムを使って"ATD117"で時報に発信し
ますが数十秒で切断されます。時報の音声は聞こえて
いるので接続した状態と思ってましたが、どうもATS7
のタイマーで切断されているみたいです。実際ATS7の
タイマー値を変更すると通話時間が長くなったりしま
した。

ATS7は相手の応答待ちとあるサイトでかかれてましが、
こちらで対応するすべはないのでしょうか?

Windowsのdialer.exeでは数十秒で切れたりしないので
何か手段があるようの思いますがどなたか教えてください。

Aベストアンサー

>人間相手ですが、相手の電話に着信してオフフックの
>状態にした場合でも、数十秒で切断されることが理解
>できません。

電話に出た人が、ピーッガーピーッビョンビョン・・といったモデムが発するべき信号を出さないので、
回線接続後のネゴが制限時間内に完了せず、切断するのでしょう。

>PCからの音声は流せないという認識であってますでしょうか?

ボイスモデムでない場合は、そうなります。(機能がないから出来ない)
FAXモデムでなければ、FAX送受信できないのと同じです。

回線を切断されたくないだけであれば、
atd117;
というように、最後にセミコロンを付加してみてください。
相手が出ようが出まいがお構いなしにモデムはダイアリングだけして、atコマンドモードに復帰します。
(のハズです。手元にATコマンド表がないので記憶で回答しています)
回線を切りたいときは、athでいつでも切れます。
回線の状態と関係無しに、モデムが動作します。

これを使うと普通のモデムでも、オートダイアラ代わり程度のことはできます。

>人間相手ですが、相手の電話に着信してオフフックの
>状態にした場合でも、数十秒で切断されることが理解
>できません。

電話に出た人が、ピーッガーピーッビョンビョン・・といったモデムが発するべき信号を出さないので、
回線接続後のネゴが制限時間内に完了せず、切断するのでしょう。

>PCからの音声は流せないという認識であってますでしょうか?

ボイスモデムでない場合は、そうなります。(機能がないから出来ない)
FAXモデムでなければ、FAX送受信できないのと同じです。

回線を切断さ...続きを読む

Qフローチャートについて

プログラミングをするとき、フローチャートを書くのが一般的だと聞きました。
私は趣味でプログラミングをしているのですが、フローチャートを書くことに挑戦してみようと考えています。

そこで、フローチャートを学習したいのですが、
「JISフローチャート」
「構造化チャート」
こういった種類のフローチャートでいいのでしょうか?

Aベストアンサー

フローチャートは今はあまり使われていません。制御系やアルゴリズムなどを整理・説明するときには役に立ちますが昨今のプログラム(GUI系や関数やAPIを多用するアプリやCなどの構造化言語)ではあまり役に立たないと言われています。それよりもプログラムの仕様書や関数の仕様書を書いた方が良いです。

制御系で数百行ぐらいのアセンブラのプログラムをまとめるときや関数の説明をするような時に使います。結局フローチャートは人に見せるものなので、誰が見ても有る程度解る様に書くことですが。

Qpascalで、たとえば、変数nを実数として、「writeln(n:2

pascalで、たとえば、変数nを実数として、「writeln(n:2:3)」とかいたときに、「3」は小数点以下の桁数らしいですが、「2」はどういう意味なのですか?
自分で調べてみたところ、全体の桁数だとか、指数で表示させないためだとかとあったのですが、いまいちよくわかりません。

Aベストアンサー

nの次の引数は、桁数というより、編集エリアの領域長さと言う方が良いみたいで
nが実数のとき、整数部の桁数と小数点以下桁数と小数点の1桁を合計したものより大きい場合のみ意味を持つようですね。
長い領域に、数値を右詰表示にしたいときに使うようです。
ちなみにこの表記方法は実際のプログラミングでは、あまり使わないし
どちらかというと、Format関数に頼るほうがほとんどではないでしょうか。

QISO9000 2000年版 プロセスフローチャートについて教えてください

ISO9000:2000の品質マニュアルを作成しています。規格の要求事項の中に‘プロセスの順序及び相互関係を明確にする‘と有りますが、この方法として
プロセスフローチャートを作って対応する、と参考書にはよく出ています。しかしながら、言ってる事は良くわかるのですがフローチャート図そのものを例として解説している資料がなかなか有りません。プロセスフローチャートの作り方のアドバイス、又は具体的にプロセスフローチャート図を用いて解説してくれているネット上のサイトがあれば教えてください。

Aベストアンサー

tkuzooさん、はじめまして。

現在、ISO9001・1994年版から2000年版への移行期間中の会社に勤める者です。

プロセスフローチャートの作り方として、2000年版の特徴としてあげられている
PDCAを使って継続的に改善することが重要かと思われますが、以下のサイトは
如何でしょうか?

http://www.jaco.co.jp/2000taio2.htm

http://www.technofer.co.jp/body_manual.html

http://www.ecology.or.jp/isoworld/iso9000/iso9000.htm

参考URL:http://www.jaco.co.jp/2000taio2.htm

QExcel VBA のDo Until Loopについて

こんばんは
Excel VBAの初心者です。
Do Until Loopを使って
B列の値が変わるところ(下記の表だと、空白からコスモスに変わる、4行目。コスモスからチューリップに変わる6行目。チューリップから菊に変わる8行目。)に行を挿入させたいと思い、下記のマクロを組んだのですが、Do Until Loopが理解できませんでした。
どうしたら良いのか教えて頂けないでしょうか。
宜しくお願い致します。

Excelのシート
B1  項目
B2  空白
B3  空白
B4  コスモス
B5  コスモス
B6  チューリップ
B7  チューリップ
B8  菊

Sub 行の挿入()

Dim y As String

Cells(2, 2).Select

y = Cells(2, 2).Value

Do Until Cells(2, 2).Value <> y

ActiveCell.Offset(1).Select
Selection.EntireRow.Select
Selection.Insert shift:=xlDown
Loop

End Sub

こんばんは
Excel VBAの初心者です。
Do Until Loopを使って
B列の値が変わるところ(下記の表だと、空白からコスモスに変わる、4行目。コスモスからチューリップに変わる6行目。チューリップから菊に変わる8行目。)に行を挿入させたいと思い、下記のマクロを組んだのですが、Do Until Loopが理解できませんでした。
どうしたら良いのか教えて頂けないでしょうか。
宜しくお願い致します。

Excelのシート
B1  項目
B2  空白
B3  空白
B4  コスモス
B5  コスモス
B6  チューリップ
B7...続きを読む

Aベストアンサー

まず全体を処理するLoopが必要
そのloopのなかでキーをセットしキーが変わるまでというloop
キーが変わったところで(loopの次の行)で挿入処理

>Do Until Cells(2, 2).Value <> y
Cells(2, 2)も yもLoopの中で変化しないので何時までも終わらない
offsetは記述が長くなるので不適
VBAのコードの中では範囲をselectする必要はない場合が多い。

Sub 行の挿入()
Dim i As Long
Dim y As String
i = 2
Do Until Cells(i, 2) = ""
  y = Cells(i, 2).Value
  Do Until Cells(i, 2).Value <> y
    i = i + 1
  Loop
  Cells(i, 2).EntireRow.Insert shift:=xlDown
  i = i + 1
Loop
End Sub

Qフローチャートを書く書かない

 元ハード屋です。
先日ASIC設計(半導体設計)の方との話で驚いたことがあります。その方はC言語を使いフローチャートは書かずにいきなりコーデングするそうです。
装置物(マイコンでの制御)の設計を10年位前にしていましたが、その時一緒に仕事をしてましたソフト屋さんはたしかC言語を使い、そして沢山のフローチャートを書いていました。
最近はC言語ではフローチャートを書かないのでしょうか。また言語(FORTRAN、COBOL、BASIC、、、)或いはやる内容により差があるのでしょうか。私はプログラマーでは有りませんが最近Visual Basicで割合大きなプログラムを組みましたが、その時はフローチャートを書きました。あとで変更する時フローチャートが無いと困るだろうと感じています。

Aベストアンサー

頭の中で整理できたり、小規模なモノ、動作させながら仕組みが変わる可能性が
ある場合はフローチャートを書かずにすぐに打ち込みするのではないでしょうか?

比較的小さいものはフローチャートを書かずに組ながら考えます。
出来上がってからちゃんとしたフォローチャートを残しますけど。
(プログラムを入力するのは面倒ではなくてもフローチャートを書くのは面倒
という人もいますので。)

Qftp処理でmove(移動)を行いたい

バッチ処理でデータをftp受信しています。
---------------------------
ユーザ名
パスワード
prompt
mget abc*.log
mdelete abc*.log
bye
---------------------------
このようなコマンドを行っています。
ftpサーバにはさまざまなファイルが随時生成されます。

この処理では定期的に
abcで始まる全てのログファイルをgetし、
abcで始まる全てのログファイルをdeleteしています。

ところが、abcで始まるファイルの生成がランダムのため、
偶然mgetが終わった後でファイルが生成され、
mdeleteを行うと、getしていないファイルまで削除される恐れがあるのです。

そのため、一件ずつ移動を行いたいのですが、
調べてもmoveのようなコマンドがftpで見当たらないのですが
なにか、moveに置き換わるような処理はないでしょうか?

*windows同士の通信です。

Aベストアンサー

ftpはあくまでファイル転送プロトコルなのでmoveなどは無いです。
こんな感じでバッチファイルで。テストはしていません。

set HOST=ホスト名
set USER=ユーザ名
set PASS=パスワード
echo %USER%>tmp1
echo %PASS%>>tmp1
echo ls abc*.log tmp2>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%
echo %USER%>tmp1
echo %PASS%>>tmp1
for /f %%F in (tmp2) do (echo get %%F&echo delete %%F)>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%

別の方法として、Windowsホストのftpサーバーって使ったこと無いのでわかりませんが、もしかすると

ren abc*.log abc*.tmp
もしくは
quote site ren abc*.log abc*.tmp

が効けば、後は
prompt
mget abc*.tmp
mdelete abc*.tmp
受信後に、ren abc*.tmp abc*.log で名前を戻す。

ftpはあくまでファイル転送プロトコルなのでmoveなどは無いです。
こんな感じでバッチファイルで。テストはしていません。

set HOST=ホスト名
set USER=ユーザ名
set PASS=パスワード
echo %USER%>tmp1
echo %PASS%>>tmp1
echo ls abc*.log tmp2>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%
echo %USER%>tmp1
echo %PASS%>>tmp1
for /f %%F in (tmp2) do (echo get %%F&echo delete %%F)>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%

別の方法として、Windowsホストのftpサーバーって使ったこと無...続きを読む

Qワード論文にフローチャート

ワード論文にフローチャートの図をいれようとしている者です。
エクセルでまず作ってから、コピーして貼り付ける方式でワード論文の作表はいつもしています。
しかし、貼り付けると、フローチャートの中の文章の改行がずれたりします。
論文に合うように縮小されたりするからでしょうか。
どうすれば、きれいにフローチャートの中の文章を改行でずれたりしないようにワード論文に貼り付けることができるでしょうか。

Aベストアンサー

> ワード論文にフローチャートの図をいれようとしている者です。
> エクセルでまず作ってから、コピーして貼り付ける方式でワード論文の作表はいつもしています。
> しかし、貼り付けると、フローチャートの中の文章の改行がずれたりします。
> 論文に合うように縮小されたりするからでしょうか。

はい。行に収まるように貼り付けされますので、行に収まる幅でないと縮小される結果、文字が折り返されて表示されます。

対策(案-1)
論文に貼り付けしたフローチャートを編集する必要がなければ、Wordに貼り付ける際、「形式を選択して貼り付け」から「図(拡張メタファイル)」や「図(PNG)」を選択しますと、画像のフローチャートが貼り付けされますので、「行」がずれるようなことはありません。

対策(案-2)
テキストが挿入されている図形を右クリックして「図形の書式設定」を選択し、「テキストボックス」の「自動調整」欄の「テキストを図形からはみ出して表示する」にチェックを入れ、「内部の余白」欄の「図形内のテキストを折り返す」のチェックを外します。
このように設定しますと、Wordに貼り付けして「フローチャート」が縮小されても、文字が折り返されることはありません。
(Office 2010の場合)

> ワード論文にフローチャートの図をいれようとしている者です。
> エクセルでまず作ってから、コピーして貼り付ける方式でワード論文の作表はいつもしています。
> しかし、貼り付けると、フローチャートの中の文章の改行がずれたりします。
> 論文に合うように縮小されたりするからでしょうか。

はい。行に収まるように貼り付けされますので、行に収まる幅でないと縮小される結果、文字が折り返されて表示されます。

対策(案-1)
論文に貼り付けしたフローチャートを編集する必要がなければ、Wordに貼り付け...続きを読む

QVBA Do Until内で値の貼り付けができない

Excel2003を使用しております。

コピー&値のペースト作業をやってくれるマクロを作成しております。
具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、
D27がすでに値があれば、D28に書くことを、D37までループするようにしております。
しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。


Sub Ns公()
Dim work As Range
Set work = Selection
If Selection.Value = "公" Then
ActiveCell.Offset(0, -3).Select
Selection.Copy
Do Until Range("D37").Select
Range("D27").Select
If Selection.Value = "" Then
Selection.PasteSpecial paste:=xlPasteValues
work.Select
Else
ActiveCell.Offset(1).Select
End If
Loop
If Range("D36").Value <> "" Then
Do Until Range("I37").Select
Range("I27").Select
If Selection.Value = "" Then
Selection.PasteSpecial paste:=xlPasteValues
work.Select
Else
ActiveCell.Offset(1).Select
End If
Loop
work.Select
End If
work.Select
End If
work.Select
ActiveCell.Offset(1).Select
End Sub

原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

Excel2003を使用しております。

コピー&値のペースト作業をやってくれるマクロを作成しております。
具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、
D27がすでに値があれば、D28に書くことを、D37までループするようにしております。
しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。


Sub Ns公()
Dim work As Range
Set work = Selection
If Selection.Value = "公" Then
ActiveCell.Offset(0,...続きを読む

Aベストアンサー

本当は、「ここをこう直す」と言う感じでアドバイスできればよかったんですが、Selectを多用されているので追いづらくって断念しました。
代わりに、提示された説明とコードから、こういうことがしたいのかなと推測して作ってみました。

Sub Sample()
  Dim nRow As Long
  If Selection.Value = "公" Then
    '値貼り付け位置を確認
    nRow = Range("D38").End(xlUp).Row
    If nRow = 37 Then
      MsgBox ("D37まで書き込み済み")
      Exit Sub
    ElseIf nRow < 27 Then
      nRow = 26
    End If
    '値をD27以下の空セルに代入
    Range("D" & nRow + 1) = ActiveCell.Offset(0, -3).Value
  End If
  '選択セルを一行下げる(元から入っているので残しました)
  ActiveCell.Offset(1).Select
End Sub

VBAで値のコピーをする場合、いちいちSelectする必要はありません。
まずはSelection.CopyとSelection.Pasteを使わないコードを目指しましょう。

本当は、「ここをこう直す」と言う感じでアドバイスできればよかったんですが、Selectを多用されているので追いづらくって断念しました。
代わりに、提示された説明とコードから、こういうことがしたいのかなと推測して作ってみました。

Sub Sample()
  Dim nRow As Long
  If Selection.Value = "公" Then
    '値貼り付け位置を確認
    nRow = Range("D38").End(xlUp).Row
    If nRow = 37 Then
      MsgBox ("D37まで書き込み済み")
      Exit Sub
    ElseIf nRow < 27 ...続きを読む


人気Q&Aランキング