Here's the formulation of the problem and the Gurobi code to solve it:

**Decision Variables:**

* `m`: Number of microwaves bought and sold.
* `v`: Number of vents bought and sold.

**Objective Function:**

Maximize profit: `200m + 300v`

**Constraints:**

* **Budget:** `300m + 400v <= 20000`
* **Microwave Sales Limits:** `30 <= m <= 65`
* **Vent Sales Limit:** `v <= (1/3)m`
* **Non-negativity:** `m, v >= 0`  (Implicit in Gurobi for integer variables)
* **Integer Constraint:** `m, v` are integers


```python
import gurobipy as gp
from gurobipy import GRB

# Create a new model
model = gp.Model("Appliance_Profit")

# Create decision variables
m = model.addVar(vtype=GRB.INTEGER, name="microwaves")
v = model.addVar(vtype=GRB.INTEGER, name="vents")

# Set objective function
model.setObjective(200*m + 300*v, GRB.MAXIMIZE)

# Add constraints
model.addConstr(300*m + 400*v <= 20000, "budget")
model.addConstr(m >= 30, "min_microwaves")
model.addConstr(m <= 65, "max_microwaves")
model.addConstr(v <= (1/3)*m, "vent_limit")


# Optimize model
model.optimize()

# Print results
if model.status == GRB.OPTIMAL:
    print(f"Optimal Profit: ${model.objVal}")
    print(f"Number of Microwaves: {m.x}")
    print(f"Number of Vents: {v.x}")
elif model.status == GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {model.status}")

```
