To solve this optimization problem, we first need to define the variables and the objective function symbolically. Then, we will translate these into Gurobi code.

The symbolic representation of the problem is as follows:
```json
{
  'sym_variables': [('x1', 'bananas'), ('x2', 'granola bars')],
  'objective_function': 'maximize 1*x1 + 8*x2',
  'constraints': [
    '14*x1 + 8*x2 >= 38', 
    '11*x1 + 9*x2 >= 145', 
    '-4*x1 + 9*x2 >= 0', 
    '14*x1 + 8*x2 <= 111', 
    '11*x1 + 9*x2 <= 255'
  ]
}
```
This representation captures the essence of the problem: maximizing the value of bananas and granola bars under the given constraints.

To solve this problem using Gurobi, we will write Python code that defines these variables, sets up the objective function, and adds the constraints as specified. Note that `x1` represents the quantity of bananas, which can be non-integer, and `x2` represents the quantity of granola bars, which must be an integer.

Here is the Gurobi code for this optimization problem:
```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="bananas")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="granola_bars")

# Set the objective function
m.setObjective(1*x1 + 8*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(14*x1 + 8*x2 >= 38, "min_cost")
m.addConstr(11*x1 + 9*x2 >= 145, "min_healthiness")
m.addConstr(-4*x1 + 9*x2 >= 0, "balance_constraint")
m.addConstr(14*x1 + 8*x2 <= 111, "max_cost")
m.addConstr(11*x1 + 9*x2 <= 255, "max_healthiness")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Bananas: {x1.x}")
    print(f"Granola Bars: {x2.x}")
    print(f"Objective Function Value: {m.objVal}")
else:
    print("No optimal solution found")
```